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