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:
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!