PL_SQL Parte II

Embed Size (px)

Citation preview

  • 7/24/2019 PL_SQL Parte II

    1/58

    PL/SQL-PL/SQL-

    FundamentosFundamentos

    Oracle Database 11g

    1

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    2/58

    Tratamento deTratamento deExcessesExcesses

    ContinuaoContinuao

    Oracle Database 11g

    2

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    3/58

    Excees Definidas peloExcees Definidas pelo

    usuriousurio

    O que em erro denota no enecessariamente um erro Oracle por

    exemplo, ele pode ser um erro com osdados. or outro lado, as exce!esprede"nidas correspondem aos erroscomuns #$% e da %$%.

    'xce!es de"nidas pelo usurio sodeclaradas na seo declarati(a de umbloco %$%. Da mesma )orma como as

    (ari(eis, as exce!es tem um tipo*'+'-IO/ e um escopoOracle Database 11g3

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    4/58

    Excees Definidas pelo UsurioExcees Definidas pelo Usurio

    Exemplo:

    DECLARE

    registro funcionarios%ROWTYPE;

    Exemplo EXCEPTO!;"E#!

    $ELECT

    !TO registro

    &RO' funcionarios

    W(ERE co)*funcionario + , ;

    & registro-co)*funcionario ./ 0 T(E! RA$E Exemplo;

    E!D &;

    EXCEPTO!

    W(E! Exemplo

    T(E! D"'$*O1TP1T-P1T*L!E23&1!CO!4RO ERRADO35;

    E!D;Oracle Database 11g

    4

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    5/58

    Tratamento de ExceesTratamento de Excees

    D'%0'e2-ooMan3#tudents '+'-IO4

    e2-ooMan3#tudents 5 um identi"cador queestar (is6(el at5 o "nal desse bloco.

    Obser(e que o escopo de uma exceo 5 o

    mesmo que o escopo de qualquer outra(ari(el ou cursor na mesma seodeclarati(a.

    Oracle Database 11g

    5

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    6/58

    Levantando ExceesLevantando Excees

    $uando o erro associado com uma exceoocorrer, a exceo 5 le(antada. 'xce!esde"nidas pelo usurio so le(antadasexplicitamente (ia instruo 0I#', enquantoas exce!es prede"nidas so le(antadasimplicitamente quando seus erros associadoscom Oracle ocorrem. #e ocorrer um erroOracle que no este7a associado com umaexceo, uma exceo tamb5m e le(antada.

    Oracle Database 11g

    6

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    7/58

    Tratamento de ErrosTratamento de Erros

    D'%0' e2'xception1 '+'-IO4

    8'9I aise 7ust exception 1. 0I#' e2'xception14'+'-IO ;

  • 7/24/2019 PL_SQL Parte II

    8/58

    UtilizandoUtilizandoRAISEA!!LI"ATI#$ERR#RRAISEA!!LI"ATI#$ERR#R

    ?oc@ pode utiliAar a )uno prede"nida0I#'20%I0-IO2'O para criar suas prBpriasmensagens de erro, que podem ser mais descriti(as que

    as exce!es identi"cadas. Os erros de"nidos pelousurio so passados para o bloco da mesma maneiracomo os erros do Oracle so passados para o ambientede cCamada.

    0 sintaxe 5:0I#'20%I0-IO2'O *numero2do2erro,mensagem2do2erro,manter2erros/4

    Onde numero2do2erro e o (alor entre EF.FFF e EF.GGG,

    mensagem2do2erro 5 o texto associado, e manter2erros5 um (alor booleano.Oracle Database 11g8

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    9/58

    DECLARE

    preco !1'"ER267,5;

    "E#! $ELECT Preco*1nitario

    !TO preco

    &RO' Pro)utos

    W(ERE Co)*Pro)uto + 0880;

    EXCEPTO!

    W(E! ot9ers T(E!

    RA$E*APPLCATO!*ERROR2:,88807 Exceo no definid pelo p!o"!mdo!#$E!D;

    UtilizandoUtilizandoRAISEA!!LI"ATI#$ERR#RRAISEA!!LI"ATI#$ERR#R

    Oracle Database 11g

    %

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    10/58

    SQL CursorSQL Cursor

    Oracle Database 11g

    1&

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    11/58

    ursores so ponteiros de uma rea pri(ada de memBriaalocada no ser(idor Oralce.

    'xistem dois tipos de cursores:Implcitoscriado e gerenciado internamente peloprocessador de instruo #$% no ser(idor Oracle. Oprogramador no tem acesso a eles. O ser(idor Oracle oscria quando uma instruo #$% e executada.

    Explcitosexplicitamente declarado pelo programador.O programador pode selecionar (rias linCas de umatabela do banco de dados, tendo o controle de cada linCaretornada. 'stes cursores so declarados na seo

    declarati(a do bloco. Mais adiante (eremos este tipo decursor mais detalCadamente.

    Defini%oDefini%o

    Oracle Database 11g

    11

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    12/58

    #$%HOJD: 0tributo booleano que retorna -J' caso a maisrecente instruo #$% tenCa retornado pelo menos uma linCa4

    #$%HO-OJD: 0tributo booleano que retorna -J' caso a maisrecente instruo #$% no tenCa retornado pelo menos uma linCa4

    #$%HO;OJ-: 0tributo num5rico que retorna o nKmero de linCa

    a)etadas na mais recente instruo #$%.

    Atri&utos dos "ursoresAtri&utos dos "ursores

    Impl'citosImpl'citos

    Oracle Database 11g

    12

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    13/58

    D'%0' qtde2alunos JM8'*L,E/4

    retorno JM8'*1F/48'9I #'%'- count*/ I-O qtde2alunos OM alunos4 retorno :N sqlHrocount4

    dbms2output.put2line *P -otal de linCas: PQQretorno/4'D4

    Exemplo "ursor Impl'citoExemplo "ursor Impl'cito

    Oracle Database 11g

    13

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    14/58

    Estruturas deEstruturas deControleControle

    Oracle Database 11g

    14

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    15/58

    Els podem se! combinds de ulue! mnei!necess(!i p! !esol)e! um p!oblem.

    * +,-/, d( o usu(!io !ecu!sos p! cont!ol! ofluxo de comndos de um p!o"!m condicionlou no.

    Estruturas de "ontroleEstruturas de "ontrole

    Oracle Database 11g

    15

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    16/58

    # "omando I(# "omando I(

    ermite executar uma sequ@ncia de comandoscondicionalmente, isto 5, a sequ@ncia 5 executada ouno dependendo do (alor da condio.

  • 7/24/2019 PL_SQL Parte II

    17/58

    Loops e DesviosLoops e Desvios

    IncondicionaisIncondicionais

    * comndo ,**+ pe!mite execut! um seu0nci decomndos mltipls )ees. ( t!0s fo!ms de loop

    ,**+ ,E ,**+

    9*: ,**+

    Oracle Database 11g

    17

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    18/58

    # "omando L##!# "omando L##!

    0 )orma mais simples do %OO 5 estrutura %OO 'D%OO.

    0 cada iterao do %OO a sequ@ncia 5 executada e ocontrole retorna ao %OO anterior correspondente.

    $uando o comando '+I- 5 encontrado, o %OO termina e ocontrole 5 passado para o prBximo comando apBs o 'D

    %OO.

    Oracle Database 11g

    18

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    19/58

    # "omando L##!# "omando L##!

    Exemplo:

    :: Este loco calcula o fatorial )e um )a)o n

  • 7/24/2019 PL_SQL Parte II

    20/58

    # "omando )*ILE L##!# "omando )*ILE L##!

    ;ssoci um condio um seu0nci de comndosdent!o de um est!utu! ,**+ E )lid se fo!)e!ddei! seu0nci > executd.

    e fo! fls os comndos do ,**+ no so executdos e

    o cont!ole > pssdo p! o p!?ximo comndo.

    Oracle Database 11g

    2&

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    21/58

    # "omando (#R L##!# "omando (#R L##!

    * comndo 9*: ,**+ > usdo com o mesmo tipo deest!utu! do ,**+ simples com dife!en de pode!mosdete!min! unts )ees ite!o oco!!e!( especificndoum limite de )lo!es.

    Sintaxe:

    &OR conta)or ! menor*?alor -- maior*?alor LOOP

    ---

    ---E!D LOOP;

    * limite > )lido undo o 9*: ,**+

    come e nunc > )lido no)mente.

    Oracle Database 11g

    21

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    22/58

    # "omando (#R L##!# "omando (#R L##!

    Exemplo:

    :: Este loco mostra o ?alor )o conta)or a ca)a itera@o

    DECLARE

    conta)or !1'"ER;

    "E#!

    &OR conta)or ! 0 -- 6 LOOP

    D"'$*O1TP1T-P1T*L!E2conta)or5;

    E!D LOOP;E!D;

    Oracle Database 11g

    22

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    23/58

    # "omando "ASE# "omando "ASE

    O case 5 um comando que retorna um resultadobaseado em uma ou mais alternati(as.

    Declare condicao cCar*E/ :N #4 desc2condicao (arcCarE*1FF/48egin condicao :N case condicao

    Cen # tCen #im Cen tCen o else o Declarado end4

    'nd4Oracle Database 11g

    23

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    24/58

    # "omando "ASE# "omando "ASE

    O comando 0#' tamb5m pode ser utiliAado pararetornar um (alor num determinado #'%'-.createtableteste @)1 varchar2@2# )2 number )3 number#$

    insertintoteste values@';' 1 2#$insertintoteste values@';' 1 3#$insertintoteste values@';' 2 1#$

    insertintoteste values@'A' 2 1#$insertintoteste values@'B' 2 1#$

    /*declare

    cursor c_teste is*/

    select)1)2)3 casewhen)1 C ';' then';luno' when)1 C 'A' then'+!ofesso!' else '

  • 7/24/2019 PL_SQL Parte II

    25/58

    Desvio Incondicional +#T#Desvio Incondicional +#T#

    =es)i o fluxo de um p!o"!m incondicionlmente p! umlbel.

    * lbel de)e se! nico dent!o do escopo e de)e )i! ntes deum comndo execut()el ou de um bloco.

    D** lbel$

    Oracle Database 11g

    25

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    26/58

    Desvio Incondicional +#T#Desvio Incondicional +#T#

    D'%0' (2ounter 8I0T2I-'9' :N 148'9I %OO I#'- I-O temp2table

    ?0%J'# *(2ounter, >%oop count>/4 (2ounter :N (2ounter U 14 I (2ounter VN LF -

  • 7/24/2019 PL_SQL Parte II

    27/58

    Rotulando LoopsRotulando Loops

    Os %oops podem ser rotulados. odemos rotular um loop e utiliAlos em uma instruo '+I- para indicar qual loop de(e serterminado.

    AED feit t!)>s dotipo I:*J+E bsedo em um tbel ou )ieK.

    Oracle Database 11g

    28

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    29/58

    Re,istros em !L-S.LRe,istros em !L-S.L

    *s cmpos dent!o do !e"ist!o te!o o nome e o tipo de ddos i"uis os dtbel ou )ieK !efe!encid n decl!o do !e"ist!o.

    identificdo! !efe!0nciI:*J+E$

    * identificdo! > o nome do !e"ist!o ue est( sendo decl!do$; !efe!0nci > o nome d tbel )ieK ou cu!so! !efe!encido.

    Exemplo:

    DECLAREReg*pro) Pro)utos%ROWTYPE;

    "E#!

    $ELECT !TO reg*pro)

    &RO' Pro)utos

    W(ERE Co)*Pro)uto + 0;

    E!D;

    Oracle Database 11g

    2%

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    30/58

    CursoresCursoresExplcitosExplcitos

    Oracle Database 11g

    3&

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    31/58

    "ursores Expl'citos"ursores Expl'citos

    +odem se! decl!dos em ulue! p!te decl!ti)@ p?s um=EB,;:E# de um bloco +,-/, subp!o"!m ou pcote.

    +odem !eto!n! nenHum um ou )(!is linHs.

    *s comndos se"ui! so destindos L mnipulo doscu!so!es.

    Oracle Database 11g

    31

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    32/58

    "omando "URS#R"omando "URS#R

    Msdo p! decl!! um cu!so! explNcito. +!0met!os podem se!definidos p! pe!miti! substituio de )lo!es dent!o d ue!Oundo o cu!so! > be!to.

    intxe

    :C1R$OR nome*)o*cursor B2parmetro*0 tipo*0 B>+expresso*)efault*07 ---7 parmetro*n tipo*n B>+expresso*)efault*n5 $

    1ERY-

    *nde /ME:J > l"o como$ELECT coluna*a7---7 coluna*F

    &RO' taela*a7---7 taela*F

    W(ERE con)i@o-Oracle Database 11g

    32

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    33/58

    "omando #!E$"omando #!E$

    Msdo dent!o do bloco +,-/,. 9 seleo definid n decl!odo cu!so! e pont p! p!imei! linH !eto!nd pel ue!O uedefine o cu!so!.

    Sintaxe:OPE! nome*cursor B2 argumento*07---7argumento*n5

    Oracle Database 11g

    33

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    34/58

    "omando (ET"*"omando (ET"*

    Mtilido p! t!e! linH co!!ente pontd pelo cu!so! em)!i()eis +,-/, ou )!i()eis de p!o"!m.

    intxe

    &ETC( nome*)o*cursor !TO ?ariG?el*07---7?ariG?el*n;

    *nde p! cd colun d ue!O ssocid o cu!so! de)eH)e! um )!i()el co!!espondente em )!i()el_1...)!i()el_n.

    Oracle Database 11g

    34

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    35/58

    De(ese necessariamente dar O' nocursor antes de utiliAlo40pBs se dar o O' no cursor, o '-< traA a

    1W linCa do con7unto associado ao cursor.0 cada '-< incrementase a linCa corrente

    do cursor para a prBxima.0s (ari(eis usadas no comando (o conter

    (alores nulos caso a quer3 do cursor noretorne nenCuma linCa.

    So&re o comando (ET"*So&re o comando (ET"*

    Oracle Database 11g

    35

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    36/58

    "omando "L#SE"omando "L#SE

    9ecH explicitmente o cu!so! pe!mitindo ue ele seP !ebe!to p!t!e! no)mente os ddos !eto!ndos po! su ue!O.

    Sintaxe:

    CLO$E nome*)o*cursor

    Oracle Database 11g

    36

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    37/58

    Atri&utos dos "ursores Expl'citosAtri&utos dos "ursores Expl'citos

    Mm cu!so! explNcito possui um conPunto de )!i()eis ue podem se!usds p! defini! seu sttus.

    o els

    ;# 9ound cont>m o )lo! :ME se o ltimo 9EB do cu!so! obte)eum linH d (!e de ddos. =o cont!(!io !eto!n 9;,E.

    Sintaxe:

    !ome*)o*cursor%&O1!D

    Oracle Database 11g

    37

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    38/58

    A# m o )lo! :ME se o ltimo 9EB no ti)e! t!idoum linH do cu!so! e 9;,E cso cont!(!io.

    Sintaxe:

    !ome*)o*cursor%!OT&O1!D

    B# :oKBount Bont>m o nme!o de linHs ue P( fo!m t!ids pelocomndo 9EB.

    Sintaxe:

    !ome*)o*cursor%ROWCO1!T

    Atri&utos dos "ursores Expl'citosAtri&utos dos "ursores Expl'citos

    Oracle Database 11g

    38

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    39/58

    =# s*pen Bont>m o )lo! :ME se o cu!so! est( co!!entementebe!to. 9;,E se o cu!so! foi fecHdo ou ind no foi be!to.

    Sintaxe:

    !ome*)o*Cursor%$OPE!

    Atri&utos dos "ursores Expl'citosAtri&utos dos "ursores Expl'citos

    Oracle Database 11g

    3%

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    40/58

    JtiliAase uma estrutura de %OO para aleitura de cada uma de suas linCas.#e um '-< )or executado antes da

    abertura ou apBs o )ecCamento de umcursor, a seguinte mensagem ser exibida:O01FFE: etcC out o) sequence.X importante testar se o '-< )oi bem

    sucedido apBs cada interao da estruturade %OO, atra(5s da (ari(el HO-OJD.

    "ontrolando a Leitura de um "ursor"ontrolando a Leitura de um "ursor

    Oracle Database 11g

    4&

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    41/58

    Exemplo 1:

    :: Este loco imprime os ?Grios cH)igos )e funcionGrios

    DECLARE

    C1R$OR func $

    $ELECT co)*funcionario &RO' funcionarios;

    ?*co)*func funcionarios-co)*funcionario%TYPE;

    "E#!

    OPE! func;

    LOOP

    &ETC( func !TO ?*co)*func;

    EXT W(E! func%!OT&O1!D;

    D"'$*O1TP1T-P1T*L!E2?*co)*func5;

    E!D LOOP;

    CLO$E func;

    E!D;

    Uso dos "ursoresUso dos "ursores

    Oracle Database 11g

    41

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    42/58

    Exemplo 2: Este exemplo utiliza a estrutura WHILELOOP

    'ste bloco imprime os (rios cBdigos de )uncionriosD'%0'J#O )unc I#

    #'%'- cod2)uncionario OM )uncionarios4(2cod2)unc )uncionarios.cod2)uncionarioH-T'48'9IO' )unc4 '-< )unc I-O (2cod2)unc4

    ;

  • 7/24/2019 PL_SQL Parte II

    43/58

    Exemplo 3: Este exemplo utiliza a estrutura FORLOOP

    'ste bloco imprime os (rios cBdigos de )uncionriosD'%0'J#O )unc I#

    #'%'- cod2)uncionario OM )uncionarios4(2cod2)unc8'9IO (2cod2)unc in )unc loop D8M#2OJ-J-.J-2%I'*(2cod2)unc/4

    'D %OO4'D4

    Uso dos "ursoresUso dos "ursores

    Oracle Database 11g

    43

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    44/58

    Atri&utos de "ursoresAtri&utos de "ursores

    Expl'citosExpl'citos

    0ssim como os cursores impl6citos, existe atributosque permitem identi"car o status do cursor apBs suaexecuo.

    Mas a )orma de utiliAlo muda pois o atributo de(eestar associado diretamente com o nome do cursor

    declarado.

    'stes atributos so: Hisopen, Hnot)ound, H)ound,Hrocount.

    Oracle Database 11g

    44

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    45/58

    Atri&utos de "ursoresAtri&utos de "ursores

    Expl'citosExpl'citos

    Exemplo 1

    =ecl!e

    cu!so! c_luno is select codi"o f!om luno$Ae"in if not c_lunoIisopen tHen

    open c_luno$end if$End$

    Oracle Database 11g

    45

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    46/58

    Atri&utos de "ursoresAtri&utos de "ursores

    Expl'citosExpl'citos

    Exemplo 2

    Declare cursor c2aluno is select codigo

    )rom aluno4

    (2aluno aluno.codigoHt3pe4

    8egin open c2aluno4

    )etcC c2aluno into (2aluno4 Cile c2alunoH)ound loop dbms2output.put2line *(2aluno/4

    fetcH c_luno into )_luno$ end loop4 close c2aluno

    'nd4Oracle Database 11g

    46

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    47/58

    "ursores e Re,istros"ursores e Re,istros

    Q possN)el fe! um ue!O c!!e"! um linH de um cu!so!di!etmente p! um !e"ist!o definido com est!utu! de um cu!so!

    sendo os )lo!es ds linHs c!!e"dos di!etmente sob!e os cmposdo !e"ist!o.

    Oracle Database 11g

    47

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    48/58

    "ursores e Re,istros"ursores e Re,istros

    Exemplo:

    :: Este loco imprime os )a)os )os funcionGrios com oIeti?o )e ?en)a maior Jue K888

    DECLARE

    C1R$OR func $

    $ELECT

    &RO' &1!CO!ARO$

    W(ERE oIeti?o*?en)a / K888;

    reg*func func%ROWTYPE;

    "E#!

    OPE! func;

    LOOP

    &ETC( func !TO reg*func; EXT W(E! func%!OT&O1!D;

    D"'$*O1TP1T-P1T*L!E2reg*func-nome5;

    D"'$*O1TP1T-P1T*L!E2reg*func-salario5;

    D"'$*O1TP1T-P1T*L!E2reg*func-oIeti?o*?en)a5;

    D"'$*O1TP1T-P1T*L!E2reg*func-ramal5;

    E!D LOOP;

    CLO$E func;E!D;

    Oracle Database 11g

    48

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    49/58

    "ursores (#R Loops"ursores (#R Loops

    utilizando Su&/ueriesutilizando Su&/ueries

    Jma outra maneira de implementar cursores 5

    utiliAando diretamente uma subquerie nocomando O. or5m (oc@ no poder utiliAar osatributos de cursores, porque no Cou(e adeclarao do nome do cursor.

    Oracle Database 11g

    4%

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    50/58

    "ursores (#R Loops"ursores (#R Loops

    utilizando Su&/ueriesutilizando Su&/ueries

    Exemplo

    Ae"in

    fo! )_luno in @ select codi"o nome f!om luno# loop dbms_output.put_line @)_luno.codi"oRR S RR)_luno.nome#$

    end loop$End$

    Oracle Database 11g

    5&

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    51/58

    "ursores !arametrizados"ursores !arametrizados

    +!Tmet!os pe!mitem pss! )lo!es p! um cu!so! undo ele> be!to e usdo dent!o de su ue!O undo el > executd.sto si"nific ue um cu!so! pode se! be!to di)e!ss )eesdent!o de um bloco !eto!nndo um conPunto dife!ente de linHs cd )e ue > be!to.

    *s p!Tmet!os so pssdos posicionlmente undo o cu!so!> be!to sendo !efe!encidos dent!o d ue!O ue compUe o

    cu!so! e t!tdos como um )!i()el +,-/,.

    Oracle Database 11g

    51

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    52/58

    Exemplo:

    :: Este loco imprime o nome e o salario )os funcionarios com

    :: salario maior Jue um certo ?alor a ser entra)o

    DECLARE

    C1R$OR C0 2p0 !1'"ER5 $

    $ELECT &RO' funcionarios

    W(ERE salario / p0;

    ?*c0 C0%ROWTYPE;

    ?*aux !1'"ER;

    "E#!

    OPE! C028885;

    LOOP

    &ETC( C0 !TO ?*c0;

    EXT W(E! C0%!OT&O1!D;

    D"'$*O1TP1T-P1T*L!E2?*c0-nome5;

    D"'$*O1TP1T-P1T*L!E2?*c0-salario5;

    E!D LOOP;

    CLO$E C0;E!D;

    "ursores !arametrizados"ursores !arametrizados

    Oracle Database 11g

    52

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    53/58

    "lusula (#R U!DATE"lusula (#R U!DATE

    Bomo existem muits sessUes num simples bnco de ddosexiste possibilidde de um dete!mindd linH se! lte!ddepois do cu!so! te! sido be!to. E )oc0 no )e!( est lte!o

    enunto no !eb!i! o cu!so!.

    +! !esol)e! est uesto usse cl(usul fo! updte ue i!(d! um locV ns linHs do cu!so!. =est mnei! nenHum out!sesso pode!( lte!! ou delet! os !e"ist!os ue fo!m!eto!ndos do cu!so!.

    Oracle Database 11g

    53

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    54/58

    "lusula (#R U!DATE"lusula (#R U!DATE

    #intaxe:#'%'-Y OMYO JD0-'RO O%JM2''''SRO;0I-Q;0I-S4

    Onde : column#re$erence 5 a coluna da consulta quedeterminar o controle de locZ*pode ser uma lista decolunas/

    no(aitretorna um erro Oracle se a linCa )orlocZada em outra sesso.

    O O JD0-' 5 a Kltima clusula do #'%'-. De(e (irdepois do order b3 *caso exista/.

    Oracle Database 11g

    54

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    55/58

    "lusula (#R U!DATE"lusula (#R U!DATE

    declare

    cursorc_teste is select)1)2)3 fromteste forupdateof)3$begin

    ...end$

    Oracle Database 11g55

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    56/58

    "lusula 01ere current of"lusula 01ere current of

    Est cl(usul > usd em conPunto com fo! updte p! se !efe!i! o!e"ist!o co!!ente do cu!so!. * KHe!e cu!!ent of pode se! usdo em updte edelete.

    Exemplodeclare

    cursorc_teste is select)1)2)3 fromteste forupdateof)3$begin

    for)_teste inc_teste loop updateteste set)3 C )3 W 1 wherecurrentofc_teste$endloop$

    end$

    Oracle Database 11g56

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    57/58

    "ursor com Su&/ueries"ursor com Su&/ueries

    Jm outro tipo de instruo #$% 5 a que permite que uma

    estrutura de #'%'- tenCa na sua clusula OM umoutro #'%'-. 'sta subquerie )uncionar como uma basetemporria para o #'%'- principal.

    Oracle Database 11g57

    Instrutor: Mrcio Mendona

  • 7/24/2019 PL_SQL Parte II

    58/58

    "ursor com Su&/ueries"ursor com Su&/ueries

    Exemplo

    =ecl!e cu!so! c_luno is select .codi"o .nome p!of.desc!ico f!om lunos

    @select codi"o desc!ico f!om p!ofissoes# p!of KHe!e .codi"o_p!ofisso C p!of.codi"o$Ae"in fo! )_luno in c_luno loop dbms_output.put_line @)_luno.codi"oRRXXRR)_luno.nome RRXXRR )_luno.desc!ico#$ end loop$

    End$