PL_SQL Parte IV
-
Upload
sator-discordiae -
Category
Documents
-
view
232 -
download
0
Transcript of PL_SQL Parte IV
-
7/24/2019 PL_SQL Parte IV
1/94
Estruturas deEstruturas deControleControle
-
7/24/2019 PL_SQL Parte IV
2/94
Elas podem ser combinadas de qualquer maneiranecessria para resolver um problema.
O PL/SQL d ao usurio recursos para controlar ofluxo de comandos de um programa condicional ouno.
Estruturas de ControleEstruturas de Controle
-
7/24/2019 PL_SQL Parte IV
3/94
O Comando IFO Comando IF
Permite executar uma sequncia de comandoscondicionalmente, isto , a sequncia executada ouno dependendo do valor da condio.
H trs formas de comando IF:
IF!H"#, IF!H"#"$%", IF!H"#"$%IF.
IF condio& !H"#
ao'"$%IF condio( !H"#
ao)'"$%"
ao)"#* IF+
-
7/24/2019 PL_SQL Parte IV
4/94
Loops e DesviosLoops e DesviosIncondicionaisIncondicionais
O comando LOOP permite executar uma sequncia decomandos m!ltiplas ve"es. # trs formas de loop$
% LOOP&% '#(LE LOOP&% )O* LOOP
-
7/24/2019 PL_SQL Parte IV
5/94
O Comando LOOPO Comando LOOP
forma mais simples do $--P estrutura $--P "#*$--P.
cada iterao do $--P a sequncia executada e ocontrole retorna ao $--P anterior correspondente.
uando o comando "/I! encontrado, o $--P termina e ocontrole passado para o pr0ximo comando ap0s o "#*
$--P.
-
7/24/2019 PL_SQL Parte IV
6/94
O Comando LOOPO Comando LOOPExemplo:
-- Este bloco calcula o fatorial de um dado nmero
DECLARE
numero NUMBER;
fatorial NUMBER;
BEGIN
ELEC! "numero IN!# numero$R#M dual;
fatorial %& numero;
I$ numero & '
!(EN fatorial %& );
ELE L##*
I$ numero + )
!(EN fatorial %& fatorial , numero -).; numero %& numero -);
ELE fatorial %& fatorial;
E/I!; --sai do loo0
END I$;
END L##*;
END I$;
DBM1#U!*U!2*U!1LINEfatorial.; -- Este comando mostra o resultado na tela2END;
-
7/24/2019 PL_SQL Parte IV
7/94
O Comando WHILE LOOPO Comando WHILE LOOP
+ssocia uma condi,o a uma sequncia de comandosdentro de uma estrutura LOOP % E- LOOP.
+ntes de cada itera,o& a condi,o avaliada& se forverdadeira& a sequncia executada.
Se for falsa& os comandos do LOOP no so executados
e o controle passado para o pr0ximo comando.
-
7/24/2019 PL_SQL Parte IV
8/94
O Comando FOR LOOPO Comando FOR LOOP
O comando )O* LOOP usado com o mesmo tipo deestrutura do LOOP simples& com a diferen,a de podermosdeterminar quantas ve"es a itera,o ocorrer& especificandoum limite de valores.
Sintaxe:
$#R contador IN menor13alor 22 maior13alor L##*
222
222END L##*;
O limite avaliado quando o )O* LOOPcome,a e nunca avaliado novamente.
-
7/24/2019 PL_SQL Parte IV
9/94
O Comando FOR LOOPO Comando FOR LOOP
Exemplo:
-- Este bloco mostra o 3alor do contador a cada itera45o
DECLARE
contador NUMBER;
BEGIN
$#R contador IN ) 22 6 L##*
DBM1#U!*U!2*U!1LINEcontador.;
END L##*;END;
-
7/24/2019 PL_SQL Parte IV
10/94
O Comando CASEO Comando CASE
- case um comando que retorna um resultado1aseado em uma ou mais alternativas.
*eclare condicao c2ar3(4 :5 %+ desc6condicao varc2ar(3&774+8e9in condicao :5 case condicao
2en % t2en %im 2en # t2en #o else #o *eclarado end+
"nd+
-
7/24/2019 PL_SQL Parte IV
11/94
O Comando CASEO Comando CASE
- comando ;%" tam1m pode ser utili
-
7/24/2019 PL_SQL Parte IV
12/94
Registros em PL/SLRegistros em PL/SL
*egistros em PL/SQL so variveis compostas que podemconter diversos valores simultaneamente.
9ada valor do registro pode ser acessado individualmente.9ada parte do registro denominada campo.
+ declara,o de um registro no PL/SQL feita atravs dotipo
-
7/24/2019 PL_SQL Parte IV
13/94
Registros em PL/SLRegistros em PL/SL
Os campos dentro do registro tero o nome e o tipo de dados iguais aos databela ou vie? referenciada na declara,o do registro.
identificador referncia
-
7/24/2019 PL_SQL Parte IV
14/94
CursoresCursoresExplcitosExplcitos
-
7/24/2019 PL_SQL Parte IV
15/94
Cursores E!pl"citosCursores E!pl"citos
Podem ser declarados em qualquer parte declarativa1 ap0sum E9L+*E4 de um bloco PL/SQL& subprograma ou pacote.
Podem retornar nen@uma& uma ou vrias lin@as.
Os comandos a seguir so destinados A manipula,o doscursores.
-
7/24/2019 PL_SQL Parte IV
16/94
Comando C#RSORComando C#RSORBsado para declarar um cursor explCcito. Parmetros podem serdefinidos para permitir a substitui,o de valores dentro da querDquando o cursor aberto.
Sintaxe$
-CUR#R nome1do1cursor 0ar? 222? 0ar> I
@UER:2
Onde QBE*> algo como$
ELEC! coluna1a?222? coluna1
$R#M tabela1a?222? tabela1
9(ERE condi45o2
-
7/24/2019 PL_SQL Parte IV
17/94
-
7/24/2019 PL_SQL Parte IV
18/94
Comando FE%CHComando FE%CH
Btili"ado para tra"er a lin@a corrente apontada pelo cursor emvariveis PL/SQL ou variveis de programa.
Sintaxe$
$E!C( nome1do1cursor IN!# 3ari3el1)?222?3ari3el1n;
Onde para cada coluna da querD associada ao cursor deve@aver uma varivel correspondente em varivel;2&...&varivel;n.
-
7/24/2019 PL_SQL Parte IV
19/94
*evese necessariamente dar -P"# no cursorantes de utiliunto associado ao cursor. cada F";!H incrementase a lin2a corrente
do cursor para a pr0xima.s variveis usadas no comando vo conter
valores nulos caso a quer? do cursor noretorne nen2uma lin2a.
So&re o comando FE%CHSo&re o comando FE%CH
-
7/24/2019 PL_SQL Parte IV
20/94
Comando CLOSEComando CLOSE
)ec@a explicitamente o cursor& permitindo que ele sea reaberto paratra"er novamente os dados retornados por sua querD.
Sintaxe:
CL#E nome1do1cursor
-
7/24/2019 PL_SQL Parte IV
21/94
Atri&utos dos Cursores E!pl"citosAtri&utos dos Cursores E!pl"citos
Bm cursor explCcito possui um conunto de variveis que podem serusadas para definir seu status.
So elas$
+4 )ound $ contm o valor =*BE se o !ltimo )E=9# do cursor obteveuma lin@a da rea de dados. o contrrio retorna )+LSE.
Sintaxe:
Nome1do1cursor8$#UND
-
7/24/2019 PL_SQL Parte IV
22/94
84 -ot)ound$ contm o valor =*BE se o !ltimo )E=9# no tiver tra"idouma lin@a do cursor& e )+LSE caso contrrio.
Sintaxe:
Nome1do1cursor8N#!$#UND
94 *o?9ount$ 9ontm o n!mero de lin@as que foram tra"idas pelocomando )E=9#.
Sintaxe:
Nome1do1cursor8R#9C#UN!
Atri&utos dos Cursores E!pl"citosAtri&utos dos Cursores E!pl"citos
-
7/24/2019 PL_SQL Parte IV
23/94
4 (sOpen$ 9ontm o valor =*BE se o cursor est correntementeaberto. )+LSE se o cursor foi fec@ado ou ainda no foi aberto.
Sintaxe:
Nome1do1Cursor8I#*EN
Atri&utos dos Cursores E!pl"citosAtri&utos dos Cursores E!pl"citos
-
7/24/2019 PL_SQL Parte IV
24/94
@tili
-
7/24/2019 PL_SQL Parte IV
25/94
Exemplo 1:
-- Este bloco im0rime os 3rios cdi7os de funcionrios
DECLARE
CUR#R func I
ELEC! cod1funcionario $R#M funcionarios;
31cod1func funcionarios2cod1funcionario8!:*E;
BEGIN
#*EN func;
L##*
$E!C( func IN!# 31cod1func; E/I! 9(EN func8N#!$#UND;
DBM1#U!*U!2*U!1LINE31cod1func.;
END L##*;
CL#E func;
END;
#so dos Cursores#so dos Cursores
-
7/24/2019 PL_SQL Parte IV
26/94
Exemplo 2: Este exemplo utiliza a estrutura WHILELOOP
"ste 1loco imprime os vrios c0di9os de funcionrios*";$A";@A%-A func I%
%"$";! cod6funcionario FA-D funcionarios+v6cod6func funcionarios.cod6funcionarioC!EP"+8"I#-P"# func+ F"!;H func I#!- v6cod6func+
GHI$" F@#;CF-@#* $--P *8D%6-@!P@!.P@!6$I#"3v6cod6func4+ F"!;H func I#!- v6cod6func+ "#* $--P+;$-%" func+"#*+
#so dos Cursores#so dos Cursores
-
7/24/2019 PL_SQL Parte IV
27/94
Exemplo 3: Este exemplo utiliza a estrutura FORLOOP
-- Na estrutura for loo0 n5o necessrio abrir ou fecarcursor? nem mesmo declarar 3ari3eis Fue recebem 3alores docursor2
"ste 1loco imprime os vrios c0di9os de funcionrios*";$A";@A%-A func I% %"$";! cod6funcionario FA-D funcionarios+8"I#F-A v6func in func loop
*8D%6-@!P@!.P@!6$I#"3v6func.cod6funcionario4+"#* $--P+"#*+
#so dos Cursores#so dos Cursores
-
7/24/2019 PL_SQL Parte IV
28/94
Atri&utos de CursoresAtri&utos de CursoresE!pl"citosE!pl"citos
ssim como os cursores implcitos, existe atri1utosque permitem identicar o status do cursor ap0s suaexecuo.
Das a forma de utili
-
7/24/2019 PL_SQL Parte IV
29/94
Atri&utos de CursoresAtri&utos de CursoresE!pl"citosE!pl"citos
Exemplo 2$
eclare
cursor c;aluno is select codigo
from aluno68egin
if not c;aluno
-
7/24/2019 PL_SQL Parte IV
30/94
Atri&utos de CursoresAtri&utos de CursoresE!pl"citosE!pl"citos
Exemplo 3 $
*eclare cursor c6aluno is select codi9o
from aluno+
v6aluno aluno.codi9oCt?pe+
8e9in open c6aluno+
fetc2 c6aluno into v6aluno+ 2ile c6alunoCfound loop d1ms6output.put6line 3v6aluno4+
fetc@ c;aluno into v;aluno6 end loop+ close c6aluno+"nd+
-
7/24/2019 PL_SQL Parte IV
31/94
Cursores e RegistrosCursores e Registros
F possCvel fa"er uma querD carregar uma lin@a de um cursordiretamente para um registro definido com a estrutura de um cursor&
sendo os valores das lin@as carregados diretamente sobre os camposdo registro.
-
7/24/2019 PL_SQL Parte IV
32/94
Cursores e RegistrosCursores e Registros
Exemplo:
-- Este bloco im0rime os dados dos funcionrios com obeti3o de 3enda maior FueH'''
DECLARE
CUR#R func IELEC! ,
$R#M $UNCI#NARI#
9(ERE obeti3o13enda + H''';
re71func func8R#9!:*E;
BEGIN
#*EN func;
L##* $E!C( func IN!# re71func;
E/I! 9(EN func8N#!$#UND;
DBM1#U!*U!2*U!1LINEre71func2nome.;
DBM1#U!*U!2*U!1LINEre71func2salario.;
DBM1#U!*U!2*U!1LINEre71func2obeti3o13enda.;
DBM1#U!*U!2*U!1LINEre71func2ramal.;
END L##*;CL#E func;
-
7/24/2019 PL_SQL Parte IV
33/94
Cursores FOR LoopsCursores FOR Loopsutili'ando Su&(ueriesutili'ando Su&(ueries
@ma outra maneira de implementar cursores
utili
-
7/24/2019 PL_SQL Parte IV
34/94
Cursores FOR LoopsCursores FOR Loopsutili'ando Su&(ueriesutili'ando Su&(ueries
Exemplo$
8egin
for v;aluno in 1 select codigo& nome from aluno4 loop dbms;output.put;line 1v;aluno.codigoGG H I H GGv;aluno.nome46end loop6End6
-
7/24/2019 PL_SQL Parte IV
35/94
Cursores Parametri'adosCursores Parametri'ados
ParJmetros permitem passar valores para um cursor quando ele aberto& e usado dentro de sua querD quando ela executada.(sto significa que um cursor pode ser aberto diversas ve"esdentro de um bloco retornando um conunto diferente de lin@asa cada ve" que aberto.
Os parJmetros so passados posicionalmente quando o cursor aberto& sendo referenciados dentro da querD que compKe o
cursor e tratados como uma varivel PL/SQL.
-
7/24/2019 PL_SQL Parte IV
36/94
Exemplo:
-- Este bloco im0rime o nome e o salario dos funcionarios com
-- salario maior Fue um certo 3alor a ser entrado
DECLARE
CUR#R C) 0) NUMBER. I
ELEC! , $R#M funcionarios
9(ERE salario + 0);
31c) C)8R#9!:*E;
31au= NUMBER;
BEGIN
#*EN C)'''.;
L##*
$E!C( C) IN!# 31c);
E/I! 9(EN C)8N#!$#UND;
DBM1#U!*U!2*U!1LINE31c)2nome.;
DBM1#U!*U!2*U!1LINE31c)2salario.;
END L##*;
CL#E C);
Cursores Parametri'adosCursores Parametri'ados
-
7/24/2019 PL_SQL Parte IV
37/94
Cursor com Su&(ueriesCursor com Su&(ueries
@m outro tipo de instruo %$ a que permite que uma
estrutura de %"$";! ten2a na sua clusula FA-D umoutro %"$";!. "sta su1querie funcionar como uma 1asetemporria para o %"$";! principal.
-
7/24/2019 PL_SQL Parte IV
38/94
Cursor com Su&(ueriesCursor com Su&(ueries
Exemplo$
eclare cursor c;aluno is select a.codigo& a.nome& prof.descricao from alunos a&
1select codigo& descricao from profissoes4 prof ?@ere a.codigo;profissao : prof.codigo68egin for v;aluno in c;aluno loop dbms;output.put;line 1v;aluno.codigoGG%GGv;aluno.nome GG%GG v;aluno.descricao46 end loop6
End6
-
7/24/2019 PL_SQL Parte IV
39/94
Tratamento deTratamento deExcessesExcesses
-
7/24/2019 PL_SQL Parte IV
40/94
%ratamento de E!ce)*es%ratamento de E!ce)*es
"m P$J%$, um aviso ou condio de erro denominado uma exceo.
"xceKes podem ser denidas internamente ou pelousurio.
@ma exceo prdenida disparada implicita eautomaticamente pelo sistema. "xceKes denidaspelo usurio devem ser escritas em rotinas separadase disparadas explicitamente
-
7/24/2019 PL_SQL Parte IV
41/94
%ratamento de E!ce)*es%ratamento de E!ce)*es
Exemplos de Exce,Kes Pr%definidas$
-
7/24/2019 PL_SQL Parte IV
42/94
%ratamento de Erros%ratamento de Erros
uando um erro ocorre, uma exceo disparada, aexecuo normal interrompida e o controle passado para a parte de tratamento de exceKes do
1loco.
%e uma exceo encontrada no tem tratamentoento o 1loco P$J%$ terminado com a mensa9em:UNHANDLED EXCEPTION.
-
7/24/2019 PL_SQL Parte IV
43/94
%ratamento de Erros%ratamento de Erros
"xemplo de declarao de uma "xception:
*";$A"nome "/;"P!I-#+
...........8"I# ..........."/;"P!I-# GH"# no6data6found !H"#
........... GH"# to6man?6ros !H"#
..........."#*+
-
7/24/2019 PL_SQL Parte IV
44/94
Capturando E!ce)*esCapturando E!ce)*es
#a seo "/;"P!I-# pode ser denida uma exceo que captureuma outra exceo que no foi denida, quando esta ocorrer.
Exemplo:
*";$A"
preco #@D8"A3L,(4+8"I# %"$";! Preco6@nitario I#!- preco FA-D Produtos GH"A" ;od6Produto 5 &+
IF preco M &(7 !H"# @P*!" Produtos
%"! Preco6@nitario 5 N7GH"A" ;od6Produto 5 &
"#* IF+"#*+
-
7/24/2019 PL_SQL Parte IV
45/94
Capturando E!ce)*esCapturando E!ce)*es*";$A" preco #@D8"A3L,(4+
8"I# %"$";! Preco6@nitario I#!- preco
FA-D Produtos GH"A" ;od6Produto 5 O+ IF preco M &(7 !H"# @P*!" Produtos %"! Preco6@nitario 5 N7 GH"A" ;od6Produto 5 O+ "#* IF+
"/;"P!I-# GH"# no6data6found !H"# I#%"A! I#!- error6ta1 $@"% 3Q;0di9o no cadastradoQ4+ GH"# too6man?6ros !H"# I#%"A! I#!- error6ta1 $@"% 3QDais de um produto com c0di9o &Q4+ GH"# ot2ers !H"# I#%"A! I#!- error6ta1 $@"% 3Q"rro ocorrido no 1locoQ4+
"#*+
-
7/24/2019 PL_SQL Parte IV
46/94
Fun)*es +teis na Captura de ErrosFun)*es +teis na Captura de Erros
Para tratarmos uma exceo, podemos utili
-
7/24/2019 PL_SQL Parte IV
47/94
E!ce)*es De,inidas peloE!ce)*es De,inidas pelousu-riousu-rio
- que em erro denota no enecessariamente um erro -racle S porexemplo, ele pode ser um erro com osdados. Por outro lado, as exceKespredenidas correspondem aos erroscomuns %$ e da P$J%$.
"xceKes denidas pelo usurio sodeclaradas na seo declarativa de um1loco P$J%$. *a mesma forma como asvariveis, as exceKes tem um tipo
3"/;"P!I-#4 e um escopo
-
7/24/2019 PL_SQL Parte IV
48/94
E!ce)*es De,inidas pelo #su-rioE!ce)*es De,inidas pelo #su-rio
Exemplo:
DECLARE
re7istro funcionarios8R#9!:*E;
E=em0lo E/CE*!I#N;
BEGINELEC! ,
IN!# re7istro
$R#M funcionarios
9(ERE cod1funcionario & J ;
I$ re7istro2cod1funcionario K+ )
!(EN RAIE E=em0lo; END I$;
E/CE*!I#N
9(EN E=em0lo
!(EN DBM1#U!*U!2*U!1LINE$UNCI#NRI# ERRAD#.;
END;
-
7/24/2019 PL_SQL Parte IV
49/94
%ratamento de E!ce)*es%ratamento de E!ce)*es
*";$A"e6!ooDan?%tudents "/;"P!I-#+
e6!ooDan?%tudents um identicador queestar visvel at o nal desse 1loco.
-1serve que o escopo de uma exceo o
mesmo que o escopo de qualquer outravarivel ou cursor na mesma seo declarativa.
-
7/24/2019 PL_SQL Parte IV
50/94
Levantando E!ce)*esLevantando E!ce)*es
uando o erro associado com uma exceoocorrer, a exceo levantada. "xceKesdenidas pelo usurio so levantadas
explicitamente via instruo AI%", enquantoas exceKes predenidas so levantadasimplicitamente quando seus erros associadoscom -racle ocorrem. %e ocorrer um erro -racle
que no este>a associado com uma exceo,uma exceo tam1m e levantada.
-
7/24/2019 PL_SQL Parte IV
51/94
%ratamento de Erros%ratamento de Erros
*";$A" e6"xception& "/;"P!I-#+8"I# Aaise >ust exception &. AI%" e6"xception&+"/;"P!I-# GH"# e6"xception& !H"# dbms;output.put;line37"xceo & eradaTQ4+"#*+
-
7/24/2019 PL_SQL Parte IV
52/94
#tili'ando#tili'andoRAISE.APPLICA%IO$.ERRORRAISE.APPLICA%IO$.ERROR
oc pode utili
-
7/24/2019 PL_SQL Parte IV
53/94
DECLARE
0reco NUMBER6?J.;
BEGIN ELEC! *reco1Unitario
IN!# 0reco
$R#M *rodutos
9(ERE Cod1*roduto & )'');
E/CE*!I#N
9(EN oters !(EN
RAIE1A**LICA!I#N1ERR#R-J''')? HExce,o no definida pelo programadorH46END;
#tili'ando#tili'andoRAISE.APPLICA%IO$.ERRORRAISE.APPLICA%IO$.ERROR
-
7/24/2019 PL_SQL Parte IV
54/94
ProcedimentosProcedimentos
, Funes, Funes eePacotesPacotes
-
7/24/2019 PL_SQL Parte IV
55/94
Procedimentos e Fun)*esProcedimentos e Fun)*es
s procedures, functions e pacVa9es so 1locosidenticados. "les so arma
-
7/24/2019 PL_SQL Parte IV
56/94
E!emplo de ProcedureE!emplo de Procedure
9*E+=E O* *EPL+9E P*O9EB*E (nclui;-ovo;+luno 1v;codigo alunos.codigoPE& v;nome alunos.nomePE& v;endereco alunos.enderecoPE4 +S8EM(-
(-SE*= (-=O alunois 1codigo&nome&endereco4 N+LBES 1v;codigo& v;nome& v;endereco46E- (nclui;-ovo;+luno6
Bma ve" criada& a procedure pode ser c@amada de outro bloco PL/SQL$
8EM(-(nclui;-ovo;+luno12& HMabriel7& HSem Endereco46E-6
-
7/24/2019 PL_SQL Parte IV
57/94
uando a procedure criada, ela primeiramentecompilada e ento arma
-
7/24/2019 PL_SQL Parte IV
58/94
m de alterar o c0di9o de uma procedure, aprocedure deve ser descartada e ento recriada. spalavrasc2ave -A A"P$;" permitem que aoperao de recriar uma procedure se>a feito.
%e a procedure existir e se as palavrasc2ave -AA"P$;" no estiverem presentes, a instruo;A"!" retornar o erro -racle X-ANLL: #ame isalread? used 1? na existin9 o1>ectU.
ssim como outras instruKes ;A"!", criar umaprocedure uma operao de **$, portanto um;-DDI! implicito feito tanto antes como depois doprocedimento ser criado.
Pontos a serem veri,icadosPontos a serem veri,icados
-
7/24/2019 PL_SQL Parte IV
59/94
Dodulari
-
7/24/2019 PL_SQL Parte IV
60/94
Sinta!e de ProcedimentosSinta!e de Procedimentos
CREA!E #R RE*LACE> *R#CEDUREUER2>0rocedimento
ar7umento IN#U!IN #U!> datatO0e
?ar7umento IN#U!IN #U!>datatO0e>222.>
PIAQ bloco;
-
7/24/2019 PL_SQL Parte IV
61/94
--Este 0rocedimento im0rime o cliente? o funcionario e a data 0ara um --certo0edido2
CREA!E #R RE*LACE *R#CEDURE consulta10edido
31Nro1*edido IN *edidos2Num1*edido8!:*E.
I
31Cod1Cliente *edidos2Cod1Cliente8!:*E;
31Cod1$unc *edidos2Cod1$uncionario8!:*E;
31Data1*edido *edidos2Data1*edido8!:*E;BEGIN
ELEC! Cod1Cliente? Cod1$uncionario? Data1*edido
IN!# 31cod1Cliente? 31Cod1$unc? 31Data1*edido
$R#M *edidos
9(ERE Num1*edido & 31Nro1*edido;
DBM1#U!*U!2*U!1LINE31cod1Cliente.;
DBM1#U!*U!2*U!1LINE31Cod1$unc.;DBM1#U!*U!2*U!1LINE!#1C(AR31Data1*edido?DDMM::::..;
END consulta10edido;
--*ara 3er o resultado%
E/ECU!E Consulta1*edido).;
E!emploE!emplo
-
7/24/2019 PL_SQL Parte IV
62/94
&4 ;riar uma ta1ela c2amada "DPA"*-% com ascolounas: c0di9o 3num1er4, nome3varc2ar(4 ecodi9o6car9o 3num1er4+
(4 ;riar uma ta1ela c2amada ;A-% com as colunas:
c0di9o 3num1er4, descrio3varc2ar(4+O4 Popular as duas ta1elas. -s car9os no devem serepetir, mas o mesmo car9o deve estar vrias ve
-
7/24/2019 PL_SQL Parte IV
63/94
Fun)*esFun)*es
@ma funo 1em semel2ante a uma procedure3parametros, seKes, etc.4, entretanto umac2amada de procedure uma instruo P$J%$ por
si pr0pria, enquanto uma c2amada de funo c2amada como parte de uma expresso.
funo retorna um valor 1ooleano. "la pode serc2amada a partir do 1loco P$J%$.
-
7/24/2019 PL_SQL Parte IV
64/94
Sinta!e de Fun)*esSinta!e de Fun)*es
CREA!E #R RE*LACE> $UNC!I#N UER2>fun45o
ar7umento IN datatO0e
?ar7umento IN datatO0e>222.>
RE!URN datatO0ePIAQ bloco;
-
7/24/2019 PL_SQL Parte IV
65/94
Sinta!e de Fun)*esSinta!e de Fun)*es
A instruo RETURNB utili
-
7/24/2019 PL_SQL Parte IV
66/94
#tili'a)0o de Fun)*es#tili'a)0o de Fun)*es
Uma forma astante interessante deutili!ao de uma funo " no pr#priocomando select, onde os par$metros usados
podem ser as colunas da taela consultada%
Ex%&'elect codi(o)produto, func)desconto*+alor)produto,
+alor)desconto from produtos-
-
7/24/2019 PL_SQL Parte IV
67/94
Fun)*esFun)*esExemplo:
-- Esta fun45o retorna o m=imo di3isor comum de J nmeros
CREA!E #R RE*LACE $UNC!I#N Ma=imo1Di3isor1Comum01numero) in number? 01numeroJin number.
RE!URN NUMBER I
31numero) NUMBER %& );
31numeroJ NUMBER %& );
BEGIN
31numero)%& 01numero);
31numeroJ%& 01numeroJ;
9(ILE 31numero) K+ 31numeroJ. L##*
I$ 31numero) + 31numeroJ
!(EN 31numero) %& 31numero) - 31numeroJ;
ELE 31numeroJ %& 31numeroJ - 31numero); END I$;
END L##*;
RE!URN31numero).;
END Ma=imo1Di3isor1Comum;
-- *ara 3er o resultado%
-
7/24/2019 PL_SQL Parte IV
68/94
Considera)*esConsidera)*es
=anto procedimentos quanto fun,Kes& no instante do comando 9*E+=E socompilados.
Se quisermos compil%los explicitamente& usamos os comandos$
AL!ER *R#CEDURE nome1do10rocedimento C#M*ILE;
AL!ER $UNC!I#N nome1do1fun45o C#M*ILE;
Quando quisermos remover esses obetos do banco de dados& utili"amos
os comandos$
DR#* *R#CEDURE nome1do10rocedimento;
DR#* $UNC!I#N nome1do1fun45o;
-
7/24/2019 PL_SQL Parte IV
69/94
&4 #a ta1ela ;A-% insira a coluna: remuneracao3num1er4+
(4 Fa
-
7/24/2019 PL_SQL Parte IV
70/94
%ipos de Par1metros%ipos de Par1metros
.N - valor do parWmetro real passado para a procedure quando aprocedure invocada. *entro da procedure, o parWmetro formal atua comouma constante P$J%$ ele considerado de leitura e no pode ser alterado.uando a procedure conclui e o controle retorna ao am1iente de c2amada, oparWmetro real no alterado.
/UT ualquer valor que o parametro real ten2a i9norado quando aprocedure c2amada. *entro da procedure, o parametro formal atua comouma variavel nao iniciali
-
7/24/2019 PL_SQL Parte IV
71/94
alores Padr0o de Par1metrosalores Padr0o de Par1metros
*e maneira semel2ante Zs declaraKes de varivel, osparWmetros formais para um procedimento ou funo podemter valores padro. %e um parWmetro tiver um valor padro,ele no tem de ser passado a partir do am1iente de c2amada.
%e o for, o valor do parWmetro real ser utili
-
7/24/2019 PL_SQL Parte IV
72/94
Pacotes 2Pac3ages4Pacotes 2Pac3ages4
Bm pacote um obeto que agrupa logicamente tipos PL/SQLrelacionados& itens e sub%programas.Meralmente& os pacotes tm duas partes$ uma especifica,o1specification4 e um corpo 1bodD4& embora o corpo& As ve"es&
no sea necessrio.
%+ especifica,o contm a declara,o dos tipos& variveis&constantes& exce,Kes& cursores e sub%programas disponCveis
para uso.%O corpo define os cursores e sub%programas e implementa aespecifica,o.
-
7/24/2019 PL_SQL Parte IV
73/94
Dodularidade+Pro>eto de aplicao mais fcil+"ncapsulamento de informao, ao separar a
especicao do corpo+;riao de variveis 9lo1ais persistentes por
sesso+
antagens da utili'a)0oantagens da utili'a)0o
-
7/24/2019 PL_SQL Parte IV
74/94
Sinta!e dos PacotesSinta!e dos Pacotes
Os pacotes so compostos por duas partes$
+4 Especifica,o$
CREA!E #R RE*LACE *ACSAGE UER2Nome1do1*acote IA
!i0o1)?222?!i0o1n
Tari3el1)?222? Tari3el1n
$un45o1)?222? $un45o1n
*rocedimento1)?222?*rocedimento1n
END Nome1do1*acote
-
7/24/2019 PL_SQL Parte IV
75/94
84 9orpo$
CREA!E #R RE*LACE *ACSAGE B#D: UER2Nome1do1*acote
IA
*R#CEDURE *rocedimento1) I Cor0o1*)
*R#CEDURE *rocedimento1*n I Cor0o1n
$UNC!I#N $un45o1) I Cor0o1$)
$UNC!I#N $un45o1n I Cor0o1$n
END;
Sinta!e dos PacotesSinta!e dos Pacotes
-
7/24/2019 PL_SQL Parte IV
76/94
Pacotes5 Considera)*es ImportantesPacotes5 Considera)*es Importantes
% + clusula O* *EPL+9E significa que se ao criar o pacote& se existir um outrocom o mesmo nome ele ser substituCdo pelo novo.
% =udo o que estiver declarado na especifica,o ser acessCvel externamente aopacote.
% Quando na especifica,o de um pacote no @ouver declara,o de fun,Kes ouprocedimentos ele no necessitar de um corpo& a menos que ele necessite defun,Kes internas.
% -em todas as fun,Kes que se ac@am no corpo do pacote estaro na especifica,o&
estas so fun,Kes que s0 podero ser utili"adas internamente ao pacote.
% Quando desearmos invocar determinado procedimento ou fun,o do pacote usamosa sintaxe$
-ome;do;Pacote. -ome;Subrotina1ParJmetros4
-
7/24/2019 PL_SQL Parte IV
77/94
&4 ;riar uma pacVa9e "DPA"% utili
-
7/24/2019 PL_SQL Parte IV
78/94
Tri((ersTri((ers
-
7/24/2019 PL_SQL Parte IV
79/94
Introdu)0o aos %riggersIntrodu)0o aos %riggers
Bm trigger um bloco PL/SQL associado a uma tabela& executadoquando um (-SE*=& BP+=E ou ELE=E for executado.
Pode conter comandos SQL e PL/SQL e pode c@amar stored
procedures.
=riggers so semel@antes a stored procedures mas diferem na maneiracomo so c@amados. Enquanto um procedimento explicitamentec@amado por um usurio ou aplica,o& um trigger disparadoimplicitamente pelo SM8 18S4.
-
7/24/2019 PL_SQL Parte IV
80/94
Aeali
-
7/24/2019 PL_SQL Parte IV
81/94
s tri99ers podem ser de I#%"A!,@P*!",*"$"!". *isparadas antes ou depois dedeterminado evento 3F!"A J 8"F-A"4. " a
cada re9istro 3F-A ";H A-G4
%ipos de %riggers%ipos de %riggers
-
7/24/2019 PL_SQL Parte IV
82/94
Ha&ilita)0o de %riggerHa&ilita)0o de %rigger
Em certas situa,Kes& pode ser desevel desabilitar temporariamente umtrigger.
Por exemplo& ao carregar dados& a desabilita,o de um trigger podeacelerar substancialmente a opera,o.
-o entanto& isso deve ser feito com bastante cuidado& pois pode implicarem uma base de dados inconsistente.
AL!ER !RIGGER nome1do1tri77er ENABLE;AL!ER !RIGGER nome1do1tri77er DIABLE;
AL!ER !ABLE nome1da1tabela ENABLE ALL !RIGGER;
AL!ER !ABLE nome1da1tabela DIABLE ALL !RIGGER;
Para excluir uma trigger no SQL$DR#* !RIGGER UER>2nome1da1tri77er;
-
7/24/2019 PL_SQL Parte IV
83/94
%riggers%riggers
Exemplo:
CREA!E #R RE*LACE !RIGGER no3o10rod
BE$#RE INER! #N *rodutos
$#R EAC( R#9
BEGIN%NE92Unidades1EstoFue %& ';
END;
-- *ara testar a tri77er%
INER! IN!# 0rodutos TALUEH? CAMIE!A*ANINAR#? )6? '2)6? )''? J''? .;
-
7/24/2019 PL_SQL Parte IV
84/94
For eac6 ro7For eac6 ro7
Um tri((er F/R EAC0 R/1 " acionado uma+e! por lin2a% 3entro do tri((er, +oc4 podeacessar os dados da lin2a 5ue est6 sendo
processada atualmente%
.sso " reali!ado atra+"s dosidenti7cadores &NE1 e &/83%
Esses identi7cadores so semel2antes a uma+ari6+el do tipo re(istro TA9E8A)3A)TR.::ER;R/1T
-
7/24/2019 PL_SQL Parte IV
85/94
Predicados de %riggerPredicados de %rigger
Predicados de tri((er& .N'ERT.N:, UP3AT.N:e 3E8ET.N:
Um mesmo tri((er pode ser disparadopara .N'ERT, UP3ATE e 3E8ETE% 3entro de umtri((er desse tipo 26 tr4s funes ooleanas5ue podem ser usadas para determinar 5ual" a operao 5ue est6 disparando o tri((er%
-
7/24/2019 PL_SQL Parte IV
86/94
&4 ;riar uma tri99er que no permita incluir c0di9os >cadastrados na ta1ela ;A-%.
(4 ;riar uma tri99er que no permita incluir na ta1elade "DPA"*-% c0di9os de ;A-% invlidos.
E!erc"ciosE!erc"cios
-
7/24/2019 PL_SQL Parte IV
87/94
.nstrues '=8.nstrues '=8
SL dentro da linguagemSL dentro da linguagem
-
7/24/2019 PL_SQL Parte IV
88/94
SL dentro da linguagemSL dentro da linguagemPL/SLPL/SL
A lin(ua(em '=8 *'tructure =uer> 8an(ua(ede7ne como os dados do /racle somanipulados% As construes procedurais
com P8?'=8 tornam@se mais teis 5uandocominadas com o poder de processamentoda '=8, permitindo 5ue os pro(ramasmanipulem os dados no /racle%
As nicas instrues '=8 permitidasdiretamente em um pro(rama P8?'=8 so3B8s *'E8ECT, .N'ERT, UP3ATE, 3E8ETEinstrues de controle de transao *C/BB.T,R/889AC%%%%
-
7/24/2019 PL_SQL Parte IV
89/94
SL Din1micoSL Din1mico
Como +imos, apenas instrues 3B8 podemser includas diretamente em locos P8?'=8%Por"m, isso pode ser reti7cado por meio da'=8 din$mica% Em +e! de ser analisada
sintaticamente Dunto com o loco P8?'=8, a'=8 din$mica " analisada sintaticamente e "suse5entemente executada em tempo deexecuo% 06 duas t"cnicas para executar a'=8 din$mica% A primeira " o pacote
39B')'=8, a se(unda, introdu!ida no/raclei, " a '=8 din$mica nati+a atra+"s dainstruo EGECUTE .BBE3.ATE% Esta se(undat"cnica " uma parte inte(rante da pr#prialin(ua(em P8?'=8, e conse5entemente "si ni7cati+amente mais sim les e r6 ida ue
-
7/24/2019 PL_SQL Parte IV
90/94
SL Din1mico 8 E!emploSL Din1mico 8 E!emplo
SQL> DECLARE
2 v_SQLString ARC!AR2"2##$%
& v_'LSQL(loc) ARC!AR2"2##$%
* (E+,-
. E/EC01E ,ED,A1E
3 4CREA1E 1A(LE e5ecute_table "col6 ARC!AR"6#$$4%
7
8 9:R v_Counter ,- 6;;6# L::' < v_SQLString =
6# 4,-SER1 ,-1: e5ecute_table
66 AL0ES "44Row 4 ?? v_Counter ?? 444$4%
62 E/EC01E ,ED,A1E v_SQLString%
6& E-D L::'%
6*
6. v_'LSQL(Loc) =
63 4(E+,-67 9:R v_Rec ,- "SELEC1 @ 9R: e5ecute_table$ L::'
68 D(S_:01'01;'01_L,-E"v_Rec;col6$%
6< E-D L::'%
2# E-D%4%
26
22 E/EC01E ,ED,A1E v_'LSQL(loc)%
2&
2* E/EC01E ,ED,A1E 4DR:' 1A(LE e5ecute_table4%
2. E-D%
Consultas com E!ecuteConsultas com E!ecute
-
7/24/2019 PL_SQL Parte IV
91/94
Consultas com E!ecuteCo su s co ecu eImmediateImmediate
'odemos utiliar a E/EC01E ,ED,A1E Bara consultas de nica linhatanto com variveis de vinculaFGo como sem variveis de vinculaFGo; 2 E9L+*E
3 v;SQLQuerD N+*9#+*31346 5 v;9lass classes
-
7/24/2019 PL_SQL Parte IV
92/94
&4 ;rie uma procedure que escreva o nome dosempre9ados com seus respectivos car9os, utili
-
7/24/2019 PL_SQL Parte IV
93/94
Se(uencesSe(uences
Y9riar uma sequence6
9reate sequence seq;aluno S=+*= '(=# 2 (-9*EE-= 8> 26
Y9omo buscar o pr0ximo valor6
select seq;aluno.nextval from dual6
YBtili"a,o dentro de um comando (-SE*=
(nsert into alunos1seq;aluno.nextval&aria&*ua >&246
-
7/24/2019 PL_SQL Parte IV
94/94
9anipula)0o de Ar(uivos9anipula)0o de Ar(uivosCREA!E#RRE*LACE*R#CEDURE*RC1CARGA0NomeArF INTARC(ARJ.I
ArFCar7a U!L1$ILE2$ILE1!:*E;
3Lina 3arcarJ6''.;BEGIN ArFCar7a %&utl1file2fo0enomealuno?0NomeArF?R.; loo0 be7in
utl1file27et1lineArFCar7a?3Lina.; dbms1out0ut20ut1linesubstr3Lina?)?6'..;e=ce0tion Venno1data1foundten dbms1out0ut20ut1lineCe7ou no final do arFui3o.;
e=it;end;
endloo0;utl1file2fcloseArFCar7a.;
E/CE*!I#N 9(EN#!(ER!(EN
dbms out0ut20ut linesFlerrm.;