PL_SQL Parte IV

Embed Size (px)

Citation preview

  • 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.;