Atenção: por essa edição ser muito antiga não há arquivo PDF para download.
Os artigos dessa edição estão disponíveis somente através do formato HTML.

Clique aqui para ler todos os artigos desta edição 

PL/SQL 10g: o que mudou?

 

O PL/SQL é a linguagem de programação padrão do banco de dados Oracle desde a versão 6.0 do produto, lançada em 1991. Ela é altamente integrada ao banco de dados e aos comandos SQL o que facilita o desenvolvimento de módulos estritamentevoltados para a manipulação de dados. Muitos podem argumentar que isso pode ser feito pelo SQL, mas a intenção de criar uma linguagem de programação que estendesse esse padrão e permitisse utilizar estruturas condicionais e de repetição ampliaram a utilização do banco de dados. Ao invés de enviar diversas requisições ao banco de dados e trabalhar cada uma das linhas no front-end, as aplicações podem simplesmente requisitar ao banco de dados que retorne a informação já trabalhada.

Significativos avanços foram feitos a partir da versão 2.3 do PL/SQL (que foi lançada com a versão 7.3 do banco de dados). A partir da versão 8.0 do banco de dados foi iniciado o suporte à orientação a objetos, processo que atingiu um alto nível de aderência a este padrão na versão 10g. Na versão 8.1 (ou 8i) a empresa começou a adotar cada vez mais os padrões do SQL e isso acabou refletindo também no PL/SQL. O Java passou a ser utilizado no banco de dados e apareceu (inicialmente) como concorrente do PL/SQL. Na versão 9i é ampliado o suporte a caracteres internacionais, herança entre objetos, compilação nativa do código PL/SQL em C e acesso a documentos XML.

Muito já se ouviu falar que o PL/SQL estaria cedendo lugar ao Java. Esta sim seria a linguagem de programação oficial do banco de dados Oracle em breve. Contudo, apesar do PL/SQL ser uma linguagem criada para ser procedural, a Oracle tem investido muito para deixá-la com um formato orientado a objeto. Novos pacotes têm sido agregados ao PL/SQL o que permite resolver cada vez mais problemas com o uso da linguagem. Este artigo não pretende sequer iniciar a discussão Java x PL/SQL e sim mostrar o que a Oracle fez nas mais recentes versões da linguagem.

Devido a grande parte das implementações do banco de dados Oracle estar em versões anteriores a atual (10gR2), vou focar este artigo nas principais modificações implementadas pela Oracle na versão 10gR1 e R2. Como o leitor verá, não é uma lista extensa, mas poderá auxiliá-lo em algumas situações do dia-a-dia.

Devo esclarecer que vou me restringir às mudanças relacionadas ao PL/SQL e não à linguagem SQL. Muitas das modificações do SQL acabam tendo reflexo no PL/SQL, mas nem por isso serão citadas neste artigo.

 

Desempenho

 

Com a nova versão do banco de dados, os usuários podem esperar um desempenho pelo menos duas vezes mais rápido do que a versão 9i e três vezes mais rápido que na versão 8i. Note que desde a versão anterior já havia a possibilidade de utilizar a compilação nativa onde o código é convertido para C durante a compilação. Com isso, a execução dos módulos PL/SQL chega a ser 30% mais rápida do que quando o código é interpretado.

Boa parte do interpretador foi reescrita na versão 10g. Com isso, foram otimizados diversos recursos da linguagem. Cálculos desnecessários foram eliminados e tornou-se possível determinar quando duas expressões são semelhantes (ou utilizam o mesmo caminho) ainda que não estejam escritas da mesma forma.

Um novo parâmetro (PLSQL_OPTIMIZE_LEVEL) foi criado para que o usuário escolha o comportamento do compilador. Pode assumir valores de zero, um ou dois (0, 1 ou 2), sendo que zero (0) é o mesmo que deixar como era antes da versão 10g e dois (2) otimizar ao máximo a compilação com natural queda no desempenho durante este processo (compilações mais longas).

 

Tipos de dados

 

Baseado no padrão definido na IEEE 754, a Oracle acrescentou dois novos tipos de dados no PL/SQL 10g: BINARY_ FLOAT e BINARY_DOUBLE. Com isso, as operações que envolvem dados numéricos armazenados em ponto flutuante ocuparão menos espaço e serão executadas mais rapidamente do que se o fosse utilizado o NUMBER (Listagem 1).

Funções numéricas como ABS, CEIL e ACOS, e de agregação, como AVG, MIN e MAX, podem manipular estes novos tipos de dados. No 10gR2, o PLS_INTEGER, que continua sendo a melhor opção para trabalhar com números inteiros, teve o limite aumentado para o intervalo entre -2147483648 e 2147483647.

 

 

Listagem 1. Utilização dos novos tipos de dados: BINARY_FLOAT e BINARY_DOUBLE.

 

declare

   pf32 binary_float;

   pf64 binary_double;

begin

   pf32:= 1.778827456e37;

   pf64:= 2.1416e118;

end;

/

 

Expressões regulares

 

Os fãs das expressões regulares agora podem aplicar este conhecimento para localizar padrões dentro do banco de dados Oracle.

Tendo alcançado muito sucesso em sistemas operacionais como Linux e Unix e em scripts Perl, agora o banco de dados Oracle permite realizar buscas dentro de padrões especificados ou esperados em textos. Um padrão pode se restringir a uma simples estrutura de letras ou conter expressões complexas que envolvem substituição e opcionalidade. Ao agregar estas expressões a colunas do banco de dados, é possível eliminar a complexidade no cliente. Isto se dá através da criação de restrições (constraints) que determina quais padrões podem fazer parte da entrada de dados na coluna.

Há quatro tipos de expressões regulares no Oracle. Note que as funções não estão sendo exploradas em sua totalidade. Para maior detalhamento da sintaxe convém consultar os manuais do produto ou publicações específicas.

 

REGEXP_REPLACE: busca e substitui um padrão.

É particularmente útil quando se quer localizar um Padrão e efetuar modificações na forma de visualização. Um bom exemplo é a formatação de telefone quando armazenado em formato texto. Como é possível armazená-lo de diversas formas, pode-se utilizar esta expressão para definir um padrão de visualização. Com se pode notar na Listagem 2, sempre que for identificado um elemento que atenda ao padrão especificado, a função fará a substituição na formatação;

 

 

Listagem 2. Exemplo de utilização da função REGEXP_REPLACE.

 

declare

   telef1 varchar2(25):=’xx1112341234’;

   telef2 varchar2(15):=’11.1234.1234’;

   telef3 varchar2(15):=’1234.1234’;

begin

      dbms_output.put_line( ‘Modifica =>’ ||

         regexp_replace( telef1,

         ‘([=xx=]{2})([[:digit:]]{2})([[:digit:]]{4})

         ([[:digit:]]{4})’,‘(\1) \2-\3-\4’) );

      dbms_output.put_line( ‘Modifica =>’ ||

         regexp_replace( telef1,

...

Quer ler esse conteúdo completo? Tenha acesso completo