Muitas vezes necessitamos enviar aplicações de PL/SQL para instalação em ambientes externos ao de nossa instalação. O código enviado, de um modo geral, fica exposto e passível de modificações indesejáveis. A rotina Wrapper tem a finalidade de criptografar o código-fonte de tal forma que somente o Oracle tenha condições de ler e compilar o texto gerado.

Tem como Características:

  • Converte o código-fonte de PL/SQL em uma forma intermediária de código-objeto.
  • Código-objeto gerado é portável como se fosse o próprio fonte.
  • O compilador PL/SQL reconhece e carrega o código gerado pelo Wrapper automaticamente.

Tem como Vantagens:

  • Impede que o código-fonte seja manuseado por outros desenvolvedores;
  • Independência de plataforma, já que se trata de uma versão de código portável;
  • As referências a variáveis Bind externas são resolvidas a tempo de carga;
  • Os processos de Import / Export normais aceitam arquivos gerados pela rotina Rappel.

Criando o código intermediário:

A rotina Wrapper não é executada pelo banco de dados. É uma rotina externa e deve ser executada no sistema operacional em uso. No caso da instalação em Windows, ela se encontra no diretório <Oracle Home>\bin e se chama Wrap.exe.

Sintaxe Wrapper: wrap iname=<nome fonte>oname=<nome codigo></nome>

Não deve haver espaço nem antes nem depois dos sinais de igual. A extensão default para arquivo de entrada é .SQL e para arquivo de saída é .PLB. Caso o arquivo de saída não seja especificado, será gerado com o mesmo nome do arquivo de entrada, com apenas a diferença de extensão.

Tem como Restrições:

Não podemos passar para a rotina Wrapper um bloco anônimo de PL/SQL.1

Apenas fontes contendo os comandos a seguir podem ser codificadas:

  • create procedure;
  • create function;
  • create package;
  • create package body;

Todos os outros comandos são passados intactos para o arquivo de saída. As linhas com comentários (contendo REM ou --) são removidas do código gerado a menos que estejam incluídas na parte de especificação.

Criação da rotina Master:


            SQL> CREATE OR REPLACE PROCEDURE MASTER IS

            RETORNO      NUMBER;
   
            TEXTO          VARCHAR2(100);
   
              BEGIN
   
            RETORNO := DBMS_PIPE.RECEIVE_MESSAGE( 'Teste',20);
   
            IF RETORNO <> 0 THEN
   
                 RAISEN_APPLICATION_ERROR ( -20002, 'erro na recepção da ' || 'mensagem do Pipe -
   
                                                            '||Retorno);
   
               ELSE
   
            LOOP
   
                 RETORNO := DBMS_PIPE..NEXT_ITEM_TYPE;
   
                      EXIT WHEN RETORNO = 0;
   
                 DBMS_PIPE.UNPACK_MESSAGE(TEXTO);
   
                      DBMS.OUT.PUT_LINE(TEXTO);
   
                  END LOOP;
   
                END IF;
   
              END;
   
              /
              

A rotina acima apresenta o comando a ser passado para a rotina Wrap. Nos parâmetros INAME e ONAME podemos informar o diretório completo onde se acham os programas. No exemplo isto não foi feito pois a execução do comando (no DOS) foi feita dentro do diretório onde se achavam o fonte a ser convertido.

Linha de código da Wrap:

wrap iname=103_205.sql oname=s03_205.plb

Trecho de código da rotina MASTER:


            SQL> CREATE OR REPLACE PROCEDURE MASTER wrapped

         0

         abcd

         abcd 

         abcd 

         abcd 

         ---------------------------------          

              1UNPACK_MESSAGE;    

              1DBMS_OUTPUT;    

         1PUT_LINE;

         0

 

         0

         0

         59

         2

         0 9a b4 55 6a a3 a0 lc

         8l b0 a3 a0 5l0a5 lc 8l

         b0 :3 a0 6b 6e 5l a5 b d

         a0 7e 5l b4 2e 7e

         a0 b4 2e a5 57 b7 :4 a0 6b

         d :2 a0 7e 5l b4 2e 2b a0

 
              

O código torna-se, de um modo geral, maior que o fonte original.

Para maiores detalhes , você pode ler a PL/SQL User's Guide and Reference

para download no endereço