Novos Recursos - PL/SQL 10g

O Oracle 10g apresentou novos recursos para linguagem de programação PL/SQL. Nesse artigo serão apresentados esses novos recursos, com devidas críticas.

Novos Recursos - PL/SQL 10g

Melhorias:

Desempenho:

  • Está duas vezes mais rápido que a versão 9i (que era três vezes mais rápido que a versão 8i).
  • O interpretador foi reescrito.
  • Identificação de expressões semelhantes.
  • Parâmetro PLSQL_OPTIMIZE_LEVEL (zero a dois).
  • Quanto maior, mais tempo de compilação e mais rápida execução.

Tipos de Dados:

  • BINARY_FLOAT e BINARY_DOUBLE: para ponto flutuante.
Menos espaço e mais rápido que NUMBER.
  • PLS_INTEGER continua sendo a melhor opção.
Novo intervalo: -2147483648 e 214748364.
LOB elimina o limite de 4GB: depende do SO e da instalação.

Caracteres Literais:

Pode-se utilizar qualquer caractere (q').

Exemplo:

begin

dbms_output.put_line( q'[Imaster's]' );

dbms_output.put_line( q'%Imaster's%' );

end;

/ 

Comando FORALL:

  • Aumenta velocidade por mandar todos comandos DML de uma só vez.
  • Novas cláusulas para prever "buracos" na seqüência:

INDICES OF: valores dos índices das coleções

VALUES OF: atua em uma coleção indexada

1-

declare

TYPE a_Master IS TABLE OF varchar2(20) INDEX BY PLS_INTEGER;

v_Master a_Master;

begin

FOR x IN 1..10 LOOP

  v_Master(x) := 'Item ' || x;

END LOOP;

v_Master.DELETE(3,5);

FORALL x IN v_Master.FIRST..v_Master.LAST

  INSERT INTO Tabela

   VALUES (v_Master(x));

end;

/ 

2-

create table tabela ( modelo varchar2(100) );

declare

TYPE a_Master IS TABLE OF varchar2(20) INDEX BY PLS_INTEGER;

v_Master a_Master;

begin

FOR x IN 1..10 LOOP

  v_Master(x) := 'Item ' || x;

END LOOP;

v_Master.DELETE(3,5);

FORALL x IN INDICES OF v_Master

  INSERT INTO tabela

   VALUES (v_Master(x));

end;

/

SELECT * FROM tabela;

3-

delete from tabela;

declare

TYPE aRel IS TABLE OF pls_integer;

TYPE a_Master IS TABLE OF varchar2(20) INDEX BY PLS_INTEGER;

v_Master a_Master;

vRel aRel:=aRel(1,2);

begin

FOR x IN 1..10 LOOP

  v_Master(x) := 'Item ' || x;

END LOOP;

v_Master.DELETE(3,5);

FORALL x IN VALUES OF vRel

  INSERT INTO tabela

   VALUES (v_Master(x));

end;

/

SELECT * FROM tabela; 

WARNINGs:

  • Até versões anteriores: somente erros de sintaxe e dependência entre objetos.
  • Agora possui níveis de alerta.

ALL: indicará todos os alertas possíveis.

PERFORMANCE: somente alertas relacionados ao desempenho serão mostrados.

INFORMATIONAL: somente alertas relacionados à facilidade de manutenção do código

serão mostrados.

SEVERE: quando há problemas de lógica no código.

Específico:

O desenvolvedor especifica qual erro quer monitorar.

Exemplo:

show parameter plsql_warnings

alter system set plsql_warnings='ENABLE:PERFORMANCE', 'ENABLE:SEVERE';

DROP TABLE tabela;

CREATE TABLE tabela (  codigo NUMBER, modelo VARCHAR2(60) );

CREATE OR REPLACE PROCEDURE teste (n_codigo VARCHAR2, c_modelo VARCHAR2)

IS

BEGIN

  INSERT INTO TEMP (codigo, modelo)

   VALUES (n_codigo, c_modelo);

END;

/ 

Wrap x DBMS_DDL: 

Esconde o código fonte do PL/SQL.

Exemplo:

DECLARE

   ddl VARCHAR2(32767);

BEGIN

   ddl :=       'CREATE OR REPLACE PROCEDURE teste (n_codigo VARCHAR2,

                                                    c_modelo VARCHAR2) ';

   ddl := ddl || 'IS ';

   ddl := ddl || 'BEGIN ';

   ddl := ddl || '  INSERT INTO tabela (codigo, modelo)';

   ddl := ddl || '       VALUES (n_codigo, c_modelo); ';

   ddl := ddl || 'END;';

   EXECUTE IMMEDIATE SYS.DBMS_DDL.WRAP(ddl);

END;

/ 

SELECT * FROM USER_SOURCE

WHERE NAME = 'TESTE'; 

Expressões Regulares:

01. Busca padrões em conteúdos.

02. Exemplos de Utilização:
  • Restrição de conteúdo (CONSTRAINTS)
  • Buscas complexas e mineração de dados.

03. Tipos:

  • REGEXP_REPLACE: busca e substitui um padrão. Utilidade: localizar um padrão
    e efetuar modificações na forma de visualização. Ex.: formatação de telefone.

Exemplo:

declare

celular_A varchar2(25):='xx1112341234';

celular_B varchar2(15):='11.1234.1234';

celular_C varchar2(15):='1234.1234';

begin

dbms_output.put_line( 'Muda    =>' || regexp_replace( celular_A,

                        '([=xx=])([[:digit:]])([[:digit:]])

                         ([[:digit:]])',

                        '(\1) \2-\3-\4') );

dbms_output.put_line( 'Modifica     =>' || regexp_replace( celular_A,

                        '([[:alpha:]])([[:digit:]])([[:digit:]])

                         ([[:digit:]])',

                        '(\1) \2-\3-\4') );

dbms_output.put_line( 'Modifica     =>' || regexp_replace( celular_B,

                        '([[:digit:]])\.([[:digit:]])\.([[:digit:]])',

                        '\1-\2-\3' ) );

dbms_output.put_line( 'Não faz nada =>' || regexp_replace( celular_B,

                        '([[:digit:]])\-([[:digit:]])\-([[:digit:]])',

                        '\1-\2-\3' ) );

dbms_output.put_line( 'Modifica     =>' || regexp_replace( celular_C,

                        '([[:digit:]])\.([[:digit:]])',

                        '\1-\2' ) );

end;

/ 
  • REGEXP_LIKE: retorna se há ou não aderência a um padrão. Utilidade:
    refinar o resultado de uma pesquisa.

Exemplo:

declare

type a_Master is varray(7) of varchar2(10);

v_Master a_Master:=a_Master('estudar', 'estudando', 'estudado', 'estudante' );

begin

for x in 1..4 loop

  if regexp_like( v_Master(x), 'estud((ar)+|(ando)|(ado))' ) then

    dbms_output.put_line( v_Master(x) );

  end if;

end loop;

end;

/ 
  • REGEXP_SUBSTR: indica qual parte da cadeia de caracteres adere ao padrão.

Exemplo:

begin

dbms_output.put_line( regexp_substr( 'O universitario deve ter estudado para realizar 
a prova','estud((ar)+|(ando)|(ado))' ) ); end; /
  • REGEXP_INSTR: retorna se o padrão existe na cadeia de caracteres. Utilidade:
    pesquisas que envolvem padrões, como seqüências de DNA ou de dados astronômicos.

Exemplo:

begin

dbms_output.put_line( regexp_instr(

      'O universitario deve ter estudado e precisa estudar muito para realizar a prova',

      'estud((ar)+|(ando)|(ado))') );

end;

/ 

Compilação Condicional:

1. Permite selecionar parte do código para compilação.

2. Exemplos de utilização.

  • Diferentes releases de software.
  • Funcionalidades adicionais em função da versão do BD.
  • Testes de novas versões de software.
  • Personalização e customização para clientes.

3. Disponibilidade

  • Oracle 9i (9.2.0.6)
  • Oracle 10g (10.1.0.4)

4. Parâmetro:

  • PLSQL_CCFLAGS

5. Pacotes:

  • DBMS_DB_VERSION
  • DBMS_PREPROCESSOR

1

alter session set PLSQL_CCFlags = 'Teste1:true, Teste2:false'; 

CREATE OR REPLACE PROCEDURE TESTE IS

cVAR1 BOOLEAN := $$Teste1;

BEGIN

IF $$Teste2 THEN

   DBMS_OUTPUT.PUT_LINE( 'Variável $$Teste2 é VERDADEIRA' );

ELSE

   DBMS_OUTPUT.PUT_LINE( 'Variável $$Teste2 é FALSA' );

END IF;

END;

/ 

EXEC TESTE 

alter session set PLSQL_CCFlags = 'Teste1:0, Teste2:false'; 

CREATE OR REPLACE PROCEDURE TESTE IS

BEGIN

$IF $$Teste2 $THEN

   DBMS_OUTPUT.PUT_LINE( 'Variável $$Teste2 é VERDADEIRA' );

$ELSE

   DBMS_OUTPUT.PUT_LINE( 'Variável $$Teste2 é FALSA' );

$END

IF $$Teste1 IS NOT NULL THEN

   DBMS_OUTPUT.PUT_LINE( 'Variável $$Teste1 é' || $$Teste1 );

END IF;

END;

/ 

EXEC TESTE 

2

BEGIN

$IF DBMS_DB_VERSION.VER_LE_10_1 $THEN

  $ERROR 'Versão do banco de dados não suporta esta função' $END

$ELSE

  DBMS_OUTPUT.PUT_LINE ('Versão ' || DBMS_DB_VERSION.VERSION || '.' ||

  DBMS_DB_VERSION.RELEASE || ' suporta esta função.');

  COMMIT WRITE IMMEDIATE NOWAIT;

$END

END;

/

3

CALL DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE('PROCEDURE', 'SGI', 'TESTE'); 

Data Mining: 

Oracle 10g R 2 , Pacote: DBMS_PREDICTIVE_ANALYTICS 

Procedimento EXPLAIN: analisa o conjunto de dados para explicar o valor de cada atributo.
Quanto maior o valor, mais forte o relacionamento entre os dados. Código para gerar a explicação: begin DBMS_PREDICTIVE_ANALYTICS.EXPLAIN( DATA_TABLE_NAME => 'PARCELA', EXPLAIN_COLUMN_NAME => 'STPARCELA', RESULT_TABLE_NAME => 'AA_EXPLAIN_RESULTS' ); end; / SELECT * FROM AA_EXPLAIN_RESULTS;

Procedimento PREDICT: retorna um conjunto de valores que permite analisar o grau de confiança na previsão do conjunto de dados.

Código para gerar a previsão:

SET SERVEROUTPUT ON

DECLARE

   v_predict_accuracy NUMBER(30,10);

BEGIN

   DBMS_PREDICTIVE_ANALYTICS.PREDICT (

       ACCURACY            => v_predict_accuracy,

       DATA_TABLE_NAME     => 'PARCELA',

       CASE_ID_COLUMN_NAME => 'CDCONTR',

       TARGET_COLUMN_NAME  => 'STPARCELA',

       RESULT_TABLE_NAME   => 'AA_PREDICT_RESULTS');

   DBMS_OUTPUT.PUT_LINE('*** Accuracy ***');

   DBMS_OUTPUT.PUT_LINE(v_predict_accuracy);

END;

/

*** Accuracy ***

      ,5727376841 

Para maiores detalhes, você pode ler PL/SQL User's Guide and Reference (disponível para download no endereço http://www.oracle.com/pls/db102/homepage).

Por hoje é tudo pessoal. Até o próximo artigo!

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados