Você está na página 1de 295

Pr ogr ama o em PL/SQL

Est r ut ur a do Cur so
I ntroduo a PL/ SQL
Conceitos Bsicos de PL/ SQL
Variveis e Dados de Programa
Controle Condicional e Sequencial
Loops
Registros em PL/ SQL
Tabelas PL/ SQL
Est r ut ur a do Cur so
SQL em PL/ SQL
Funes de SQL integradas
Cursores
Procedimentos e Funes
Packages
Triggers
Tratamento de Erros
Est r ut ur a do Cur so
Testes e Depurao
PL/ SQL Dinmico
Entrada e Sada em Arquivos
Desempenho e Otimizao
PL/SQL
Procedural Language extensions to SQL.
Usamos esta linguagem no Oracle Server
e em aplicaes-cliente (p.e. Oracle
Forms).
Adiciona construes de programao no
existentes na linguagem de banco de
dados padro.
Permite a combinao de comandos SQL
com construes procedurais.
Ver ses do PL/SQL
Verso 2.0 - Oracle 7.0
Verso 2.1 - Oracle 7.1
Verso 2.2 - Oracle 7.2
Verso 2.3 - Oracle 7.3
Verso 8.0 - Oracle 8.0
Verso 1.1 -
Developer/2000
Verso 8.0 -
Developer 6
Cliente Servidor
Ar qui t et ur a do PL/SQL
Oracle Forms
Gerador
de SQL
Programa
PL/SQL local
PL/SQL V8.0
Runtime Engine
Oracle Server
Processador
de comandos
SQL
Stored Program Unit
PL/SQL V8.0
Runtime Engine
Ambi ent es de Ex ec u o
Servidor
Oracle Oracle 7: PL/ SQL verso 2 7: PL/ SQL verso 2
Oracle Oracle 8: PL/ SQL verso 8 8: PL/ SQL verso 8
SQL* SQL* Plus Plus (modo interativo) (modo interativo)
Cliente
Oracle Developer Oracle Developer ( (Forms Forms, , Reports Reports e e
Procedure Builder Procedure Builder) )
utilizam compiladores PL/ SQL prprios
Conc ei t os Bsi c os da
Li nguagem PL/SQL
Char ac t er Set do PL/SQL
Tipo Caracteres
Letras A-Z, a-z
Dgitos 0-9
Smbolos ~ ! @ # $ % & * ( ) _
- + = | [ ] { } : ; < >
, . ? /
Espao em Branco Tab, espao, Enter
Char ac t er Set do PL/SQL
O PL/ SQL no uma linguagem sensvel
ao contexto.
letras maisculas so tratadas da mesma letras maisculas so tratadas da mesma
maneira que minsculas, a no ser no caso maneira que minsculas, a no ser no caso
destas pertencerem a uma cadeia de destas pertencerem a uma cadeia de
caracteres. caracteres.
I f x <> s then
I f x <> S then
Smbol os Si mpl es e Compost os
Smbolo Descrio
; terminador de comandos
% indicador de atributo (p.e.
%ISOPEN); smbolo w ildcard
_ smbolo w ildcard
: indicador de varivel hospedeira
** operador exponencial
<> e != diferente
| | operador de concatenao
<< e >> delimitador de rtulo
<= e >= menor ou igual e maior ou igual
:= operador de atribuio
=> operador de associao para
notao posicional
-- comentrio em uma nica de linha
/* e */ incio e fim de comentrio
Char ac t er Set do PL/SQL
Caracteres so agrupados, formando
unidades lxicas, que so os menores
componentes individuais da linguagem.
Uma unidade lxica pode formar:
identificadores identificadores
literais literais
delimitadores delimitadores
comentrios comentrios
I dent i f i c ador es
I dentificador um nome para um objeto
PL/ SQL.
constante, varivel, constante, varivel, exception exception, procedimento, , procedimento,
funo, funo, package package, registro, tabela PL/ SQL, cursor , registro, tabela PL/ SQL, cursor
e palavra reservada. e palavra reservada.
At 30 caracteres.
Tem que comear com uma letra.
Pode incluir $, _ e # .
No pode conter espaos.
Li t er ai s
Literal um valor no representado por
um identificador; simplesmente um
valor.
Nmero
415, 21.6 ou NULL 415, 21.6 ou NULL
String
Esta uma frase , 01 Esta uma frase , 01- -03 03- -97 ou NULL 97 ou NULL
Boolean
TRUE, FALSE ou NULL TRUE, FALSE ou NULL
Del i mi t ador es
Delimitador Ponto e vrgula (;)
I ndica o final de um comando I ndica o final de um comando
I F salario < min_salario
THEN
salario := salario + salario * .25;
END I F;
Coment r i os
Comentrio de uma nica linha
I F I F salario salario < min_ < min_salario salario(1994) (1994) -- -- retorna min salrio do ano retorna min salrio do ano
THEN THEN
salario salario := := salario salario * .25; * .25;
END I F; END I F;
Comentrio de mltiplas linhas
PROCEDURE calcula_receita (empresa I N NUMBER) I S PROCEDURE calcula_receita (empresa I N NUMBER) I S
/ * Programa alterado em 23/ 9/ 94 / * Programa alterado em 23/ 9/ 94
Analista Responsvel: Manoel de Souza * / Analista Responsvel: Manoel de Souza * /
... ...
Est r ut ur a de um Bl oc o
A estrutura da linguagem PL/ SQL
orientada a blocos
Modularizao
um bloco a unidade bsica de trabalho da um bloco a unidade bsica de trabalho da
qual procedimentos e funes so construdos qual procedimentos e funes so construdos
Escopo
o bloco oferece um escopo ou contexto para o bloco oferece um escopo ou contexto para
objetos logicamente relacionados objetos logicamente relacionados
Se es de um Bl oc o
Cabealho (Header)
determina o modo como o bloco deve ser chamado determina o modo como o bloco deve ser chamado
Seo de Declarao
onde declaramos variveis, cursores e sub onde declaramos variveis, cursores e sub- -blocos e blocos e
sees de exceo sees de exceo
Seo de Execuo
parte que contm o cdigo a ser executado parte que contm o cdigo a ser executado
Seo de Excees (Exceptions)
manipula excees ao processamento normal manipula excees ao processamento normal
(condies de aviso e erro). (condies de aviso e erro).
Se es de um Bl oc o
Cabealho
Cabealho
IS
Seo de Declarao
Seo de Declarao
BEGIN
Seo de Execuo
Seo de Execuo
EXCEPTION
Seo de Exceptions
Seo de Exceptions
END;
Se es de um Bl oc o
Blocos Annimos
No possuem nome No possuem nome
DECLARE
Seo de Declarao
Seo de Declarao
BEGIN
Seo de Execuo
Seo de Execuo
EXCEPTION
Seo de Exceptions
Seo de Exceptions
END;
Bl oc os Ani nhados
Um bloco pode conter um ou mais
sub-blocos de cdigo.
As variveis dos blocos As variveis dos blocos
externos podem ser externos podem ser
referenciadas nos referenciadas nos
blocos internos, porm blocos internos, porm
no o contrrio. no o contrrio.
PROCEDURE calcula_totais
IS
total_ano NUMBER;
BEGIN
total_ano := 0;
DECLARE
total_ms NUMBER;
BEGIN
total_ms := total_ano / 12;
END;
END;
Var i vei s e
Dados de Pr ogr ama
Var i vei s
Atributos de uma varivel
nome, tipo e valor nome, tipo e valor
Nome
Pode ter at 30 caracteres Pode ter at 30 caracteres
Tem que comear com uma letra Tem que comear com uma letra
Constante
Tipo especial de varivel Tipo especial de varivel
Valor constante Valor constante
Ti pos de Dados
Nmero BINARY_INTEGER
DEC
DECIMAL
DOUBLE PRECISION
FLOAT
INT
INTEGER
NATURAL
NUMBER
POSITIVE
REAL
SMALLINT
Caractere CHAR
CHARACTER
LONG
LONG RAW
RAW
ROWID
STRING
VARCHAR
VARCHAR2
Boleano BOOLEAN
Data-hora DATE
Ti pos de Dados
Existem no banco de dados: Number, Char,
Long, Long Raw, Raw, Rowid, Varchar2, Date.
Binary_I nteger: Utilizado para armazenar
inteiros com sinal. Com intervalo de:
-2147483647 .. 2147483647
Subtipos:
Natural (de 0 .. 2147483647)
Positive (de 1 .. 2147483647)
Ti pos de Dados Numr i c os
Utilize NUMBER para armazenar nmeros
(inclusive ponto-flutuante)
Preciso Mxima: 38 dgitos
1.0E 1.0E- -129 at 9.999E125 129 at 9.999E125
Declarao de uma varivel numrica:
NUMBER ( preciso, escala ) NUMBER ( preciso, escala )
preciso: nmero total de dgitos preciso: nmero total de dgitos
escala: nmero de dgitos a direita ou escala: nmero de dgitos a direita ou
esquerda do ponto decimal em que o esquerda do ponto decimal em que o
arredondamento ocorrer. arredondamento ocorrer.
Ti pos de Dados Numr i c os
Se a escala positiva, ento a escala
determina que o ponto onde o
arredondamento ocorre est a direita do ponto
decimal.
Se a escala negativa, ento a escala
determina que o ponto onde o
arredondamento ocorre est a esquerda do
ponto decimal.
Se a escala zero, ento o arredondamento
ocorre para a parte inteira do nmero.
Se a escala no especificada, ento o
arredondamento no ocorre.
VALOR FORMATO RESULTADO
12345.6784 NUMBER(10,3) 12345.678
1234567891.23 NUMBER(10,3) ERROR
1567899 NUMBER(10,-6) 2000000
53.35 NUMBER(10,-6) 0
EXEMPLO:
Ti pos de Dados Numr i c os - Ex empl os
Subt i pos Numr i c os
Pr -def i ni dos
Subtipo Compatibilidade Correspondente no
Oracle
DEC (prec, esc) ANSI NUMBER(prec, esc)
DECIMAL(prec, esc) IBM NUMBER(prec, esc)
DOUBLE
PRECISION
ANSI NUMBER
FLOAT ANSI, IBM NUMBER
INT ANSI NUMBER(38)
INTEGER ANSI, IBM NUMBER(38)
REAL ANSI NUMBER
SMALLINT ANSI, IBM NUMBER(38)
Car ac t er es
CHAR
Subtipos: Subtipos: Character Character e string. e string.
especifica que a varivel tem um tamanho fixo especifica que a varivel tem um tamanho fixo
pode pode- -se especificar o tamanho mximo (1 at se especificar o tamanho mximo (1 at
32767) 32767)
se o tamanho no for especificado, o valor padro se o tamanho no for especificado, o valor padro
1 (um). 1 (um).
espaos em branco so adicionados ao final da espaos em branco so adicionados ao final da
varivel, se esta armazenar uma cadeia de varivel, se esta armazenar uma cadeia de
caracteres de tamanho menor que o mximo. caracteres de tamanho menor que o mximo.
Car ac t er es
VARCHAR2 e VARCHAR
armazenam cadeias de caractere de tamanho armazenam cadeias de caractere de tamanho
varivel. varivel.
pode pode- -se especificar o tamanho mximo (1 at se especificar o tamanho mximo (1 at
32767) 32767)
VARCHAR2 e VARCHAR so sinnimos VARCHAR2 e VARCHAR so sinnimos
(visando a compatibilidade com bancos de (visando a compatibilidade com bancos de
dados ANSI ). dados ANSI ).
Recomendao da Recomendao da Oracle Oracle: utilize VARCHAR2 : utilize VARCHAR2
Car ac t er es
LONG
armazenam cadeias de caractere de tamanho armazenam cadeias de caractere de tamanho
varivel, de at 32760 caracteres. varivel, de at 32760 caracteres.
recomendao: utilize VARCHAR2. recomendao: utilize VARCHAR2.
RAW
armazena dados binrios de at 32767 bytes armazena dados binrios de at 32767 bytes
o PL/ SQL no tenta interpretar os dados o PL/ SQL no tenta interpretar os dados
LONG RAW
armazena dados binrios de at 32760 bytes armazena dados binrios de at 32760 bytes
Row i d
No database Oracle, ROWI D uma
pseudocoluna, pertencente a toda tabela.
I nternamente gerado, ocupando 6 bytes.
ROWI D em PL/ SQL um subtipo do CHAR
com tamanho fixo.
BBBBBBB.RRRR.FFFF
bloco no database file, linha no bloco e bloco no database file, linha no bloco e
database file database file
Bool eano (BOOLEAN)
Tipo de dados lgico (no existe
correspondente no servidor Oracle).
Pode assumir os valores TRUE, FALSE ou
NULL.
Dat a-hor a (DATE)
Uma varivel do tipo DATE armazena tanto
informaes sobre data quanto sobre hora.
Valor de tamanho fixo, que ocupa 7 bytes.
DATE armazena as seguintes informaes:
sculo, ano, ms, dia, hora, minuto e sculo, ano, ms, dia, hora, minuto e
segundo segundo
Datas vlidas para uma varivel data esto Datas vlidas para uma varivel data esto
entre 1 jan de 4712 AC a 31 dez de 4712 DC. entre 1 jan de 4712 AC a 31 dez de 4712 DC.
Podem ser feitas operaes aritmticas sobre
um valor do tipo DATE.
Conver so ent r e Ti pos
Sempre que o PL/ SQL efetua uma operao
envolvendo um ou mais valores, ele primeiro
converte os dados para o formato correto
para a operao.
Converso Explcita
usada uma funo de converso pr usada uma funo de converso pr- -definida definida
Converso I mplcita
sempre que necessrio, o PL/ SQL tenta converter sempre que necessrio, o PL/ SQL tenta converter
os valores para efetuar a operao os valores para efetuar a operao
Val or es Nul os em PL/SQL
NULL nunca igual a qualquer outra coisa
I F nome = NULL THEN ... I F nome = NULL THEN ... -- -- ERRADO ERRADO
Quando usados uma funo utilizando um
valor nulo, geralmente recebemos como
resultado um outro valor nulo.
nome := NULL; nome := NULL;
I F LENGTH(nome) = 0 THEN I F LENGTH(nome) = 0 THEN -- -- No funciona No funciona
Maneira correta da comparao:
<identificador> I S NULL <identificador> I S NULL
<identificador> I S NOT NULL <identificador> I S NOT NULL
Val or es Nul os em PL/SQL
Resultado de funes com argumento NULL:
Concatenao Concatenao
Existem duas maneiras de efetuarmos uma
concatenao: funo CONCAT ou operador | |
Nos dois casos, o valor NULL ignorado
Funo NVL Funo NVL
nova_desc := NVL(antiga_desc, No aplicavel );
Funo REPLACE Funo REPLACE
REPLACE( a.b.c.d.e.f. , . , NULL) => abcdef
Dec l ar a o de Var i vei s
Antes de fazer qualquer referncia a uma
varivel, a mesma deve ser declarada.
Sintaxe
<nome_var> <tipo> [ atribuio de valor padro] <nome_var> <tipo> [ atribuio de valor padro]
Dec l ar a o de Var i vei s
Exemplos
data_ data_admissao admissao DATE; DATE;
achou BOOLEAN; achou BOOLEAN;
total NUMBER(15,2); total NUMBER(15,2);
paragrafo paragrafo VARCHAR2(2000); VARCHAR2(2000);
prox prox_aumento CONSTANT DATE := 15 _aumento CONSTANT DATE := 15- -APR APR- -96 ; 96 ;
limite NUMBER DEFAULT 3; limite NUMBER DEFAULT 3;
nom nom_ _empr empr VARCHAR2(50) NOT NULL DEFAULT VARCHAR2(50) NOT NULL DEFAULT
PCS R US PCS R US
Cont r ol e Condi c i onal
e Sequenc i al
Comandos I F...
Permitem que seja construda uma
lgica condicional nas aplicaes.
IF <condio> THEN
<comandos> - TRUE
END IF;
Determina se os comandos entre o
THEN e o END IF sero executados,
de acordo com a condio.
IF <condio> THEN
<comandos> - TRUE
ELSE
<comandos> - FALSE
END IF;
Baseado na condio informada, ser
executado o cdigo entre o THEN e o
ELSE (TRUE) ou entre ELSE e o END
IF (FALSE).
IF <condio> ...
ELSIF <condio>
ELSE
<comandos>
END IF
seleciona uma ao dentre vrias
condies mutuamente exclusivas,
executando os comandos associados
condio.
Combi na o I F-THEN
Exemplos
I F :empresa.total > media I F :empresa.total > media
THEN THEN
aplicar_desconto(:empresa.empresa_id); aplicar_desconto(:empresa.empresa_id);
END I F; END I F;
I F I F relatorio relatorio_pedido _pedido
THEN THEN
imprime_ imprime_relatorio relatorio( (relatorio relatorio_id); _id);
END I F; END I F;
Combi na o I F-THEN-ELSE
Exemplo
I F :cliente.total_pedido > I F :cliente.total_pedido > max max_permitido _permitido
THEN THEN
pedido_excedente := TRUE; pedido_excedente := TRUE;
ELSE ELSE
pedido_excedente := FALSE; pedido_excedente := FALSE;
END I F; END I F;
Combi na o I F-ELSI F
Exemplo
I F I F salario salario < 10000 < 10000
THEN THEN
bonus bonus := 2000; := 2000;
ELSI F ELSI F salario salario < 20000 < 20000
THEN THEN
bonus bonus := 1500; := 1500;
ELSI F ELSI F salario salario < 40000 < 40000
THEN THEN
bonus bonus := 1000; := 1000;
ELSE ELSE
bonus bonus := 500; := 500;
END I F; END I F;
Comando GOTO
Desvio incondicional para um rtulo
definido no programa.
GOTO nome_rotulo; GOTO nome_rotulo;
... ...
<<nome_rotulo>> <<nome_rotulo>>
... ...
Pelo menos um comando deve existir
aps a definio de um rtulo.
O rtulo deve ser nico no escopo.
Comando GOTO
Rtulo destino deve estar no mesmo escopo
que o comando GOTO.
I F, BEGI N, I F, BEGI N, Loop Loop, mdulo. , mdulo.
Rtulo destino deve estar na mesma parte
do bloco PL/ SQL que o comando GOTO.
ex.: um GOTO na seo executvel no pode ex.: um GOTO na seo executvel no pode
desviar para a seo de desviar para a seo de exceptions exceptions. .
O cdigo resultante com o uso do GOTO
pode tornar-se complexo e desestruturado,
dificultando a manuteno.
Comando NULL
Melhorar a clareza do programa
I F : I F : report report . .selection selection = DETAI L = DETAI L
THEN THEN
exec exec_ _detail detail_ _report report ; ;
ELSE ELSE
NULL; NULL;
END I F; END I F;
Tirar o efeito de uma exception
Projeto top-down dos mdulos do sistema.
Utilizao conjunta com o GOTO.
SQL* Pl us
SQL* Pl us
Permite introduzir interativamente
instrues de SQL e blocos PL/ SQL a
partir de uma linha de comandos que so
enviadas diretamente para a base de
dados
Comandos no so sensveis a maisculas
e minsculas
Var i vei s de Subst i t ui o
I dentificadas pelo caracter &
Substituio textual da varivel antes de
enviar a instruo para o servidor
Exemplo:
select select * * from emp from emp
where empno where empno=&num_empregado; =&num_empregado;
Var i vei s de Assoc i a o
Variveis de memria, podendo ser
utilizadas em um ou mais blocos PL/ SQL
Tipos vlidos:
VARCHAR2 VARCHAR2
CHAR CHAR
NUMBER NUMBER
No podem ser restringidas por preciso ou
escala
REFCURSOR (a partir do SQL* REFCURSOR (a partir do SQL* Plus Plus 3.2) 3.2)
Var i vei s de Assoc i a o
Exemplo:
SQL> VARIABLE v_contador NUMBER SQL> VARIABLE v_contador NUMBER
SQL> BEGIN SQL> BEGIN
2 2 SELECT COUNT(*) SELECT COUNT(*)
3 3 INTO :v_contador INTO :v_contador
4 4 FROM FROM emp emp
5 5 WHERE WHERE empno empno > 1000; > 1000;
6 END; 6 END;
7 / 7 /
SQL> PRINT v_contador SQL> PRINT v_contador
Aps a execuo, a varivel v_contador Aps a execuo, a varivel v_contador
conter o resultado do conter o resultado do select select feito no bloco. feito no bloco.
EXECUTE
Uma chamada a stored procedures deve
ser feita atravs do comando EXECUTE
Exemplo:
EXECUTE minha_ EXECUTE minha_procedure procedure(param1,...); (param1,...);
O SQL* O SQL* Plus Plus enviar o seguinte bloco PL/ SQL enviar o seguinte bloco PL/ SQL
para a base de dados: para a base de dados:
BEGI N minha_ BEGI N minha_procedure procedure(param1,...); END; (param1,...); END;
Ex ec ut ar Ar qui vos de I nst r u es
Para executar quaisquer instrues SQL
ou blocos PL/ SQL
Pode-se utilizar start ou @
Exemplos:
start start cria_ cria_proc proc.sql .sql
start start cria_ cria_func func
start start pacote1. pacote1.pck pck
@ @funcao funcao_teste. _teste.fnc fnc
A extenso default sql
SHOW ERRORS
Mostra erros de compilao armazenados
na view user_errors
Utilizado aps uma tentativa de criar
stored procedures e receber a mensagem:
Warning Warning: : Procedure created with compilation errors Procedure created with compilation errors
Ex er c c i o I .1
Faa um script que, dado um nmero inteiro,
retorne o sua raiz quadrada (p/ rodar no
SQL* Plus).
Sugestes:
utilize a funo SQRT utilize a funo SQRT
utilize o modo de entrada de dados do SQL* utilize o modo de entrada de dados do SQL* Plus Plus
(& (&variavel variavel) )
construa um bloco annimo construa um bloco annimo
utilize o comando DBMS_OUTPUT.PUT_LI NE utilize o comando DBMS_OUTPUT.PUT_LI NE
Ex er c c i o I .2
Faa um script que calcule as razes de uma
equao de 2
o
grau
Sugestes:
utilize o mdulo de entrada de dados do SQL* utilize o mdulo de entrada de dados do SQL* Plus Plus
(& (&variavel variavel) )
construa um bloco annimo construa um bloco annimo
Obs.: eq = ax
2
+ bx + c = 0
raiz1 = ( raiz1 = ( - -b + b + sqrt sqrt (b (b
2 2
- - 4.a.c) ) / 2.a 4.a.c) ) / 2.a
raiz2 = ( raiz2 = ( - -b b - - sqrt sqrt (b (b
2 2
- - 4.a.c) ) / 2.a 4.a.c) ) / 2.a
Loops
Conc ei t os
Um loop permite que um mesmo cdigo
seja executado repetidamente.
Loop Loop Simples Simples
Loop Loop FOR (p/ nmeros e cursores) FOR (p/ nmeros e cursores)
Loop Loop WHI LE WHI LE
Na maioria dos casos, uma lgica que
requer um loop pode usar qualquer das
trs construes existentes.
Loop Si mpl es
LOOP
<comandos>
END LOOP;
O teste para terminao feito dentro do
loop
EXI T EXI T
EXI T WHEN <condio> EXI T WHEN <condio>
Loop Si mpl es
Exemplos
LOOP
balanco_restante := balanco_conta(conta_id);
IF balanco_restante < 1000 THEN
EXIT;
ELSE
aplicar_balanco(conta_id, balanco_restante);
END IF;
END LOOP;
LOOP
balanco_restante := balanco_conta(conta_id);
EXIT WHEN balanco_restante < 1000;
aplicar_balanco(conta_id, balanco_restante);
END LOOP;
Loop Si mpl es
Quando usar
no existe a certeza de quantas vezes o no existe a certeza de quantas vezes o loop loop ser ser
executado executado
o o loop loop deve executar pelo menos uma vez deve executar pelo menos uma vez
Loop FOR
FOR numrico
FOR < FOR < indice indice_ _loop loop> I N [ REVERSE] <menor>..<maior> > I N [ REVERSE] <menor>..<maior>
LOOP LOOP
<comandos> <comandos>
END LOOP; END LOOP;
O O loop loop termina quando o cdigo executado o termina quando o cdigo executado o
nmero de vezes correspondente ao intervalo nmero de vezes correspondente ao intervalo
informado informado
Aps cada execuo do bloco, o PL/ SQL verifica Aps cada execuo do bloco, o PL/ SQL verifica
se o valor atual do ndice excede a diferena se o valor atual do ndice excede a diferena
entre o maior e menor nmero informado na faixa entre o maior e menor nmero informado na faixa
Loop FOR
FOR numrico
Quando usar: Quando usar:
cdigo dentro do loop ser executado um nmero fixo
de vezes, sem ser necessria uma interrupo
Regras Regras
no declare o ndice usado no loop
no mude o valor das variveis usadas para informar
a faixa de valores (a faixa analisada no incio do
loop), muito menos o valor do ndice
no use o comando EXI T dentro do loop FOR
Loop FOR
FOR numrico
Exemplos Exemplos
FOR contador IN 1..10
LOOP
...
END LOOP;
FOR contador IN REVERSE 1..10
LOOP
...
END LOOP;
FOR ind_calc IN ini_periodo ..
LEAST(fim_periodo,
periodo_atual)
LOOP
...
END LOOP;
Loop WHI LE
WHI LE <condio>
LOOP
<comandos>
END LOOP;
Executa at que a condio seja falsa.
Antes de cada execuo do bloco dentro loop,
o PL/ SQL avalia a condio informada.
Loop WHI LE
Quando usar
no temos certeza de quantas vezes devemos no temos certeza de quantas vezes devemos
executar o corpo do executar o corpo do loop loop
desejamos interromper o desejamos interromper o loop loop de acordo com de acordo com
uma condio uma condio
no necessariamente temos que executar o no necessariamente temos que executar o loop loop
pelo menos uma vez pelo menos uma vez
Loop WHI LE
WHILE total <= 25000 LOOP
...
SELECT sal INTO salary FROM emp WHERE ...
total := total + salary;
END LOOP;
Este exemplo garante a execuo ao
menos uma vez:
done := FALSE;
WHILE NOT done LOOP
sequence_of_statements;
done := boolean_expression;
END LOOP;
Regi st r os em PL/SQL
Conc ei t os
Um registro em PL/ SQL bastante
similar estrutura de linhas em uma
tabela.
Um registro uma estrutura de dados
composta.
O registro como um todo no tem um
valor. Cada componente ou campo
que o possui.
Ti pos de Regi st r o
Baseado em Tabela
cada campo corresponde a uma coluna em cada campo corresponde a uma coluna em
uma tabela, inclusive com o mesmo nome uma tabela, inclusive com o mesmo nome
Baseado em Cursor
cada campo corresponde a uma coluna ou cada campo corresponde a uma coluna ou
expresso no comando SELECT de um expresso no comando SELECT de um
cursor cursor
Definido pelo Programador
cada campo definido explicitamente cada campo definido explicitamente
(nome e tipo) atravs do comando TYPE (nome e tipo) atravs do comando TYPE
Dec l ar a o de um Regi st r o
Baseado em Tabelas
<nome_ <nome_reg reg> <nome_tabela>%ROWTYPE; > <nome_tabela>%ROWTYPE;
DECLARE DECLARE
empresa_ empresa_reg reg empresa%ROWTYPE; empresa%ROWTYPE;
Baseado em Cursores
<nome_ <nome_reg reg> <nome_cursor>%ROWTYPE; > <nome_cursor>%ROWTYPE;
DECLARE DECLARE
empresa_ empresa_reg reg empresa_ empresa_cur cur%ROWTYPE; %ROWTYPE;
Dec l ar a o de um Regi st r o
Definido pelo Programador
TYPE <nome_tipo> I S RECORD TYPE <nome_tipo> I S RECORD
( <nome_campo1> <tipo_dado1>, ( <nome_campo1> <tipo_dado1>,
<nome_campo2> <tipo_dado2>, <nome_campo2> <tipo_dado2>,
... ...
<nome_ <nome_campoN campoN> <tipo_ > <tipo_dadoN dadoN> ) > )
TYPE cliente_ TYPE cliente_regtipo regtipo I S RECORD I S RECORD
(cliente_id NUMBER(5), (cliente_id NUMBER(5),
cliente_nome cliente.nome%TYPE, cliente_nome cliente.nome%TYPE,
total_vendas NUMBER(15,2) ); total_vendas NUMBER(15,2) );
Tabel as PL/SQL
Def i ni o
Como um array, uma tabela PL/ SQL uma
coleo ordenada de elementos de um mesmo
tipo.
Uma tabela PL/ SQL no tem limites de
tamanho, pode ser incrementada
dinamicamente.
O ndice de acesso da tabela no precisa ser
um nmero sequencial. Por exemplo, pode-se
usar uma srie como nmero do empregado
(como 7369, 7499, 7521, 7566, )
Def i ni ndo uma Tabel a PL/SQL
TYPE table_type_name IS TABLE OF
datatype [NOT NULL]
[INDEX BY BINARY_INTEGER];
onde onde table table_ _type type_ _name name um tipo especificado um tipo especificado
pelo usurio. pelo usurio.
Na verso 8 a clusula I NDEX BY
opcional.
Ex empl os
DECLARE
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE NOT NULL
INDEX BY BINARY_INTEGER;
DECLARE
TYPE TimeRecTyp IS RECORD (
hour SMALLINT := 0,
minute SMALLINT := 0,
second SMALLINT := 0);
TYPE TimeTabTyp IS TABLE OF TimeRecTyp
INDEX BY BINARY_INTEGER;
Ref er enc i ando Tabel as PL/SQL
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
...
IF emp_tab(1).job = CLERK THEN ...
END;
Usando Tabel as PL/SQL
DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = ACCOUNTING THEN ...
...
END;
Usando Tabel as PL/SQL
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by its element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
process data record
END LOOP;
CLOSE c1;
END;
At r i but os de Tabel a: COUNT
Retorna o nmero de elementos na
tabela.
...
IF ename_tab.COUNT = 50 THEN
...
END;
At r i but os de Tabel a: DELETE
Este atributo tem 3 formas:
tabela.DELETE remove todos os elementos da tabela.DELETE remove todos os elementos da
tabela; tabela;
tabela.DELETE(n) remove o elemento n da tabela.DELETE(n) remove o elemento n da
tabela; tabela;
tabela.DELETE(m,n) remove o range m .. n. tabela.DELETE(m,n) remove o range m .. n.
uma instruo completa por si s; no
chamada como parte de uma expresso
At r i but os de Tabel a: EXI STS
Retorna TRUE se existir uma linha com
ndice i na tabela, caso contrrio retorna
FALSE.
IF sal_tab.EXISTS(i) THEN
sal_tab(i) := sal_tab(i) + 500;
ELSE
RAISE salary_missing;
END IF;
...
At r i but os de Tabel a: FI RST e LAST
Retornam o ndice da primeira e da ltima
linha da tabela, respectivamente.
...
FOR i IN emp_tab.FIRST .. emp_tab.LAST LOOP
...
END LOOP;
A primeira linha a que tem o ndice mais
baixo e a ltima, o mais elevado.
At r i but os de Tabel a: NEXT e PRI OR
Retornam o ndice do elemento seguinte
ou anterior da tabela, respectivamente.
DECLARE
...
i BINARY_INTEGER;
BEGIN
..
i := any_tab.FIRST;
WHILE i IS NOT NULL LOOP
... process any_tab(i)
i := any_tab.NEXT(i);
END LOOP;
END;
SQL em PL/SQL
I nst r u es de SQL
Podem dividir-se em seis categorias:
DML: linguagem de manipulao de dados DML: linguagem de manipulao de dados
DDL: linguagem de definio de dados DDL: linguagem de definio de dados
Controle de transaes Controle de transaes
Controle de sesses Controle de sesses
Controle do sistema Controle do sistema
SQL incorporado (para pr SQL incorporado (para pr- -compiladores) compiladores)
SQL em PL/SQL
Num programa PL/ SQL s podem ser
usadas as seguintes instrues:
DML: DML: select select , , insert insert , , update update, , delete delete
Controle de transaes: Controle de transaes: commit commit , , rollback rollback, ,
savepoint savepoint
Existe uma alternativa para o uso de
instrues DDL em PL/ SQL
A A package package DBMS_SQL, disponvel a partir da DBMS_SQL, disponvel a partir da
verso 2.1 permite a criao de SQL dinmico verso 2.1 permite a criao de SQL dinmico
DML: Sel ec t
Busca informaes do banco de dados
para variveis PL/ SQL
SELECT emp.ename
INTO v_ename
FROM emp
WHERE emp.empno = 7902;
Deve retornar somente uma linha
A clusula I NTO s usada em blocos
PL/ SQL
DML: I nser t
I nsere uma linha na tabela
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm,
deptno)
VALUES
(1, 'ALBERT', 'SALESMAN', 7698, SYSDATE,
1432, 260, 30);
INSERT INTO emp
SELECT * FROM emp;
DML: Updat e
Altera o contedo de uma ou mais linhas
de uma tabela
UPDATE emp
SET sal = sal * 1.2
WHERE empno = 1;
DML: Del et e
Elimina uma ou mais linhas de uma tabela
DELETE FROM emp
WHERE empno = 1;
Cl usul a WHERE
Nas instrues SELECT, UPDATE e
DELETE esta clusula serve para restringir
o conjunto de linhas sobre as quais a
operao ser executada.
Constituda por condies, normalmente
de comparao, separadas pelos
operadores AND, OR, NOT
Ref er nc i as de t abel as
As operaes de DML referenciam uma
tabela, de uma forma geral, no formato:
[ [ owner owner.] tabela[ @ .] tabela[ @dblink dblink] ]
onde:
owner - usurio onde a tabela foi criada
dblink - denominao de uma conexo a um
banco de dados remoto
Si nni mos
Utilizados para facilitar o acesso aos
objetos do banco de dados, evitando o
uso de owner e dblink para identific-los.
Exemplo: Exemplo:
CREATE PUBLIC SYNONYM empregado FOR CREATE PUBLIC SYNONYM empregado FOR
owner1. owner1.emp emp@bd1; @bd1;
Aps isto pode Aps isto pode- -se usar: se usar:
SELECT * FROM empregado; SELECT * FROM empregado;
em vez de ter que fazer: em vez de ter que fazer:
SELECT * FROM owner1. SELECT * FROM owner1.emp emp@bd1; @bd1;
Pseudo-c ol unas
Funes adicionais que s podem ser
chamadas a partir de instrues SQL:
CURRVAL e NEXTVAL CURRVAL e NEXTVAL
LEVEL LEVEL
ROWI D ROWI D
ROWNUM ROWNUM
Pseudo-c ol unas: CURRVAL e NEXTVAL
Utilizadas com sequncias (objetos Oracle
para gerar nmeros nicos)
sequncia.CURRVAL
retorna o valor atual da retorna o valor atual da sequncia sequncia
sequncia.NEXTVAL
retorna o prximo valor da retorna o prximo valor da sequncia sequncia
Exemplo:
SELECT SELECT my my_ _seq seq.NEXTVAL .NEXTVAL from from dual; dual;
Pseudo-c ol unas: LEVEL
Utilizado dentro de uma instruo SELECT
que implementa uma pesquisa de rvore
hierrquica numa tabela utilizando as
clusulas START WI TH e CONNECT BY.
Esta pseudo-coluna retorna o nvel atual
da rvore.
Pseudo-c ol unas: ROWI D
Retorna o endereo fsico de uma linha da
tabela, num valor do tipo ROWI D
Um SELECT utilizando-se de ROWI D na clusula
WHERE o mtodo mais otimizado de se
recuperar uma linha
Exemplo:
v_rowid ROWID;
...
SELECT ROWID INTO v_rowid FROM emp;
...
UPDATE emp set ... WHERE emp.rowid = v_rowid;
Pseudo-c ol unas: ROWNUM
Retorna o nmero atual da linha num
SELECT
Utilizado principalmente na clusula
WHERE para limitar as linhas a serem
consideradas
SELECT * FROM emp WHERE ROWNUM < 3;
O valor ROWNUM atribudo a uma linha
antes de ser efetuada uma ordenao
(ORDER BY)
Pr i vi l gi os de Ac esso
Privilgios de Objeto
Para efetuar operaes num objeto
Privilgios de Sistema
Para efetuar operaes numa classe de
objetos
GRANT
Para dar privilgios de acesso
Objeto: Objeto:
GRANT privilgio ON objeto TO usurio
[WITH GRANT OPTION]
Sistema: Sistema:
GRANT privilgio TO usurio
[WITH ADMIN OPTION]
REVOKE
Para revogar privilgios de acesso
Objeto: Objeto:
REVOKE privilgio ON objeto FROM usurio
[CASCADE CONSTRAINTS]
Sistema: Sistema:
REVOKE privilgio FROM usurio
Per f i s de Gr upo
Os privilgios comuns podem ser agrupados em
ROLES, para facilitar a concesso para vrios
usurios que possuem o mesmo perfil
Em vez de dar privilgios para cada usurio:
Cria Cria- -se uma role: CREATE ROLE role se uma role: CREATE ROLE role
Concedem Concedem- -se os privilgios: GRANT ... TO se os privilgios: GRANT ... TO
role role
Atribuem Atribuem- -se os usurios para essa role se os usurios para essa role
GRANT role TO usurio GRANT role TO usurio
PUBLI C: perfil genrico para todos os usurios
Cont r ol e de Tr ansa es
COMMI T
Salva as operaes da transao e libera
locks. As operaes so visveis a outras
sesses
ROLLBACK
Desfaz as operaes e libera locks
SAVEPOI NT
Ponteiro para marcar o nicio para onde
um ROLLBACK pode ser efetuado
Fun es de SQL i nt egr adas
Fun es par a Car ac t er es
Nome Descrio
ASCII retorna o cdigo ASCII de um caractere
CHR retorna o caractere associado ao cdigo ASCII
CONCAT concatena duas strings
INITCAP transforma a primeira letra de cada palavra em
maiscula
INSTR retorna a localizao em uma string da
substring especificada
LENGTH retorna o tamanho da string
LOWER converte todas as letras para minsculas
LPAD adiciona uma string esquerda
Fun es par a Car ac t er es
Nome Descrio
LTRIM retira do lado esquerdo da string todos os caracteres recebidos
como parmetro
REPLACE substitui uma sequncia de caracteres por um conjunto
diferente de caracteres
RPAD adiciona os caracteres especificados direita da string
RTRIM retira do lado direito da string todos os caracteres recebidos
como parmetro
SOUNDEX retorna a representao fontica de uma string
SUBSTR retorna a poro especificada da string
TRANSLATE traduz caracteres nicos em uma string por um caracter
diferente
UPPER converte todas as letras para maisculas
Fun es par a Car ac t er es
Exemplos
FUNCTI ON I NSTR(string1 I N VARCHAR2, FUNCTI ON I NSTR(string1 I N VARCHAR2,
string2 I N VARCHAR2 string2 I N VARCHAR2
[ , [ , pos pos_ _ini ini I N NUMBER := 1 I N NUMBER := 1
[ , [ , nth nth_ _ocorrencia ocorrencia I N NUMBER := 1] ] ) I N NUMBER := 1] ] )
RETURN NUMBER RETURN NUMBER
I NSTR( Estou procurando uma palavra , uma ) =>
18
FUNCTI ON LPAD(string1 I N VARCHAR2, FUNCTI ON LPAD(string1 I N VARCHAR2,
tamanho_ tamanho_pad pad I N NUMBER I N NUMBER
[ , string_ [ , string_pad pad I N VARCHAR2] ) I N VARCHAR2] )
RETURN VARCHAR2 RETURN VARCHAR2
LPAD( 55 , 10, 0) => 0000000055
LPAD( 12345678 , 5, 0 ) => 12345
Fun es par a Car ac t er es
Exemplos
FUNCTI ON LTRI M(string1 I N VARCHAR2 FUNCTI ON LTRI M(string1 I N VARCHAR2
[ , [ , trim trim_string I N VARCHAR2] ) _string I N VARCHAR2] )
RETURN VARCHAR2 RETURN VARCHAR2
LTRI M( Eu gosto de pizza ) => Eu gosto de pizza
FUNCTI ON SUBSTR(string_in I N VARCHAR2, FUNCTI ON SUBSTR(string_in I N VARCHAR2,
pos pos_ _ini ini I N NUMBER I N NUMBER
[ , tam_ [ , tam_substr substr_in I N _in I N
NUMBER] ) NUMBER] )
RETURN VARCHAR2 RETURN VARCHAR2
SUBSTR( Eu gosto de pizza , 4, 5) => gosto
SUBSTR( Eu gosto de pizza , -1) => a
Fun es par a Dat as
Nome Descrio
ADD_MONTHS adiciona o nmero de meses especificado data
LAST_DAY retorna o ltimo dia do ms da data especificada
MONTHS_BETWEEN retorna o nmero de meses entre duas datas
NEW_TIME retorna o valor data/hora, com o tempo alterado
de acordo com o time zone especificado
NEXT_DAY retorna a data do primeiro dia de semana
especificado que maior que a data
ROUND retorna a data arrendondada para o formato
especificado
SYSDATE retorna a hora/data corrente no Oracle Server
TRUNC trunca a data da sua poro hora, de acordo com
o formato especificado
Fun es par a Dat as
Exemplos
LAST_DAY(data_in I N DATE) RETURN DATE LAST_DAY(data_in I N DATE) RETURN DATE
LAST_DAY(SYSDATE) - SYSDATE => nmero de
dias at o final do ms.
NEXT_DAY(data_in I N DATE, NEXT_DAY(data_in I N DATE,
nome_dia I N VARCHAR2) nome_dia I N VARCHAR2)
RETURN DATE RETURN DATE
NEXT_DAY( 01-JAN-1997 , MONDAY)
=> 06-JAN-1997
Fun es Numr i c as
Nome Descrio
ABS valor absoluto do nmero
COS / ACOS / COSH cosseno; cosseno inverso; cosseno hiperblico
SIN / ASIN / SINH seno; seno inverso; seno hiperblico
TAN / ATAN TANH tangente; tangente inversa; tangente hiperblica
CEIL retorna o teto inteiro de um nmero
EXP(n) e elevado n-sima potncia
FLOOR maior inteiro menor ou igual ao nmero
LN(a) logaritmo natural de a.
LOG(a, b) logaritmo na base a de b.
MOD(a, b) resto da diviso de a por b.
Fun es Numr i c as
Nome Descrio
POWER(a,b) a elevado b-sima potncia
ROUND(a,b) retorna a arredondado em b casas decimais
SIGN(a) retorna 1 se a > 0, 0 se a = 0 e -1 se a < 0
SQRT raiz quadrada de um nmero
TRUNC(a, [b]) a truncado at b casas decimais
Out r as Fun es
Nome Descrio
DECODE retorna o resultado de uma comparao no estilo if-then-else
DUMP retorna uma string contendo um dump da expresso especificada
GREATEST retorna o maior dos valores especificados
LEAST retorna o menor dos valores especificados
NVL substitui o valor NULL por um outro valor
SQLCODE retorna o nmero do erro do Oracle para a exception mais recente
SQLERRM retorna a mensagem de erro do Oracle para a exception mais
recente
UID retorna o User ID da sesso corrente no Oracle
USER retorna o nome do usurio logado
USERENV retorna uma string contento infos sobre a sesso corrente no Oracle
VSIZE retorna o nmero de bytes da representao interna do valor
especificado
Out r as Fun es
Exemplos
FUNCTI ON SQLCODE RETURN I NTEGER FUNCTI ON SQLCODE RETURN I NTEGER
FUNCTI ON SQLERRM RETURN VARCHAR2 FUNCTI ON SQLERRM RETURN VARCHAR2
EXCEPTI ON
WHEN OTHERS THEN
MESSAGE( Error | | TO_CHAR(SQLCODE)
| | : | | SQLERRM);
Fun es de Conver so
Nome Descrio
CHARTOROWID converte uma string para ROWID
CONVERT converte uma string de uma character set
para outro
HEXTORAW converte de hexadecimal para o formato
RAW
RAWTOHEX converte de raw para hexadecimal
ROWIDTOCHAR converte de ROWID para uma string
TO_CHAR converte um nmero ou data para string
TO_DATE converte uma string para data
TO_NUMBER converte uma string para nmero
Fun o TO_CHAR
FUNCTI ON TO_CHAR(param I N { DATE/ NUMBER} ,
[ , formato I N VARCHAR2
[ , nls_language I N
VARCHAR2] ] )
RETURN VARCHAR2
TO_CHAR(SYSDATE, TO_CHAR(SYSDATE, Month Month DD, YYYY) DD, YYYY)
=> => March March 10,1997 10,1997
TO_CHAR(564.70, $999.9 ) => $564.7 TO_CHAR(564.70, $999.9 ) => $564.7
TO_CHAR(564.70, $0000999.9 ) => $0000564.7 TO_CHAR(564.70, $0000999.9 ) => $0000564.7
Fun o TO_DATE
FUNCTI ON TO_DATE(param I N { VARCHAR2| NUMBER}
[ , formato I N VARCHAR2
[ , nls_language I N VARCHAR2 ] ] )
RETURN DATE
TO_DATE( 123198 , MMDDYY) => 31 TO_DATE( 123198 , MMDDYY) => 31- -DEC DEC- -1998 1998
TO_DATE( 16/ 7/ 94 , DD/ MM/ YY) => 16 TO_DATE( 16/ 7/ 94 , DD/ MM/ YY) => 16- -JUL JUL- -1994 1994
Fun o TO_NUMBER
FUNCTI ON TO_NUMBER(string_in I N
CHAR| VARCHAR2}
[ , formato I N VARCHAR2
[ , nls_language VARCHAR2] ] )
RETURN NUMBER
TO_NUMBER( 123.23 ) => 123.23 TO_NUMBER( 123.23 ) => 123.23
TO_NUMBER( TO_NUMBER( abcdef abcdef ) => ERRO ) => ERRO
Fun es de Gr upo
Somente para SELECT com GROUP BY
Nome Descrio
AVG retorna a mdia dos valores da coluna
COUNT retorna o nmero de linhas que a coluna no nula
MAX retorna o valor mximo da coluna
MIN retorna o valor mnimo da coluna
STDDEV retorna o desvio padro da coluna
SUM retorna a soma dos valores da coluna
VARIANCE retorna a varincia estatstica da coluna
Cur sor es
Conc ei t os
Um cursor pode ser encarado como um
ponteiro para a tabela virtual no banco de
dados representada pelo comando
SELECT associado.
Ex.: Ex.:
CURSOR empregado_ CURSOR empregado_cur cur I S I S
SELECT * FROM empregado; SELECT * FROM empregado;
OPEN empregado_ OPEN empregado_cur cur; ;
FETCH empregado_ FETCH empregado_cur cur I NTO empregado_ I NTO empregado_rec rec; ;
CLOSE empregado_ CLOSE empregado_cur cur; ;
Oper a es em Cur sor es
OPEN
abre o cursor, faz o abre o cursor, faz o parse parse e o e o bind bind da da
consulta associada, identificando o resultado consulta associada, identificando o resultado
o cursor posicionado antes da primeira linha. o cursor posicionado antes da primeira linha.
FETCH
busca a linha corrente do cursor e o posiciona na busca a linha corrente do cursor e o posiciona na
prxima prxima
CLOSE
fecha o cursor e libera a memria alocada. fecha o cursor e libera a memria alocada.
Ti pos de Cur sor es
Cursores Estticos
sempre referenciam um comando SQL, que sempre referenciam um comando SQL, que
conhecido em tempo de compilao. conhecido em tempo de compilao.
Variveis Cursores
a varivel referencia um objeto cursor e pode a varivel referencia um objeto cursor e pode
referenciar diferentes comandos SQL em referenciar diferentes comandos SQL em
ocasies diferentes. ocasies diferentes.
nova nova feature feature do PL/ SQL. do PL/ SQL.
Ti pos de Cur sor es
I mplcitos
o PL/ SQL utiliza um cursor implcito sempre que o PL/ SQL utiliza um cursor implcito sempre que
um comandos SQL executado diretamente no um comandos SQL executado diretamente no
cdigo, desde que o cdigo no utilize um cursor cdigo, desde que o cdigo no utilize um cursor
explcito explcito
usados em cada UPDATE, I NSERT ou DELETE usados em cada UPDATE, I NSERT ou DELETE
so menos eficientes que cursores explcitos so menos eficientes que cursores explcitos
mais suscetveis a erro mais suscetveis a erro
Ti pos de Cur sor es
Explcitos
comando SELECT explicitamente definido na comando SELECT explicitamente definido na
seo de declarao, sendo um nome seo de declarao, sendo um nome
associado a ele associado a ele
usados quando desejamos recuperar mais de usados quando desejamos recuperar mais de
uma linha de resultado uma linha de resultado
no existem para comandos de UPDATE, no existem para comandos de UPDATE,
I NSERT e DELETE I NSERT e DELETE
Dec l ar a o
CURSOR nome_cursor [ ( [ parmetro [ ,
parmetro ...] ) ]
[ RETURN especificao_retorno ]
I S comando_SELECT;
Var i vei s em um Cur sor
Nome do Cursor no uma varivel
No PL/ SQL, a lista de itens no SELECT pode
conter colunas, variveis do PL/ SQL e
variveis associadas (p.e. Oracle Forms).
DECLARE DECLARE
bonus bonus NUMBER := 100; NUMBER := 100;
CURSOR empregado_ CURSOR empregado_cur cur I S I S
SELECT empregado_id, SELECT empregado_id, salario salario + + bonus bonus, ,
: : revisao revisao. .avaliacao avaliacao
FROM empregado FROM empregado
WHERE WHERE dt dt _ _contrat contrat < ADD_MONTHS(SYSDATE, < ADD_MONTHS(SYSDATE, - -36); 36);
Pr ec ednc i a de um I dent i f i c ador
Em um cursor, existe precedncia do nome
da coluna sobre o nome de uma varivel
PL/ SQL.
PROCEDURE melhorar_SQL PROCEDURE melhorar_SQL
I S I S
salario salario NUMBER := 1000; NUMBER := 1000;
CURSOR dobrar_sal_ CURSOR dobrar_sal_cur cur I S I S
SELECT SELECT salario salario + + salario salario
FROM empregado FROM empregado
WHERE WHERE dt dt _ _contrat contrat < ADD_MONTHS(SYSDATE, < ADD_MONTHS(SYSDATE,- -36); 36);
BEGI N BEGI N
A c l asul a RETURN
Somente pode ser usada para cursores
que esto contidos em um package.
A clasula RETURN pode ser feita com as
seguintes estruturas:
Um Um record record definido a partir de uma tabela, definido a partir de uma tabela,
usando %ROWTYPE usando %ROWTYPE
Um Um record record definido a partir de um definido a partir de um record record pr pr- -
definido pelo definido pelo progamador progamador
Ex empl o de Uso da c l asul a RETURN
Primeiro a definio da Package
PACKAGE empresa I S PACKAGE empresa I S
CURSOR empresa_ CURSOR empresa_cur cur (id I N NUMBER) (id I N NUMBER)
RETURN empresa%ROWTYPE; RETURN empresa%ROWTYPE;
END empresa; END empresa;
Depois a definio da Package Body
PACKAGE PACKAGE body body empresa I S empresa I S
CURSOR empresa_ CURSOR empresa_cur cur (id I N NUMBER) (id I N NUMBER)
RETURN empresa%ROWTYPE I S RETURN empresa%ROWTYPE I S
SELECT * FROM empresa SELECT * FROM empresa
WHERE empresa_id = id; WHERE empresa_id = id;
END empresa; END empresa;
Por que c ol oc ar c ur sor numa Pac k age?
Uma package uma coleo de objetos
logicamente relacionados
Agrupando os cdigos, torna-se mais fcil
a identificao e uso dos cdigos pelo
programador
Cursores em packages so essencialmente
caixas pretas
O programador no precisa saber como
um cursor recuperado
Abr i ndo Cur sor es
OPEN <nome_cursor> [ (parmetro [ ,
parmetro ...] ) ] ;
O comando OPEN no recupera linhas.
Todos os fetches refletiro os dados
exatamente como da ocasio em que o
cursor foi aberto.
Rec uper ando Dados de Cur sor es
FETCH <nome_cursor> I NTO
<registro_ou_lista_variveis>
Exemplo:
FETCH empresa_ FETCH empresa_cur cur I NTO empresa_ I NTO empresa_reg reg; ;
FETCH FETCH max max_sal_ _sal_cur cur I NTO I NTO max max_sal; _sal;
FETCH FETCH empr empr_ _cur cur I NTO I NTO empr empr_nome(1), _nome(1),
dt dt _ _contrat contrat , ,
:depto.min_ :depto.min_salario salario; ;
Fec hando Cur sor es
CLOSE <nome_cursor>
Libera rea de memria (SGA).
Libera todo bloqueio (lock) causado pelo
cursor.
Existe um limite mximo de cursores que
podem ser abertos no SGBD Oracle.
Um cursor automaticamente fechado
quando o seu escopo abandonado.
At r i but os de Cur sor es
Nome Descrio
%FOUND retorna TRUE se o registro foi
recuperado com sucesso
%NOTFOUND recupera TRUE se o registro no foi
recuperado com sucesso
%ROWCOUNT retorna o nmero de registros
recuperados at o momento
%ISOPEN retorna TRUE se o cursor estiver
aberto
At r i but os de Cur sor es
%FOUND
OPEN pedido_ OPEN pedido_cur cur; ;
FETCH pedido_ FETCH pedido_cur cur I NTO pedido_id, empresa_id; I NTO pedido_id, empresa_id;
I F pedido_ I F pedido_cur cur%FOUND THEN %FOUND THEN
:pedido.num_pedidos := :pedido.num_pedidos + 1; :pedido.num_pedidos := :pedido.num_pedidos + 1;
END I F; END I F;
... ...
At r i but os de Cur sor es
%NOTFOUND
Oposto ao %FOUND Oposto ao %FOUND
Muito utilizado para terminao de Muito utilizado para terminao de loops loops
EXI T WHEN empresa_cur%NOTFOUND;
At r i but os de Cur sor es
%ROWCOUNT
DECLARE DECLARE
CURSOR CURSOR emp emp_ _cur cur I S I S
SELECT nome, SELECT nome, salario salario
FROM empregado FROM empregado
ORDER BY ORDER BY salario salario DESC; DESC;
emp emp_ _reg emp reg emp_ _cur cur%ROWTYPE; %ROWTYPE;
BEGI N BEGI N
OPEN OPEN emp emp_ _cur cur; ;
LOOP LOOP
FETCH FETCH emp emp_ _cur cur I NTO I NTO emp emp_ _reg reg; ;
EXI T WHEN EXI T WHEN emp emp_ _cur cur%ROWCOUNT > 10 OR %ROWCOUNT > 10 OR
emp emp_ _cur cur%NOTFOUND; %NOTFOUND;
DBMS_OUTPUT.PUT_LI NE( DBMS_OUTPUT.PUT_LI NE(emp emp_ _reg reg.nome | | .nome | | - - | | | |
emp emp_ _reg reg. .salario salario); );
END LOOP; END LOOP;
END; END;
At r i but os de Cur sor es
%I SOPEN
I F NOT I F NOT emp emp_ _cur cur%I SOPEN THEN %I SOPEN THEN
OPEN OPEN emp emp_ _cur cur; ;
END I F; END I F;
At r i but os de Cur sor es I mpl c i t os
Quando o RDBMS abre um cursor ou
executa um insert, update ou delete, ele
torna uma das seguintes variveis
habilitadas:
SQL%FOUND SQL%FOUND
SQL%NOTFOUND SQL%NOTFOUND
SQL%ROWCOUNT SQL%ROWCOUNT
SQL%I SOPEN SQL%I SOPEN
Par met r os em Cur sor es
Um parmetro faz com que um cursor se torne
mais reutilizvel.
DECLARE DECLARE
CURSOR empresa_ CURSOR empresa_cur cur (categoria_in VARCHAR2) (categoria_in VARCHAR2)
I S I S
SELECT nome, categoria, contato SELECT nome, categoria, contato
FROM empresa FROM empresa
WHERE categoria = UPPER(categoria_in); WHERE categoria = UPPER(categoria_in);
Podemos definir um valor padro para um
parmetro.
CURSOR CURSOR emp emp_ _cur cur( (emp emp_in NUMBER := 0) _in NUMBER := 0)
SELECT ... FOR UPDATE
Quando um comando SELECT ... FOR
UPDATE executado, o Oracle
automaticamente bloqueia a linha de
maneira exclusiva
Ningum conseguir alterar estes registros Ningum conseguir alterar estes registros
antes de um ROLLBACK ou COMMI T antes de um ROLLBACK ou COMMI T
CURSOR CURSOR emp emp_ _cur cur I S I S
SELECT nome, SELECT nome, salario salario
FROM empregado FROM empregado
WHERE WHERE salario salario < 100 < 100
FOR UPDATE FOR UPDATE
WHERE CURRENT OF
Esta clusula utilizada para comandos
DELETE e UPDATE dentro de um cursor.
O registro mais recentemente recuperado O registro mais recentemente recuperado
apagado ou atualizado apagado ou atualizado
Exemplo: Exemplo:
FETCH FETCH emp emp_ _cur cur I NTO I NTO emp emp_ _reg reg; ;
... ...
UPDATE empregado SET UPDATE empregado SET salario salario := := salario salario + + bonus bonus
WHERE CURRENT_OF WHERE CURRENT_OF emp emp_ _cur cur; ;
Var i vei s Cur sor es
Disponvel a partir das releases 2.2 e 2.3.
Possibilidade de passar como parmetro o
resultado de consultas para outros
programas.
Variveis cursores so como ponteiros do
C ou Pascal, na qual um endereo de
memria assinalado. Declarando uma
varivel cursor se cria um ponteiro, no
um objeto.
Por que usar var i vei s c ur sor ?
Usa-se uma varivel cursor para passar o
resultado de uma query entre stored
subprograms e aplicaes client.
Por exemplo, uma aplicao Client, Oracle
Forms, e Oracle Server podem ambos se
referenciar mesma rea de trabalho.
Var i vei s Cur sor es
OPEN cursor
OPEN cursor
FETCH reg1
FETCH reg1
CLOSE cursor
CLOSE cursor
FETCH reg2
FETCH reg2
FETCH reg3
FETCH reg3
Var i vei s Cur sor es
Exemplo
DECLARE DECLARE
TYPE empresa_ TYPE empresa_curtipo curtipo I S REF CURSOR I S REF CURSOR
RETURN empresa%ROWTYPE; RETURN empresa%ROWTYPE;
empresa_curvar empresa_ empresa_curvar empresa_curtipo curtipo; ;
BEGI N BEGI N
OPEN empresa_curvar FOR SELECT * OPEN empresa_curvar FOR SELECT *
FROM empresa; FROM empresa;
... ...
Def i ni ndo uma Var i vel Cur sor
TYPE ref_type_name I S REF CURSOR
RETURN return_type;
onde onde ref ref_ _type type_ _name name o nome da varivel o nome da varivel
especificada para uso subsequente e especificada para uso subsequente e return return_ _type type
deve representar um deve representar um record record ou uma ou uma row row na tabela. na tabela.
Exemplo: Exemplo:
DECLARE DECLARE
TYPE TYPE DeptCurTyp DeptCurTyp I S REF CURSOR I S REF CURSOR
RETURN RETURN dept dept %ROWTYPE; %ROWTYPE;
Em uma St or ed Pr oc edur e
CREATE PACKAGE emp_data AS
TYPE GenericCurTyp I S REF CURSOR;
TYPE EmpCurTyp I S REF CURSOR
RETURN emp%ROWTYPE;
PROCEDURE open_emp_cv
(emp_cv I N OUT EmpCurTyp,
choice I N NUMBER);
END emp_data;
Em uma St or ed Pr oc edur e
(c ont i nua o...)
CREATE PACKAGE BODY emp_data AS
PROCEDURE open_emp_cv
(emp_cv I N OUT EmpCurTyp,
choice I N NUMBER) I S
BEGI N
I F choice = 1 THEN
OPEN emp_cv FOR SELECT * FROMemp
WHERE comm I S NOT
NULL;
ELSI F choice = 2 THEN
OPEN emp_cv FOR SELECT * FROMemp
WHERE sal > 2500;
ELSI F choice = 3 THEN
OPEN emp_cv FOR SELECT * FROMemp
WHERE deptno = 20;
END I F;
END open_emp_cv;
END emp_data;
Loop Si mpl es par a Cur sor es
As instrues devem ser feitas
explicitamente:
Abrir o cursor Abrir o cursor
Colocar o Colocar o fetch fetch dentro do dentro do loop loop
Estabelecer a condio para fim do Estabelecer a condio para fim do loop loop
Fechar o cursor Fechar o cursor
Requer maior ateno do desenvolvedor
Maior possibilidade de ocorrer erro
Loop Si mpl es par a Cur sor es
Exemplo
DECLARE
CURSOR cur_emp IS ...
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO ...
EXIT WHEN cur_emp%NOTFOUND;
-- processar informaes do cursor
END LOOP;
CLOSE cur_emp;
END;
Loop FOR par a Cur sor es
FOR indice_registro I N nome_cursor
LOOP
<comandos>
END LOOP;
O O loop loop termina incondicionalmente quando termina incondicionalmente quando
todos os registros do cursor forem todos os registros do cursor forem
recuperados recuperados
A cada execuo do A cada execuo do loop loop, o PL/ SQL verifica o , o PL/ SQL verifica o
atributo %NOTFOUND atributo %NOTFOUND
Loop FOR par a Cur sor es
Exemplo
DECLARE DECLARE
CURSOR CURSOR ocupacao ocupacao_ _cur cur I S I S
SELECT SELECT hosp hosp_id, _id, nm nm_quarto _quarto
FROM FROM ocupacao ocupacao WHERE WHERE dt dt _ _ocupacao ocupacao = SYSDATE; = SYSDATE;
BEGI N BEGI N
FOR FOR ocupacao ocupacao_ _reg reg I N I N ocupacao ocupacao_ _cur cur
LOOP LOOP
atualiza_nota( atualiza_nota(ocupacao ocupacao_ _reg reg. .hosp hosp_id, _id,
ocupacao ocupacao_ _reg reg. .nm nm_quarto); _quarto);
END LOOP; END LOOP;
END; END;
Loop FOR par a Cur sor es
Quando usar:
quando desejamos recuperar e processar quando desejamos recuperar e processar
todos os registros do cursor todos os registros do cursor
no apropriado situaes em que no apropriado situaes em que
condies devem ser avaliadas para condies devem ser avaliadas para
determinar o trmino da operao de determinar o trmino da operao de
recuperao recuperao
Observao
o ndice do o ndice do loop loop, neste caso uma varivel do , neste caso uma varivel do
tipo registro, encarado da mesma forma tipo registro, encarado da mesma forma
que ndices numricos que ndices numricos
Ex er c c i o I I .1
Liste os 3 departamentos com maior folha
(soma dos salrios dos empregados), em
ordem decrescente.
Sugesto:
Utilize as tabelas Utilize as tabelas dept dept e e emp emp (SCOTT/ TI GER) (SCOTT/ TI GER)
utilize o procedimento utilize o procedimento
DBMS_OUTPUT.PUT_LI NE DBMS_OUTPUT.PUT_LI NE
Ex er c c i o I I .2
De acordo com o salrio de um
empregado, calcule o imposto de renda
correspondente.
Sugestes
Utilize a tabela Utilize a tabela emp emp SCOTT/ TI GER SCOTT/ TI GER
No considere possveis dedues No considere possveis dedues
Obs.:
salario salario < 900 < 900 - - isento isento
salario salario > 900 e <= 1800 > 900 e <= 1800 - - 15% 15% - - R$135 R$135
salario salario > 1800 > 1800 - - 25% 25% - - R$315 R$315
Ex er c c i o I I .3
Calcular o total de salrios pagos (salrio
+ comisso) para empregados de um
departamento. Determinar tambm
quantos empregados tem salrio maior
que $2000 e quantos tem a comisso
maior que o salrio.
Subpr ogr amas:
Pr oc edi ment os e Fun es
Conc ei t os
Modularizao
processo de quebrar grandes blocos de processo de quebrar grandes blocos de
cdigo em pequenos pedaos (mdulos) cdigo em pequenos pedaos (mdulos)
torna o cdigo: torna o cdigo:
mais reutilizvel
mais fcil de gerenciar
mais legvel
mais confivel
Conc ei t os
Estruturas para Modularizao
(PL/ SQL):
procedimento procedimento
bloco que efetua uma ou mais aes, sendo
possvel a passagem de informaes, tanto
para dentro quanto para fora do procedimento
funo funo
retorna um nico valor; podemos passar
informaes para a funo atravs de
parmetros
Conc ei t os
bloco annimo bloco annimo
bloco PL/ SQL que efetua uma ou mais tarefas;
usado para controlar o escopo dos
identificadores e manuseio de exceptions
package package
coleo de procedimentos, funes, tipos e
variveis; no exatamente um mdulo, mas
est relacionado ao assunto
Est r ut ur a do Bl oc o PL/SQL (Revi so)
Cabealho
Cabealho
IS
Seo de Declarao
Seo de Declarao
BEGIN
Seo de Execuo
Seo de Execuo
EXCEPTION
Seo de Exceptions
Seo de Exceptions
END;
DECLARE
Seo de Declarao
Seo de Declarao
BEGIN
Seo de Execuo
Seo de Execuo
EXCEPTION
Seo de Exceptions
Seo de Exceptions
END;
Est r ut ur a de Bl oc os PL/SQL
PROCEDURE contratar(nome_in IN VARCHAR2)
IS
data_contratacao DATE;
BEGIN
data_contratacao := SYSDATE - 2;
INSERT INTO empregado (nome, data_contratacao)
VALUES (nome_in, data_contratacao);
WHEN DUP_VAL_IN_INDEX
THEN
DBMS_OUTPUT.PUT_LINE( No inseriu );
EXCEPTION
END;
Esc opo (Revi so)
DECLARE
data_contratacao DATE;
BEGIN
END;
DECLARE
data_contratacao DATE;
BEGIN
END;
DECLARE
total_vendas NUMBER;
BEGIN
END;
DECLARE
total_vendas NUMBER;
BEGIN
END;
escopo de
total_vendas
escopo de
total_vendas
escopo de
data_contratacao
escopo de
data_contratacao
Pr oc edi ment os
Estrutura
PROCEDURE <nome> [ (parmetro [ , PROCEDURE <nome> [ (parmetro [ ,
parmetro ...] ) ] parmetro ...] ) ]
I S I S
[ comandos de declarao] [ comandos de declarao]
BEGI N BEGI N
<comandos> <comandos>
[ EXCEPTI ON [ EXCEPTI ON
<comandos para manuseio de <comandos para manuseio de
exceptions exceptions> ] > ]
END [ nome] ; END [ nome] ;
Pr oc edi ment os
Chamada
um procedimento chamado da mesma um procedimento chamado da mesma
maneira que um comando PL/ SQL maneira que um comando PL/ SQL
aplicar_desconto(nova_empr_id, 15.00);
Pr oc edi ment os
Cabealho
nome do procedimento e lista de parmetros nome do procedimento e lista de parmetros
PROCEDURE aplicar_desconto(empr_id_in I N
empresa.empr_id%TYPE, desconto_in I N
NUMBER)
Corpo
cdigo necessrio para a execuo do cdigo necessrio para a execuo do
procedimento procedimento
PROCEDURE nada I S
BEGI N
NULL;
END;
Ex empl o de Pr oc edur e
PROCEDURE raise_salary (emp_id INTEGER, increase REAL)
IS
current_salary REAL;
salary_missing EXCEPTION;
BEGIN
SELECT sal INTO current_salary FROM emp
WHERE empno = emp_id;
IF current_salary IS NULL THEN
RAISE salary_missing;
ELSE
UPDATE emp SET sal = sal + increase
WHERE empno = emp_id;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO emp_audit VALUES (emp_id, No such number );
WHEN salary_missing THEN
INSERT INTO emp_audit VALUES (emp_id, Salary is null );
END raise_salary;
Fun es
Estrutura
FUNCTI ON nome [ (parmetro [ , parmetro FUNCTI ON nome [ (parmetro [ , parmetro
...] ) ] ...] ) ]
RETURN tipo_retornado RETURN tipo_retornado
I S I S
[ comandos de declarao] [ comandos de declarao]
BEGI N BEGI N
comandos comandos
[ EXCEPTI ON [ EXCEPTI ON
comandos para manuseio de comandos para manuseio de exceptions exceptions] ]
END [ nome] END [ nome]
Fun es
Chamada
uma funo chamada como parte de um uma funo chamada como parte de um
comando, sempre que uma expresso pode comando, sempre que uma expresso pode
ser usada ser usada
vendas_95 := total_vendas( Marisol , 1995);
DECLARE
vendas_95 NUMBER DEFAULT
total_vendas( Marisol , 1995);
I F total_vendas( Marisol , 1995)
THEN ...
Fun es
Cabealho
nome da funo, lista de parmetros e nome da funo, lista de parmetros e
tipo do retorno tipo do retorno
FUNCTI ON total_vendas(nome_in I N
empresa.nome%TYPE, ano_in pedido.ano%TYPE)
RETURN NUMBER;
Corpo
cdigo necessrio para a execuo da funo cdigo necessrio para a execuo da funo
FUNCTI ON nada RETURN BOOLEAN I S
BEGI N
RETURN TRUE;
END;
Dec l ar a o RETURN
Encerra a execuo da funo e retorna o
valor para o programa que a chamou.
Um subprograma pode conter vrias
declaraes RETURN.
Em procedures a declarao RETURN no
deve conter uma expresso.
Em funes a declarao RETURN deve
conter uma expresso que executada no
momento da execuo da declarao.
Ex empl o de Fun o
FUNCTION sal_ok (salary REAL, title REAL) RETURN BOOLEAN
IS
min_sal REAL;
max_sal REAL;
BEGIN
SELECT losal, hisal INTO min_sal, max_sal
FROM sals
WHERE job = title;
RETURN (salary >= min_sal) AND (salary <= max_sal);
END sal_ok;
Par met r os
Modo de troca de informaes entre o
mdulo e o bloco PL/ SQL que o chamou.
Quando declaramos um parmetro, nunca
especificamos restries quanto ao
tamanho do tipo de dado.
PROCEDURE mostra_empresa(nome I N PROCEDURE mostra_empresa(nome I N
VARCHAR2) I S VARCHAR2) I S
permitida a utilizao de %TYPE e
%ROWTYPE na declarao de parmetros
Modo de Passagem de Par met r os
I N
somente para leitura somente para leitura
OUT
somente para escrita (o mdulo pode atribuir somente para escrita (o mdulo pode atribuir
um valor ao parmetro, que ser passado ao um valor ao parmetro, que ser passado ao
bloco PL/ SQL que o chamou) bloco PL/ SQL que o chamou)
I N OUT
usado para leitura e escrita usado para leitura e escrita
Passagem de Par met r os
PROCEDURE combine_formate_nomes (prim_nome I N OUT VARCHAR2,
ult_nome I N OUT VARCHAR2,
nome_comp OUT VARCHAR2,
formato I N VARCHAR2 := ULTI MO PRI MEI RO)
-- O parmetro formato no precisa obrigatoriamente ser informado
I S
BEGI N
I F formato = ULTI MO PRI MEI RO THEN
nome_comp := ult_nome | | , | | prim_nome
ELSI F formato = PRI MEI RO ULTI MO THEN
nome_comp := prim_nome | | | | ult_nome;
END I F;
END;
Como o PL/SQL f az a assoc i a o dos
par met r os?
Notao Posicional
associa o valor ao parmetro correspondente associa o valor ao parmetro correspondente
implicitamente atravs da posio implicitamente atravs da posio
Notao por Nome Explicitamente
associa um valor a um parmetro associa um valor a um parmetro
explicitamente atravs do seu nome explicitamente atravs do seu nome
vendas_97 := total_vendas(nome_in => Cia. JK,
ano_in => 1997);
vendas_97 := total_vendas(ano_in => 1997,
nome_in => Cia. JK);
St or ed Pr oc edur es/Func t i ons
Uma stored procedure ou stored function
uma unidade de programa PL/ SQL que:
tem um nome tem um nome
pode receber e retornar valores pode receber e retornar valores
fica armazenada no dicionrio de dados fica armazenada no dicionrio de dados
pode ser usada por vrios usurios pode ser usada por vrios usurios
St or ed Pr oc edur es/Func t i ons
CREATE PROCEDURE recupera_emp_reg
(emp_numero IN emp.empno%TYPE,
emp_reg OUT emp%ROWTYPE) AS
BEGIN
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
INTO emp_ret
FROMemp
WHERE empno = emp_numero;
END;
Exemplo:
Mdul o Loc al
Procedimento ou funo definido da seo
de declarao de um bloco PL/ SQL.
No pode ser chamado por nenhum outro
mdulo PL/ SQL definido fora do bloco ao
qual o mesmo pertence.
Vantagens
reduz o tamanho do mdulo, eliminando reduz o tamanho do mdulo, eliminando
cdigos repetitivos cdigos repetitivos
torna o cdigo mais legvel torna o cdigo mais legvel
Ex empl o de Mdul os Loc ai s
DECLARE
rent REAL;
PROCEDURE raise_rent (increase IN OUT REAL) IS
BEGIN
rent := rent + increase;
...
END raise_rent;
...
BEGIN
...
raise_rent(rent); indeterminate
Dependnc i as dos Subpr ogr amas
Subprogramas so dependentes dos
objetos que referenciam
Caso algum destes objetos forem
alterados por uma operao DDL, o
subprograma fica com status I NVALI D e
deve ser recompilado
ALTER {PROCEDURE | FUNCTION} nome COMPILE;
Determinao de dependncia (no
I NI T.ORA)
Timestamp Timestamp
Assinatura Assinatura
Pr i vi l gi os de Ac esso
Para poder executar um subprograma
necessrio ter o privilgio EXECUTE para
o objeto.
Um subprograma executado utilizando
os privilgios explcitos do seu owner, sem
considerar privilgios de roles.
Pac k ages
Conc ei t os
Uma package um conjunto de objetos
PL/ SQL que so empacotados com uma
sintaxe especial de BEGI N-END.
Podemos colocar em uma package:
cursores cursores
variveis variveis
nomes de nomes de exceptions exceptions
comandos TYPE comandos TYPE
procedimentos e funes procedimentos e funes
Conc ei t os
Vantagens de utilizarmos packages:
information hiding information hiding
projeto orientado a objetos projeto orientado a objetos
projeto projeto top top- -down down
persistncia de objetos persistncia de objetos
melhor performance melhor performance
I nt er f ac e
Aplicao
Body
Especificao
DataBase
Package
Est r ut ur a de uma Pac k age
Especificao
contm as definies e especificaes de contm as definies e especificaes de
todos os elementos em uma todos os elementos em uma package package que que
podem ser referenciados fora dela. podem ser referenciados fora dela.
PACKAGE nome_package I S
[ declaraes de variveis e tipos ]
[ declaraes de cursores ]
[ declaraes de mdulos ]
END [ nome_package] ;
Est r ut ur a de uma Pac k age
Corpo
contm implementao de mdulos, cursores contm implementao de mdulos, cursores
e outros objetos e outros objetos
PACKAGE BODY nome_package I S
[ declaraes de variveis e tipos ]
[ especificaao de comandos SELECT de cursores ]
[ especificao do corpo de mdulos ]
[ BEGI N
comandos executveis ]
[ EXCEPTI ON
exception handlers ]
END [ nome_package] ;
Ex empl o Pac k age - Espec i f i c a o
CREATE PACKAGE emp_actions AS specification
TYPE EmpRecTyp IS RECORD (emp_id INTEGER, salary REAL);
CURSOR desc_salary RETURN EmpRecTyp;
PROCEDURE hire_employee (ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER);
PROCEDURE fire_employee (emp_id NUMBER);
END emp_actions;
Ex empl o Pac k age - Body
CREATE PACKAGE BODY emp_actions
AS
CURSOR desc_salary RETURN EmpRecTyp IS
SELECT empno, sal FROM emp ORDER BY sal DESC;
PROCEDURE hire_employee (ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER)
IS
BEGIN
INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job,
mgr, SYSDATE, sal, comm, deptno);
END hire_employee;
PROCEDURE fire_employee (emp_id NUMBER)
IS
BEGIN
DELETE FROM emp WHERE empno = emp_id;
END fire_employee;
END emp_actions;
Pac k ages e Esc opo
Objetos declarados na Package
Specification tm escopo pblico,
podendo ser utilizados fora da package
nome_da_package.nome_do_subprograma (...)
nome_da_package.nome_do_tipo
Aqueles objetos definidos somente no
Package Body tm escopo privado,
podendo somente ser utilizados por
outros objetos dentro da package
FUNCTION valor_ok(numero_in IN NUMBER)
RETURN BOOLEAN
IS
BEGIN
RETURN numero_in > 0;
END;
FUNCTION valor_ok(data_in IN DATE)
RETURN BOOLEAN
IS
BEGIN
RETURN date_in <= SYSDATE;
END;
Over l oadi ng de Mdul os
Dois ou mais mdulos podem ter o mesmo
nome com uma lista diferente de parmetros
Over l oadi ng de Mdul os
Onde Fazer?
na seo de declarao de um bloco PL/ SQL na seo de declarao de um bloco PL/ SQL
dentro de um dentro de um package package
No podemos fazer a sobrecarga de
nomes de programas independentes,
muito menos criar dois mdulos
independentes com o mesmo nome e
listas de parmetros distintas.
Ex empl o
DECLARE
TYPE DateTabTyp IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
TYPE RealTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
hiredate_tab DateTabTyp;
comm_tab RealTabTyp;
indx BINARY_INTEGER;
...
BEGIN
indx := 50;
initialize(hiredate_tab, indx); calls first version
initialize(comm_tab, indx); calls second version
...
END;
I ni c i al i za o de Pac k ages
Uma package pode conter um conjunto
de instrues a serem executadas
somente quando a mesma carregada
para a memria
CREATE OR REPLACE PACKAGE BODY nome_ CREATE OR REPLACE PACKAGE BODY nome_pack pack AS AS
... ...
BEGIN BEGIN
-- -- Cdigo de inicializao Cdigo de inicializao
... ...
END nome_ END nome_pack pack; ;
Dependnc i as de Pac k ages
O Package Body depende da Package
Specification e dos objetos referenciados
A Package Specification no depende de
nada
Vises para dependncias no PL/ SQL 8.0:
user user_ _dependencies dependencies
all all_ _dependencies dependencies
dba dba_ _dependencies dependencies
Ut i l i za o de St or ed Func t i ons em
i nst r u es SQL
Uma funo independente ou contida
numa package pode ser chamada numa
instruo SQL, dependendo das restries
de referncia
Restries de Referncia: definem quais
tipos de estruturas de dados que a funo
l ou modifica
WNDS ( WNDS (Writes Writes No Database No Database State State) )
RNDS ( RNDS (Reads Reads No Database No Database State State) )
WNPS ( WNPS (Writes Writes No No Package State Package State) )
RNPS ( RNPS (Reads Reads No No Package State Package State) )
Ut i l i za o de St or ed Func t i ons em
i nst r u es SQL
Somente para Stored Functions
Parmetros
devem ser somente de entrada devem ser somente de entrada
no podem utilizar tipos PL/ SQL ( no podem utilizar tipos PL/ SQL (boolean boolean, ,
record record) )
Tipo de retorno da funo tambm tem
que ser um tipo da base de dados
RESTRI CT_REFERENCES
Para funes independentes o PL/ SQL
consegue determinar as restries de
referncia.
Para funes em packages necessrio
discriminar as restries atravs da
pragma abaixo. I sto porque os blocos
PL/ SQL que chamam uma funo
empacotada dependem apenas da
package specification e no do body.
PRAGMA RESTRICT_REFERENCES (nome_funo, WNDS PRAGMA RESTRICT_REFERENCES (nome_funo, WNDS
[,WNPS] [,RNDS] [,RNPS]); [,WNPS] [,RNDS] [,RNPS]);
Al gumas Pac k ages Pr -Def i ni das
Nome Descrio
DBMS_DDL execuo de comandos DDL
DBMS_JOB submete e gerencia jobs programados
dentro do database
DBMS_OUTPUT mostra sadas de programas PL/SQL
no terminal
DBMS_SNAPSHOT gerenciamento de snapshots
DBMS_SQL construo de SQLs dinmicos
UTL_FILE permite que programas PL/SQL leiam
e escrevam em arquivos
Ex er c c i o I I I .1
Converta o script criado no exerccio I .2
(razes de uma equao do 2
o
grau) para
um procedimento.
Armazene este procedimento no banco.
Ex er c c i o I I I .2
Converta o script do exerccio I I .1 (trs
departamentos com maior folha - soma de
salrios) para um procedimento.
Ao invs de mostrar as informaes na
tela, insira-as em uma tabela.
Armazene este procedimento no banco
(stored procedure).
Ex er c c i o I I I .3
Converta o script do exerccio I I .2 (clculo
do imposto renda) para uma funo, que
receba como parmetro a matrcula do
funcionrio e retorne o imposto a ser
pago.
Armazene esta funo no banco (stored
function).
Ex er c c i o I I I .4
Construa uma package contendo as funes
/ procedimentos do departamento pessoal.
Armazene esta package no banco de dados
Oracle.
Salrio Lquido = SAL+COMM - I mposto de
Renda
COMM = Se o JOB= CLERK, comisso =
1.03 * SAL
Gravar em Contra-Cheque (salrio normal,
comisso, imposto de renda e salrio
Lquido)
Tr i gger s
Tr i gger s
Correspondem a stored procedures, com
a diferena que os triggers so disparados
automaticamente quando houver
operaes de insert, update e delete nas
tabelas associadas.
Tr i gger s
As aplicaes de triggers incluem:
clculo automtico de colunas clculo automtico de colunas
crtica de transaes crtica de transaes
garantia de regras de segurana complexas garantia de regras de segurana complexas
garantia de integridade referencial em bancos garantia de integridade referencial em bancos
de dados distribudos de dados distribudos
implementao de regras de negcio implementao de regras de negcio
complexas complexas
Si nt ax e
CREATE OR REPLACE schema.trigger
[BEFORE|AFTER] DELETE OR INSERT OR UPDATE [OF
column]
ON schema.table
[REFERENCING OLD AS old NEW AS new]
FOR EACH ROW
WHEN (condition)
pl_sql_block
Tr i gger i ng St at ement
a especificao da ao que levar ao
acionamento do trigger, podendo ser:
I NSERT I NSERT
UPDATE UPDATE
DELETE DELETE
Tr i gger Rest r i c t i on
uma expresso que limita a execuo
de um trigger.
Deve resultar em valor TRUE ou FALSE.
O trigger somente ser executado para
valores TRUE.
Tr i gger Ac t i on
um bloco PL/ SQL que ser executado
quando o trigger for acionado.
Ti pos de Tr i gger s
ROW TRI GGERS
so executados uma vez para cada linha so executados uma vez para cada linha
da tabela afetada pelo comando SQL. da tabela afetada pelo comando SQL.
STATEMENT TRI GGERS
so executados apenas uma vez para cada so executados apenas uma vez para cada
comando SQL que afete a tabelas, comando SQL que afete a tabelas,
independentemente do nmero de linhas independentemente do nmero de linhas
envolvidas. envolvidas.
Ac i onament o de Tr i gger s
Quando definimos um trigger, podemos
especificar quando ele ser acionado:
before row before row
before statement before statement
after row after row
after statement after statement
Tr i gger s (Ex empl o)
CREATE TRI GGER dummy
BEFORE DELETE OR I NSERT OR UPDATE ON emp
FOR EACH ROW
WHEN (new.empno > 0)
DECLARE
/ * variveis, constantes, cursores, etc. * /
BEGI N
/ * bloco PL/ SQL * /
END;
Li mi t e de Tr i gger s por Tabel a
Um de cada tipo, totalizando at 12
triggers. No entanto no PL/ SQL 2.1 uma
tabela pode ter mais de um trigger de
cada tipo.
BEFORE UPDATE BEFORE UPDATE row row AFTER UPDATE AFTER UPDATE row row
BEFORE DELETE BEFORE DELETE row row AFTER DELETE AFTER DELETE row row
BEFORE INSERT BEFORE INSERT statement statement AFTER INSERT AFTER INSERT statement statement
BEFORE INSERT BEFORE INSERT row row AFTER INSERT AFTER INSERT row row
BEFORE UPDATE BEFORE UPDATE statement statement AFTER UPDATE AFTER UPDATE statement statement
BEFORE DELETE BEFORE DELETE statement statement AFTER DELETE AFTER DELETE statement statement. .
Tr i gger s i nst ead-of
Em PL/ SQL 8.0, podem ser definidos
triggers que sero disparados em vez da
instruo DML que os disparou
Somente para vises
A nvel de linha
Exemplo:
Para eliminar linhas de uma Para eliminar linhas de uma view view complexa complexa
Pseudo-r egi st r os
Disponvel para triggers a nvel de linha
:old
valores originais do registro da tabela valores originais do registro da tabela
somente para leitura no corpo do somente para leitura no corpo do trigger trigger
:new
valores do registro que sero inseridos ou valores do registro que sero inseridos ou
atualizados na base de dados atualizados na base de dados
podem ser atribudos valores (somente podem ser atribudos valores (somente
quando quando before before) )
Cl usul a WHEN
Vlida para triggers a nvel de linha
O corpo do trigger ser executado para as
linhas que a condio especificada
resultar em TRUE
Os pseudo-registros :old e :new podem
ser utilizados dentro da condio, mas os
dois pontos devem ser suprimidos
Pr edi c ados de Tr i gger
Usados em triggers disparados para
diferentes tipos de instrues de DML
Funes booleanas que identificam a
instruo que disparou o trigger
I NSERTI NG I NSERTI NG
UPDATI NG UPDATI NG
DELETI NG DELETI NG
Tr at ament o de Er r os
Conc ei t os
Uma exception uma situao que no
deveria ter ocorrido.
Pode ser causada por:
erro gerado pelo sistema (p.e. out of erro gerado pelo sistema (p.e. out of
memory memory ) )
erro causado por uma ao do usurio erro causado por uma ao do usurio
aviso gerado pela aplicao e direcionado ao aviso gerado pela aplicao e direcionado ao
usurio usurio
Ex c ept i on Handl er s
Este mecanismo permite separar o cdigo
de processamento de erros do resto dos
comandos.
Oferece um modelo orientado a eventos.
No importa como uma exception foi
gerada, ela ser tratada na mesma seo
(exception section).
Desvi o do Fl ux o
PROCEDURE fluxo
IS
novo_valor VARCHAR2(5);
BEGIN
novo_valor := valor_antigo || -novo ;
IF novo_valor LIKE open%
THEN
...
END IF;
EXCEPTION
WHEN VALUE_ERROR
THEN ...
END;
Ti pos de Ex c ept i ons
Existem quatro tipos de exceptions:
exceptions exceptions do sistema com um nome do sistema com um nome
geradas devido a um erro no processamento do
SGBD ou do cdigo PL/ SQL
definidas pelo programador com um nome definidas pelo programador com um nome
geradas devido a um erro no cdigo; elas so
declaradas na seo correspondente
Ti pos de Ex c ept i ons
Exceptions Exceptions do sistema sem um nome do sistema sem um nome
geradas devido a um erro no processamento do
SGBD ou do cdigo PL/ SQL; somente as mais
comuns possuem um nome
Definidas pelo programador sem um nome Definidas pelo programador sem um nome
procedimento RAI SE_APPLI CATI ON_ERROR
executado
o programador informa um nmero (-20000 a
20999) e uma mensagem de erro;
utilizada para facilitar a comunicao de erros do
ambiente cliente-servidor.
Ex c ept i ons do si st ema c om um nome
DECLARE
stmt INTEGER := 1; designates 1st SELECT statement
BEGIN
SELECT ...
stmt := 2; designates 2nd SELECT statement
SELECT ...
stmt := 3; designates 3rd SELECT statement
SELECT ...
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO errors VALUES ( Error in statement || stmt);
...
END;
Ex c ept i ons Pr -Def i ni das
Exception Name Oracle Error SQLCODE Value
CURSOR_ALREADY_OPEN ORA 06511 6511
DUP_VAL_ON_INDEX ORA 00001 1
INVALID_CURSOR ORA 01001 1001
INVALID_NUMBER ORA 01722 1722
LOGIN_DENIED ORA 01017 1017
NO_DATA_FOUND ORA 01403 +100
NOT_LOGGED_ON ORA 01012 1012
PROGRAM_ERROR ORA 06501 6501
ROWTYPE_MISMATCH ORA 06504 6504
STORAGE_ERROR ORA 06500 6500
TIMEOUT_ON_RESOURCE ORA 00051 51
TOO_MANY_ROWS ORA 01422 1422
VALUE_ERROR ORA 06502 6502
ZERO_DIVIDE ORA 01476 1476
Def i ni das pel o pr ogr amador c om um
nome
Diferente das exceptions pr-definidas, as
exceptions definidas pelo programador
devem ser declaradas e devem ser
chamadas explicitamente atravs da
declarao:
RAI SE RAI SE
Definindo a Exception:
DECLARE DECLARE
past_due EXCEPTI ON;
acct_num NUMBER(5);
Ex empl o
DECLARE
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
...
DECLARE incio do sub block
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
...
IF ... THEN
RAISE past_due; esta exception no
executada
END IF;
...
END; fim do sub-block
EXCEPTION
WHEN past_due THEN no usada
...
END;
EXCEPTI ON_I NI T pr agma
Pragma uma instruo especial ao
compilador
A EXCEPTI ON_I NI T pragma indica que o
compilador deve associar um nome a uma
exception que possui um nmero
correspondente.
EXCEPTI ON_I NI T pr agma
Exemplo
ORA ORA- -2292 2292 violated integrity constraining violated integrity constraining - - child child
record found record found
DECLARE
ainda_ha_empreg EXCEPTI ON;
PRAGMA EXCEPTI ON_I NI T (ainda_ha_empreg, -2292);
BEGI N
DELETE FROM empresa;
EXCEPTI ON
WHEN ainda_ha_empreg THEN
DBMS_OUTPUT.PUT_LI NE
( Ainda existem empregados para a empresa );
END;
Usando r ai se_appl i c at i on_er r or
A package DBMS_STANDARD, que vem
com o Oracle7, tem algumas facilidades
que ajudam a aplicao a interagir com o
Oracle. Por exemplo, a procedure
raise_application_error permite ao
programador definir uma mensagem de
erro ao seu modo.
continua...
Usando r ai se_appl i c at i on_er r or
raise_application_error(error_number,
message[, {TRUE | FALSE}]);
Onde error_ Onde error_number number um inteiro negativo entre um inteiro negativo entre - -
20000 .. 20000 .. - -20999 e 20999 e message message uma string de uma string de
caracter com at 2048 bytes. Se o terceiro caracter com at 2048 bytes. Se o terceiro
parmetro TRUE, o erro colocado em uma parmetro TRUE, o erro colocado em uma
pilha de erros. Se o parmetro FALSE ( pilha de erros. Se o parmetro FALSE (default default ), ),
o erro substitui todos os erros anteriores. o erro substitui todos os erros anteriores.
A chamada a A chamada a raise raise_ _application application_error somente _error somente
pode ser feita de uma pode ser feita de uma stored procedure stored procedure. Quando . Quando
chamada, o subprograma encerrado e o chamada, o subprograma encerrado e o
nmero do erro e a mensagem so retornados. nmero do erro e a mensagem so retornados.
Usando r ai se_appl i c at i on_er r or
CREATE PROCEDURE raise_salary (emp_id NUMBER, increase NUMBER)
AS
current_salary NUMBER;
BEGIN
SELECT sal INTO current_salary FROM emp
WHERE empno = emp_id;
IF current_salary IS NULL THEN
/* Issue user defined error message. */
raise_application_error( 20101, Salary is missing );
ELSE
UPDATE emp SET sal = current_salary + increase
WHERE empno = emp_id;
END IF;
END raise_salary;
Se o Ex c ept i on
EXCEPTION
WHEN exception_name1 THEN handler
sequence_of_statements1
WHEN exception_name2 THEN another
handler
sequence_of_statements2
...
WHEN OTHERS THEN optional handler
sequence_of_statements3
END;
Usando SQLCODE e SQLERRM
No tratamento de uma exception pode-se
usar as funes SQLCODE e SQLERRM
Para exceptions internas, o nmero do
SQLCODE negativo a menos que o erro
seja no_data_found que neste caso
+100.
O SQLERRM retorna a mensagem do
Oracle.
Ex empl o
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
INSERT INTO errors VALUES (err_num, err_msg);
END;
Ex er c c i o I V.1
Altere o script do exerccio I .1, incluindo a
seo de exception (prevendo o caso em
que o nmero informado for menor que
zero).
Ex er c c i o I V.2
Construa um script que faa uma consulta
simples base de dados (tabela scott.emp)
tomando como parmetro o nome do
funcionrio e retorne a sua matrcula.
Utilize o comando SELECT I NTO Utilize o comando SELECT I NTO
Pense na possibilidade do funcionrio no ser encontrado Pense na possibilidade do funcionrio no ser encontrado
Pense na possibilidade de existirem dois funcionrios com Pense na possibilidade de existirem dois funcionrios com
o mesmo nome o mesmo nome
Trate as demais Trate as demais exceptions exceptions de uma maneira genrica de uma maneira genrica
Ex er c c i o I V.3
Converta o script anterior (I V.2 - retorno
da matrcula do funcionrio dado um
nome) para uma procedimento (recebe o
nome, retorna a matrcula e um status
indicando se fez a recuperao com
sucesso, se no encontrou ou se existem
registros duplicados).
Armazene este procedimento no banco
(stored procedure).
Test es e Depur a o
Di r et r i zes de Depur a o
Encontrar o local onde ocorre o erro
Definir exatamente o problema
Reduzir o programa a um simples teste
Estabelecer um ambiente de teste
DBMS_OUTPUT
Pacote para mostrar mensagens
Procedure Descrio
enable Habilita o buffer de mensagens.
No SQL*Plus pode-se usar SET SERVEROUTPUT ON
disable Desabilita o buffer de mensagens
put_line Imprime uma linha no buffer
get_line Obtm uma linha do buffer (dentro do bloco PL/SQL)
get_lines Obtm todas as linhas do buffer (dentro do bloco PL/SQL)
Ex empl o de DBMS_OUTPUT
BEGI N
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LI NE( I ncio );
...
DBMS_OUTPUT.PUT_LI NE( Fim);
END;
Pr oc edur e Bui l der
Ambiente de desenvolvimento de PL/ SQL
Serve como depurador de cdigo PL/ SQL
No pode depurar stored procedures,
somente chamar
PL/SQL I nt er pr et er
Visualizador
Mostra o bloco, procedimento ou funo que Mostra o bloco, procedimento ou funo que
est sendo executado est sendo executado
Linha de comandos
Permite execuo imediata de instrues de Permite execuo imediata de instrues de
PL/ SQL PL/ SQL
Fac i l i dades
Depurar sem necessidade de alterar o
cdigo
I nsero de I nsero de breakpoints breakpoints
Visualizao e alterao dos valores das Visualizao e alterao dos valores das
variveis locais variveis locais
Depurao mais simples
Ambiente de desenvolvimento integrado
PL/SQL Di nmi c o
DBMS_SQL
A instruo SQL pode ser montada
dinamicamente dentro do bloco
Processa trs tipos de instrues
instrues de DML e DDL instrues de DML e DDL
consultas consultas
blocos de PL/ SQL annimos blocos de PL/ SQL annimos
I nstrues SELECT no devem possuir a
clusula I NTO
No incluir ponto e vrgula no final, exceto
blocos PL/ SQL annimos
DBMS_SQL.OPEN_CURSOR
Abre o cursor para executar a instruo
SQL atribuindo um I D para o cursor que
ser utilizado nas chamadas
subsequentes.
Sintaxe:
FUNCTION OPEN_CURSOR RETURN INTEGER;
DBMS_SQL.PARSE
Anlise da instruo
Verificao da sintaxe e semntica da Verificao da sintaxe e semntica da
instruo instruo
Se for uma consulta, determina o plano de Se for uma consulta, determina o plano de
execuo execuo
Sintaxe
PROCEDURE PARSE (cursor_id IN INTEGER,
instruo IN VARCHAR2,
indicador_linguagem IN
INTEGER);
onde onde indicador_linguagem indicador_linguagem pode ser pode ser V6, V7 ou V6, V7 ou
NATI VE. NATI VE.
DBMS_SQL.BI ND_VARI ABLE
Associao de variveis de entrada de
dados variveis reais do bloco PL/ SQL
Sintaxe
PROCEDURE BIND_VARIABLE PROCEDURE BIND_VARIABLE
(cursor_id IN INTEGER, (cursor_id IN INTEGER,
:nome_na_instruo IN :nome_na_instruo IN
VARCHAR2, VARCHAR2,
valor_para_atribuir IN valor_para_atribuir IN tipo_dado tipo_dado); );
onde tipo_dado pode ser NUMBER, onde tipo_dado pode ser NUMBER,
VARCHAR2 ou DATE. VARCHAR2 ou DATE.
H variaes para os demais tipos de
dado
DBMS_SQL.DEFI NE_COLUMN
Associao de variveis de sada de dados
(resultado de uma consulta) variveis
reais do bloco PL/ SQL
Sintaxe
PROCEDURE DEFINE_COLUMN
(cursor_id IN INTEGER,
posio_coluna IN INTEGER,
nome_coluna IN tipo_dado);
Uma instruo para cada coluna da
consulta
DBMS_SQL.EXECUTE
Para no consulta
executa a instruo e retorna o nmero de executa a instruo e retorna o nmero de
linhas processadas linhas processadas
Para consulta
determina o conjunto de linhas a serem determina o conjunto de linhas a serem
processadas processadas
Sintaxe
FUNCTION EXECUTE (cursor_id IN INTEGER)
RETURN INTEGER;
O retorno corresponde s linhas processadas O retorno corresponde s linhas processadas
somente se forem instrues I NSERT, somente se forem instrues I NSERT,
UPDATE ou DELETE. UPDATE ou DELETE.
DBMS_SQL.FETCH_ROWS
Somente usado em consultas
Faz o fetch buscando os dados no
servidor
Os dados de retorno so convertidos nos
tipos definidos com DEFI NE_COLUMN
Sintaxe
FUNCTION FETCH_ROWS (cursor_id IN INTEGER)
RETURN INTEGER;
O retorno o nmero de linhas. O retorno o nmero de linhas.
DBMS_SQL.EXECUTE_AND_FETCH
Combina as operaes de EXECUTE e a
primeira chamada de FETCH_ROWS
Sintaxe
FUNCTION EXECUTE_AND_FETCH
(cursor_id IN INTEGER,
busca_exata IN BOOLEAN DEFAULT FALSE)
RETURN INTEGER;
Se Se busca_exata busca_exata for TRUE e a consulta retornar for TRUE e a consulta retornar
mais de uma linha, abre a mais de uma linha, abre a exception exception
TOO_MANY_ROWS. TOO_MANY_ROWS.
O retorno o nmero de linhas. O retorno o nmero de linhas.
DBMS_SQL.VARI ABLE_VALUE
Determina o valor de uma varivel de
associao, se for modificada pela
instruo (parmetros de sada)
Utilizado quando a instruo um bloco
PL/ SQL
Sintaxe
PROCEDURE VARIABLE_VALUE
(cursor_id IN NUMBER,
:nome_na_instruo IN VARCHAR2,
valor_variavel OUT tipo_dado);
DBMS_SQL.COLUMN_VALUE
Somente usado em consultas, aps
FETCH_ROWS
Devolve realmente os dados
Variveis devem ser do mesmo tipo
definido em DEFI NE_COLUMN
Sintaxe
PROCEDURE COLUMN_VALUE
(cursor_id IN INTEGER,
posio_coluna IN INTEGER,
valor_coluna OUT tipo_dado);
DBMS_SQL.CLOSE_CURSOR
Fecha o cursor
Libera os recursos utilizados pelo cursor
Sintaxe
PROCEDURE CLOSE_CURSOR
(cursor_id IN OUT INTEGER)
Ex ec ut ar i nst r u es DML (ex c et o
c onsul t as)
Passos necessrios:
Abrir o cursor (OPEN_CURSOR) Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE) Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de Associar quaisquer variveis de entrada de
dados (BI ND_VARI ABLE) dados (BI ND_VARI ABLE)
Executar a instruo (EXECUTE) Executar a instruo (EXECUTE)
Fechar o cursor (CLOSE_CURSOR) Fechar o cursor (CLOSE_CURSOR)
Ex ec ut ar i nst r u es DDL
Passos necessrios:
Abrir o cursor (OPEN_CURSOR) Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE) Analisar a instruo (PARSE)
Fechar o cursor (CLOSE_CURSOR) Fechar o cursor (CLOSE_CURSOR)
No pode utilizar bind variables em DDL
As instrues so executadas j no
PARSE, no necessitando, assim, de
EXECUTE
Ex ec ut ar c onsul t as
Passos necessrios:
Abrir o cursor (OPEN_CURSOR) Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE) Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de dados Associar quaisquer variveis de entrada de dados
(BI ND_VARI ABLE) (BI ND_VARI ABLE)
Definir variveis de sada de dados Definir variveis de sada de dados
(DEFI NE_COLUMN) (DEFI NE_COLUMN)
Executar a consulta (EXECUTE) Executar a consulta (EXECUTE)
Extrair as linhas (FETCH_ROWS) Extrair as linhas (FETCH_ROWS)
Devolver os resultados s variveis PL/ SQL Devolver os resultados s variveis PL/ SQL
(COLUMN_VALUE) (COLUMN_VALUE)
Fechar o cursor (CLOSE_CURSOR) Fechar o cursor (CLOSE_CURSOR)
Ex ec ut ar PL/SQL
Passos necessrios:
Abrir o cursor (OPEN_CURSOR) Abrir o cursor (OPEN_CURSOR)
Analisar a instruo (PARSE) Analisar a instruo (PARSE)
Associar quaisquer variveis de entrada de Associar quaisquer variveis de entrada de
dados (BI ND_VARI ABLE) dados (BI ND_VARI ABLE)
Executar a instruo (EXECUTE) Executar a instruo (EXECUTE)
Obter o valor de quaisquer variveis de sada Obter o valor de quaisquer variveis de sada
de dados (VARI ABLE_VALUE) de dados (VARI ABLE_VALUE)
Fechar o cursor (CLOSE_CURSOR) Fechar o cursor (CLOSE_CURSOR)
Novas f ac i l i dades PL/SQL 8.0
Capacidade de analisar cadeias de
caracteres de SQL de grandes dimenses
Processamento matricial
Associar e definir tipos Oracle8 (objetos,
LOBs)
Procedimento DESCRI BE_COLUMNS
Sugest es e Tc ni c as
Reutilizar cursores
Um cursor aberto pode processar instrues Um cursor aberto pode processar instrues
SQL diferentes SQL diferentes
I nstrues repetidas no necessitam repetir o I nstrues repetidas no necessitam repetir o
PARSE, apenas o EXECUTE PARSE, apenas o EXECUTE
Permisses
Os perfis de grupo so desativados em Os perfis de grupo so desativados em
procedimentos empacotados, incluindo o procedimentos empacotados, incluindo o
DBMS_SQL DBMS_SQL
Operaes de DDL e lock
Ent r ada e Sada em Ar qui vos
PL/SQL I /O em Ar qui vos OS
A release 7.3 do Oracle Server adiciona a
capacidade de se fazer I / O atravs da package
UTL_FI LE.
I sto similar quelas operaes padres em
arquivos de sistemas operacionais (OPEN, GET,
PUT, CLOSE) com algumas limitaes.
Por exemplo, pode-se chamar a funo FOPEN
para retornar um arquivo aberto, no qual as
chamadas subsequentes aos comandos
GET_LI NE ou PUT so executados nos arquivos.
Enquanto no se fechar o arquivo (FCLOSE) as
operaes de I / O no estaro completas.
Pr oc edur es da Pac k age UTL_FI LE
Function/Procedure Description
FOPEN Abre um arquivo para entrada e sada
Cria um arquivo de sada se ele no existir
IS_OPEN Determina se um arquivo est aberto
FCLOSE Fecha um arquivo
FCLOSE_ALL Fecha todos os arquivos abertos
GET_LINE L uma linha texto de um arquivo aberto.
PUT Escreve uma linha no arquivo.
No adiciona um caracter de terminao (EOL)
PUT_LINE Escreve uma linha no arquivo.
Adiciona um caracter de terminao
PUTF Procedure com formatao.
NEW_LINE Escreve uma ou mais linhas de terminao no arquivo.
FFLUSH Escreve fisicamente todas as linhas pendentes para
o arquivo de sada.
Segur an a
O diretrio de acesso dos arquivos deve
ser especificado em um parmetro de
inicializao no arquivo I NI T.ORA
UTL_FI LE_DI R = < UTL_FI LE_DI R = < directory name directory name> >
A especificao do parmetro:
UTL_FI LE_DI R = * UTL_FI LE_DI R = *
torna sem efeito a segurana
Dec l ar a o de Ti pos
A especificao para a package UTL_FI LE
declarada no tipo:
TYPE file_ TYPE file_type type I S RECORD (id I S RECORD (id
BYNARY_I NTEGER) BYNARY_I NTEGER)
Exemplo: Exemplo:
v_filehandle UTL_FI LE.FI LE_TYPE;
...
v_filehandle := UTL_FI LE.FOPEN(...);
...
Ex c ept i ons
Exception Name Descrio
INVALID_PATH Localizao ou nome do arquivo invlido
INVALID_MODE Modo de abertura do arquivo invlido.
INVALID_FILEHANDLE Arquivo Invlido.
INVALID_OPERATION Arquivo no pode ser aberto.
READ_ERROR Um erro de sistema operacional
ocorreu durante leitura.
WRITE_ERROR Um erro de sistema operacional ocorreu
durante a escrita..
INTERNAL_ERROR Um erro no especificado ocorreu no PL/SQL.
FOPEN
Sintaxe:
FUNCTI ON FOPEN(location I N VARCHAR2,
filename I N VARCHAR2,
open_mode I N
VARCHAR2)
RETURN UTL_FI LE.FI LE_TYPE;
FOPEN
Parmetros Descrio
location Diretrio
filename Nome do Arquivo
open_mode r ler um texto (GET_LINE)
w escrever um texto
(PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH)
a adicionar um texto
(PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH)
Ret or no da Fun o FOPEN
FOPEN retorna um file handle que deve
ser passado para todas as procedures
chamadas posteriormente.
I S_OPEN
Sintaxe:
FUNCTION IS_OPEN(file_handle IN
FILE_TYPE)
RETURN BOOLEAN;
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
FCLOSE
Sintaxe:
PROCEDURE FCLOSE (file_handle IN OUT
FILE_TYPE);
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
FCLOSE_ALL
Sintaxe:
PROCEDURE FCLOSE_ALL;
GET_LI NE
Sintaxe:
PROCEDURE GET_LINE
(file_handle IN FILE_TYPE,
buffer OUT VARCHAR2);
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
buffer Um buffer para receber a linha lida do arquivo.
PUT
Sintaxe:
PROCEDURE PUT
(file_handle IN FILE_TYPE,
buffer IN VARCHAR2);
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
buffer Um buffer que contm a linha a ser escrita.
NEW_LI NE
Sintaxe:
PROCEDURE NEW_LINE
(file_handle IN FILE_TYPE,
lines IN NATURAL := 1);
Parametro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
lines Nmero de linhas de terminao a serem
escritas no arquivo.
PUT_LI NE
Sintaxe:
PROCEDURE PUT_LINE
(file_handle IN FILE_TYPE,
buffer IN VARCHAR2);
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
buffer Um buffer que contem a linha a ser escrita.
FFLUSH
Sintaxe:
PROCEDURE FFLUSH
(file_handle IN FILE_TYPE);
Parmetro Descrio
file_handle Um file handle ativo retornado na funo FOPEN
Ex empl o
PROCEDURE file_to_table
(loc_in I N VARCHAR2, file_in I N VARCHAR2,
table_in I N names_tabtype)
I S
names_file CONSTANT UTL_FI LE.FI LE_TYPE :=
UTL_FI LE.FOPEN (loc_in, file_in, R);
line_counter I NTEGER := 1;
BEGI N
LOOP
UTL_FI LE.GET_LI NE(names_file,
table_in(line_counter));
line_counter := line_counter + 1;
END LOOP;
EXCEPTI ON
WHEN NO_DATA_FOUND
THEN
UTL_FI LE.FCLOSE(names_file);
END;
Desempenho e Ot i mi za o
I nst nc i a Or ac l e
SGA: Sistem Global Area
Shared Pool
Armazena instrues SQL recebidas do BD Armazena instrues SQL recebidas do BD
Triggers Triggers
manter o cdigo o mais pequeno possvel, atravs
de chamadas de subprogramas armazenados
antes da verso 7.3 os triggers no eram
armazenados de forma compilada
Ot i mi za o de i nst r u es SQL
Explain Plan
Tabela Tabela plan plan_ _table table
Pode ser criada localmente atravs de
$ORACLE_HOME\ rdbms\ admin\ utlxplan.sql
No SQL* No SQL* Plus Plus
SET AUTOTRACE ON
Aps cada instruo faz automaticamente o
explain plan
Ot i mi za o de i nst r u es SQL
Tkprof
ALTER SESSI ON SET SQL_TRACE=TRUE ALTER SESSI ON SET SQL_TRACE=TRUE
gera um arquivo de log de todas as instrues
SQL, no formato ora_nnnnn.trc
Aps todos os comandos efetuados, fechar o Aps todos os comandos efetuados, fechar o
arquivo de arquivo de log log, alterando para FALSE , alterando para FALSE
Executar Executar tkprof tkprof para formatar o arquivo . para formatar o arquivo .trc trc
Anl i se de Resul t ados
NESTED LOOP
Operao necessria para executar os Operao necessria para executar os joins joins
de tabelas de tabelas
TABLE ACCESS (FULL)
Pesquisa integral, buscando todas as linhas Pesquisa integral, buscando todas as linhas
da tabela da tabela
TABLE ACCESS (BY ROWI D)
Modo mais rpido de buscar uma s linha Modo mais rpido de buscar uma s linha
I NDEX: { UNI QUE | RANGE} SCAN I NDEX: { UNI QUE | RANGE} SCAN
Tc ni c as
Verificar questes de rede
Utilizar PL/ SQL no Client sempre que
possvel
Evitar repeties de parse desnecessrias
I nterface matricial Oracle
permite grandes quantidades de dados permite grandes quantidades de dados
enviados pela rede como uma unidade enviados pela rede como uma unidade

Você também pode gostar