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=]{2})([[:digit:]]{2})([[:digit:]]{4}) ([[:digit:]]{4})', '(\1) \2-\3-\4') ); dbms_output.put_line( 'Modifica =>' || regexp_replace( celular_A, '([[:alpha:]]{2})([[:digit:]]{2})([[:digit:]]{4}) ([[:digit:]]{4})', '(\1) \2-\3-\4') ); dbms_output.put_line( 'Modifica =>' || regexp_replace( celular_B, '([[:digit:]]{2})\.([[:digit:]]{4})\.([[:digit:]]{4})', '\1-\2-\3' ) ); dbms_output.put_line( 'Não faz nada =>' || regexp_replace( celular_B, '([[:digit:]]{2})\-([[:digit:]]{4})\-([[:digit:]]{4})', '\1-\2-\3' ) ); dbms_output.put_line( 'Modifica =>' || regexp_replace( celular_C, '([[:digit:]]{4})\.([[:digit:]]{4})', '\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!