You are on page 1of 185

Desenvolvimento de Aplicaes

em PL/SQL em Banco de Dados


Oracle8i
PO8i
Reviso 1.
Apostila desenvolvida especialmente para a On !ar""et #n$orm%tica Ltda.
S&a c'pia o& reprod&o ( e)pressamente proi*ida.
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
S&m%rio
1. Introduo: Estruturas PL/SQL de Banco de Dados.................................................................1
O*+etivos.......................................................................................................................................,
Desenvolvendo pro"ramas PL/SQL - .iso /eral.......................................................................0
Blocos PL/SQL an1nimos2 reviso...............................................................................................3
4str&t&ra *%sica de &m *loco PL/SQL an1nimo...................................................................3
Blocos PL/SQL nomeados2 s&*pro"ramas...................................................................................5
.anta"ens do &so de Procedimentos e 6&nes de Banco de Dados...........................................7
Di$erenas entre S&*pro"ramas de Banco de Dados e S&*pro"ramas de Aplicao...................8
9riando Procedimentos e 6&nes de Banco de Dados................................................................8
4)ec&tando S&*pro"ramas...........................................................................................................:
O Am*iente de Desenvolvimento do Proced&re B&ilder..............................................................1
As +anelas ;&e compe o am*iente do Proced&re B&ilder so2............................................,
<anela O*+ect =avi"ator................................................................................................................0
<anela Pro"ram >nit 4ditor...........................................................................................................3
<anela Stored Pro"ram >nit 4ditor...............................................................................................5
<anela Data*ase !ri""er 4ditor.....................................................................................................7
<anela PL/SQL #nterpreter............................................................................................................8
2. Procedimentos de Banco de Dados...............................................................................................1
O*+etivos.......................................................................................................................................,
9riando Procedimentos de Banco de Dados atrav(s do SQL?Pl&s..............................................0
9riando Proced&res pelo Proced&re B&ilder.................................................................................5
Par@metros....................................................................................................................................8
Par@metros #=...............................................................................................................................8
Par@metros O>!...........................................................................................................................:
Par@metros #= O>!....................................................................................................................1
Par@metros O>! e #= O>! por re$erAncia.........................................................................1
4)ec&tando Proced&res e 6&nes com BCltiplos Par@metros..................................................11
Passando par@metros - B(todo Posicional.........................................................................11
Passando Par@metros - B(todo =omeado..........................................................................11
Passando Par@metros - B(todo 9om*inado.......................................................................1,
4)ec&tando Procedimentos.........................................................................................................10
SQL?Pl&s............................................................................................................................10
Proced&re B&ilder...............................................................................................................13
Blocos PL/SQL...................................................................................................................15
4)ec&tando Proced&res e 6&nes em O&tro ScDema........................................................15
4)ec&tando Proced&res e 6&nes em &m Banco de Dados Remoto.................................15
4)ercEcios ,.................................................................................................................................17
3. un!es de Banco de Dados..........................................................................................................1
O*+etivos.......................................................................................................................................,
9riando 6&nes de Banco de Dados atrav(s do SQL?Pl&s........................................................0
9riando 6&nes pelo Proced&re B&ilder.....................................................................................5
9onsideraes so*re 6&nes de Banco de Dados.......................................................................7
Par@metros em 6&nes e 4)ec&o com BCltiplos Par@metros.................................................8
4)ec&tando 6&nes.....................................................................................................................8
4)ec&tando 6&nes a partir do SQL?Pl&s..........................................................................8
4)ec&tando 6&nes a partir do Proced&re B&ilder..............................................................8
4)ec&tando 6&nes a partir de &m *loco PL/SQL..............................................................8
DBC Database Company
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
Removendo 6&nes de Banco de Dados.....................................................................................:
Pelo SQL?Pl&s......................................................................................................................:
Pelo Proced&re B&ilder.........................................................................................................:
4)ercEcios 0.................................................................................................................................1
". #ratamento de E$ce!es................................................................................................................1
O*+etivos.......................................................................................................................................,
!ratando 4)cees........................................................................................................................0
#nterr&pes de Pro"rama.............................................................................................................3
4)cees Pr(-de$inidas Oracle.....................................................................................................7
SQL9OD4 e SQL4RRB.....................................................................................................8
4)cees De$inidas pelo Desenvolvedor......................................................................................8
Propa"ando &ma 4)ceo Oracle...............................................................................................1
O&tros e)emplos de e)cees2............................................................................................11
4)ercEcios 3.................................................................................................................................10
%. &erenciando Procedures e un!es de Banco de Dados............................................................1
O*+etivos.......................................................................................................................................,
/erenciando Procedimentos e 6&nes - .iso /eral..................................................................0
#n$ormaes so*re Procedimentos e 6&nes armaFenadas no Banco de dados..................0
Doc&mentao..............................................................................................................................0
9ons&ltando o 9'di"o 6onte........................................................................................................3
9ons&ltando o =ome e a Lista de Par@metros..............................................................................5
9ons&ltando 4rros.........................................................................................................................7
Dep&rando S&*pro"ramas.............................................................................................................:
Dep&rao no SQL?Pl&s.......................................................................................................:
Dep&rao no Proced&re B&ilder........................................................................................11
9omponentes do Proced&re B&ilder...................................................................................13
9omandos do PL/SQL #nterpreter......................................................................................13
Desa*ilitando BreaGpoints..................................................................................................15
9ons&ltando e Alterando o .alor de .ari%veis Locais d&rante a Dep&rao....................15
9ontrolando a Se"&rana............................................................................................................17
4)ercEcios 5.................................................................................................................................18
'. &erenciando De(end)ncias em Procedimentos e un!es.........................................................1
O*+etivos.......................................................................................................................................,
/erenciando DependAncias...........................................................................................................0
!ipos de DependAncias.................................................................................................................3
DependAncias Diretas...........................................................................................................3
DependAncias #ndiretas.........................................................................................................3
DependAncia Local...............................................................................................................5
DependAncia Remota............................................................................................................5
!ratamento de DependAncias Locais Diretas................................................................................7
9ons&ltando a viso >S4RHD4P4=D4=9#4S...................................................................7
!ratamento de DependAncias Locais #ndiretas.............................................................................8
9ons&ltando as ta*elas D4P!R44 e #D4P!R44.................................................................8
9ons&ltando a viso D4P!R44...........................................................................................8
9ons&ltando a viso #D4P!R44..........................................................................................8
Recompilando Proced&res e 6&nes.........................................................................................1
9ompilando &ma Proced&re................................................................................................1
9ompilando &ma 6&no....................................................................................................1
DBC Database Company ##
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
9riando O*+etos no Besmo ScDema da Proced&re....................................................................1,
.eri$icando o Stat&s de Proced&res e 6&nes...........................................................................1,
.eri$icando Privil("ios para e)ec&o de Proced&res e 6&nes...............................................10
Recompilando Proced&res e 6&nes #mplicitamente................................................................13
Becanismo de Recompilao A&tom%tica para DependAncias Locais..............................13
!ratamento 4)plEcito de DependAncias Remotas.......................................................................15
Becanismo de !ratamento a&tom%tico de dependAncias Remotas............................................17
4)ercEcios 7.................................................................................................................................18
*. Desen+o,+endo e -ti,i.ando Pac/a0es..........................................................................................1
O*+etivos.......................................................................................................................................,
Desenvolvendo PacGa"es - .iso /eral.......................................................................................0
9onstr&es em PacGa"es.....................................................................................................0
9onstr&es PC*licas em PacGa"es......................................................................................0
9onstr&es Privadas em PacGa"es......................................................................................0
9riando PacGa"es de Banco de Dados..........................................................................................3
Passos para a criao de &ma PacGa"e..................................................................................3
9riando a PacGa"e speci$ication no SQL?Pl&s.....................................................................3
9riando a PacGa"e speci$ication no Proced&re B&ilder........................................................5
9riando o PacGa"e BodI...............................................................................................................8
9riando o PcGa"e BodI pelo SQL?Pl&s...............................................................................8
9riando o PacGa"e BodI pelo Proced&re B&ilder................................................................8
De$inindo &ma Proced&re de Jnica 4)ec&o...........................................................................11
Removendo a PacGa"e speci$ication...........................................................................................1,
Removendo o PacGa"e BodI......................................................................................................1,
#nvocando 9onstr&es de PacGa"es..........................................................................................10
#nvocando 9onstr&es de PacGa"es a partir de 9onstr&es da PacGa"e.........................10
...........................................................................................................................................10
#nvocando 9onstr&es de PacGa"es a partir de 9onstr&es e)ternas K PacGa"e.............13
/erenciando PacGa"es................................................................................................................17
/erenciando DependAncias em PacGa"es...................................................................................18
DependAncias em re$erAncias a constr&es de &ma pacGa"e............................................18
DependAncias em re$erAncias de &ma PacGa"e a Proced&res e 6&nes normais..............18
Recompilando PacGa"es.....................................................................................................18
Bene$Ecios do &so de PacGa"es...................................................................................................18
4)ercEcios 8.................................................................................................................................1:
8. Desen+o,+endo e -ti,i.ando Data1ase #ri00ers..........................................................................1
O*+etivos.......................................................................................................................................,
Data*ase !ri""ers - .iso /eral...................................................................................................0
4lementos de &ma Data*ase !ri""er....................................................................................0
!ri""ers em nEvel de LinDa e em nEvel de 9omando....................................................................3
9riando &ma !ri""er ao nEvel de 9omando..................................................................................3
!empos..................................................................................................................................3
9riando &ma tri""er com*inando v%rios eventos.........................................................................7
!ri""ers em nEvel de LinDa...........................................................................................................8
4)ec&o condicional2 cl%&s&la LM4=...............................................................................:
!ri""ers #=S!4AD O6...............................................................................................................1
Removendo &ma Data*ase !ri""er.............................................................................................11
Re"ras para &so de !ri""ers........................................................................................................1,
/erenciando Data*ase !ri""ers..................................................................................................15
Desa*ilitando Data*ase !ri""ers................................................................................................17
DBC Database Company ###
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
9ons&ltando o 9'di"o 6onte de Data*ase !ri""ers...................................................................18
Privil("ios =ecess%rios para Desenvolver Data*ase !ri""ers....................................................18
4)ercEcios 8.................................................................................................................................1:
2. 3ani(u,ando O14etos &randes....................................................................................................1
O*+etivo........................................................................................................................................,
!ipos de o*+etos "randes NLar"e O*+ects O LOBP........................................................................0
9aracterEsticas "erais de campos LOB.........................................................................................3
9riando &ma !a*ela com campos LOB................................................................................3
LOBs #nternos...............................................................................................................................5
ArmaFenamento #n-Line e O&t-o$-Line................................................................................5
LOBs 4)ternos..............................................................................................................................7
O Alias de Diret'rio..............................................................................................................7
9omparao entre !ipos de Dados LOB e LO=/.......................................................................8
!ra*alDando com LOBs &sando SQL...........................................................................................:
!ra*alDando com LOBs &sando PL/SQL2 pacGa"e DBBSHLOB..............................................1
Rotinas da pacGa"e DBBSHLOB.......................................................................................1
Rotinas ;&e modi$icam LOBs #nternos2.............................................................................1
Rotinas ;&e LAem dados de LOBs2.....................................................................................1
Rotinas ;&e tra*alDam com B6#L4s Nsomente de leit&raP2.................................................1
Rotinas de a*ert&ra e $ecDamento de LOBs2......................................................................1
DBBSHLOB.LR#!4.................................................................................................................13
Removendo LOBs.......................................................................................................................15
4)ercEcios :.................................................................................................................................17
15. #ra1a,6ando com #i(os O14eto..................................................................................................1
O*+etivo........................................................................................................................................,
!ipos O*+etos................................................................................................................................0
4str&t&ra de &m !ipo O*+eto........................................................................................................3
O*+etos !ransit'rios N!ransient O*+ectsP..............................................................................3
Atri*&tos...............................................................................................................................3
B(todos................................................................................................................................5
B(todos Bem*er e Static.....................................................................................................5
B(todos 9onstr&tores...........................................................................................................5
9riando !ipos O*+eto....................................................................................................................7
9riando &ma 4speci$icao de !ipo O*+eto.........................................................................7
Sinta)e..................................................................................................................................7
Restries..............................................................................................................................7
9riando &m 9orpo de &m !ipo O*+eto.................................................................................8
Sinta)e..................................................................................................................................8
4)emplo de 9riao de !ipos O*+etos.................................................................................8
>tiliFando os !ipos O*+etos em !a*elas......................................................................................:
9ol&nas de tipo o*+eto..........................................................................................................:
!a*elas de O*+etos..............................................................................................................1
Operador .AL>4...............................................................................................................1
9Damada de B(todos de O*+etos...............................................................................................11
9ons&ltando Descries de !ipos O*+eto no Dicion%rio de Dados............................................1,
#n$ormaes so*re tipos o*+eto podem ser encontradas nas vises2...................................1,
#n$ormaes so*re m(todos de tipos o*+eto podem ser encontradas nas vises2................1,
4)ercEcios 1...............................................................................................................................10
DBC Database Company #.
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
11. So,u!es.........................................................................................................................................1
4)ercEcios ,...................................................................................................................................,
4)ercEcios 0...................................................................................................................................3
4)ercEcios 3...................................................................................................................................7
4)ercEcios 5...................................................................................................................................8
4)ercEcios 7.................................................................................................................................11
4)ercEcios 8.................................................................................................................................10
4)ercEcios 8.................................................................................................................................17
4)ercEcios :.................................................................................................................................18
4)ercEcios 1...............................................................................................................................1:
DBC Database Company .
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
1.
1.
Introduo: Estruturas PL/SQL de
Introduo: Estruturas PL/SQL de

Banco de Dados
Banco de Dados
DBC Database Company
Sol&es
O14eti+os
9onDecer os tipos de constr&es PL/SQL e)istentes para *anco de dados Oracle.
Analisar as vanta"ens do &so dessas constr&es.
Di$erenciar PL/SQL &sado em *anco de dados de PL/SQL &sado em aplicaes cliente.
9onDecer as $erramentas &tiliFadas na constr&o de PL/SQL em *anco de dados.
DBC Database Company ,
Sol&es
Desen+o,+endo (ro0ramas PL/SQL 7 8iso &era,
9onstr&es PL/SQL podem tomar di$erentes $ormas dependendo de onde so desenvolvidas
e &tiliFadas. =ormalmenteQ so desenvolvidos os cDamados *locos an1nimos o& ento
s&*pro"ramas. DessesQ o primeiro tipo $oi visto no decorrer do c&rso #ntrod&o ao Oracle O SQL e
PL/SQL.
=este c&rsoQ sero vistas as se"&intes constr&es PL/SQL2
Procedimentos e 6&nes PL/SQL.
PacGa"es.
!ri""ers.
!ipos O*+eto.
!odas elas armaFenadas e e)ec&tadas pelo servidor de *anco de dados Oracle.
Dessas estr&t&rasQ os procedimentos e $&nes de aplicao $&ncionam de $orma an%lo"a aos
procedimentos e $&nes de *ancoQ a serem vistos nesse c&rsoQ por(m so &sadas em aplicativos
desenvolvidos em Developer 7Q e por isso so co*ertas no c&rso de Oracle 6orms 7 e Oracle
Reports 7.
DBC Database Company 0
Sol&es
B,ocos PL/SQL an9nimos: re+iso
Blocos PL/SQL an1nimos so criados para serem e)ec&tados imediatamente ap's s&a
compilaoQ como no caso do &so de scripts no SQL?Pl&sR o& para $aFerem parte de &ma aplicao
;&e os e)ec&tar% em &m momento pr(-determinadoQ como no caso de tri""ers Na serem vistas mais
adianteQ neste c&rsoP.
Blocos an1nimos poss&em &ma estr&t&ra ;&e cont(m as palavras-cDave SB4/#=T e S4=DT
como delimitadores o*ri"at'rios de inEcio e $im da seo de comandos e)ec&t%veisQ e as palavras-
cDave SD49LAR4T e S4U94P!#O=T como delimitadores opcionais das sees de declarao de
vari%veis e declarao de e)ceesQ respectivamente.
Estrutura 1:sica de um 1,oco PL/SQL an9nimo.
=a seo de declarao de vari%veisQ so declarados identi$icadores e estr&t&ras de mem'ria a
serem &sados ao lon"o do pro"rama Nseo e)ec&t%velPQ tais como vari%veis escalaresQ c&rsoresQ
e)cees do &s&%rioQ etc. 4 na seo de declarao de e)ceesQ so especi$icadas ;&e aes devem
ser tomadas no caso de determinadas circ&nst@nciasQ normalmente errosQ ocorrerem d&rante a
e)ec&o do pro"rama.
E$em(,o:
DBC Database Company 3
[DECLARE
Seo de declarao de variveis]
BEGIN
Seo de comandos executveis
[EXCEPTION
Seo de tratamento de excees]
END;
DECLARE
nPreco cursos.preco%TYPE;
BEGIN
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = &Codigo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(`Cdigo de curso invlido');
END;
Sol&es
B,ocos PL/SQL nomeados: su1(ro0ramas
S&*pro"ramas so pro"ramas PL/SQL identi$icados por ca*ealDos ;&e permitem a &ma
aplicao disparar cDamadas destes pro"ramas em tempo de e)ec&o. 4sses s&*pro"ramas podem
ser e)ec&tados inCmeras veFes e compe pedaos de &ma aplicao maiorQ daE o se& nome.
Al(m dissoQ s&*pro"ramas podem rece*er ar"&mentos Npar@metrosP de $orma a e)ec&tarem
comandos em conte)tos di$erentes a cada cDamadaQ tornando se& c'di"o mais $le)Evel.
S&*pro"ramas so divididos em d&as cate"orias2 procedimentos Nproced&resP e $&nes
N$&nctionsP. 4ssa cate"oria ( determinada pelas palavras-cDave PRO94D>R4 e 6>=9!#O= no
inEcio do ca*ealDo ;&e precede o c'di"o PL/SQLQ o ;&al declara tam*(m os par@metros do
s&*pro"ramaQ eQ para $&nesQ o tipo de retorno. A sinta)e completa ser% vista mais adiante.
4str&t&ra *%sica de &m s&*pro"rama.
E$em(,o:
DBC Database Company 5
CABEALHO
IS
[Seo de declarao de variveis]
BEGIN
Seo de comandos executveis
[EXCEPTION
Seo de tratamento de excees]
END;
PROCEDURE exemplo1
IS
cMensagem VARCHAR2(20);
BEGIN
SELECT `Hello World'
INTO cMensagem
FROM dual;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(`Falha na tabela
dual');
END;
Sol&es
8anta0ens do uso de Procedimentos e un!es de Banco de
Dados
Bod&lariFao da aplicao.
A mod&lariFao dos processos ;&e compe &ma aplicao ( caracterEstica $ortemente
presente e recomendada no desenvolvimento de aplicaes. A criao de procedimentos e $&nes
armaFenadas no *anco de dados provA &ma $orma de mod&lariFao alternativa K;&elas presentes
nos am*ientes de desenvolvimentoQ tais como o Oracle 6orms.
Se"&rana e inte"ridade de dados esta*elecida pelo procedimento o& $&noQ e no
diretamente pelos o*+etos re$erenciados pelo procedimento.
O controle de acesso Ks ta*elas e o&tros o*+etos do *anco pode ser $eito atrav(s da
distri*&io de acessos aos procedimentos e $&nesQ ao inv(s da distri*&io de acessos Ks ta*elas
diretamente. Dessa $ormaQ &m &s&%rio poder% inserir &m re"istro em &ma ta*elaQ por e)emploQ se
tiver acesso K proced&re ;&e e)ec&ta tal aoQ por(m no poder% $aFA-lo diretamente atrav(s de &m
comando #=S4R!. =ote ;&eQ para e)ec&tar &m procedimento o& $&no ;&e e)ec&te aes so*re
o*+etos do *ancoQ o &s&%rio no necessita ter privil("ios so*re tais o*+etos. 4le necessita apenas de
privil("io de e)ec&o so*re o procedimento o& $&no. Al(m dissoQ ( possEvel "arantir ;&e aes
relacionadas se+am e)ec&tadas sempre em con+&ntoQ $aFendo com ;&e os procedimentos e)ec&tem
mais de &ma ao.
Baior desempenDo.
Procedimentos e $&nes armaFenados no *anco de dados poss&em melDor desempenDo ;&e
a;&eles armaFenados em scripts o& mesmo em m'd&los Oracle 6orms. >ma das raFes se deve ao
$ato do processo de parsing Nan%lise sint%ticaP dos comandos PL/SQL ser e)ec&tado no momento
da compilaoQ e no no momento da e)ec&oQ como ocorre com scripts. 4m se"&ndo l&"arQ
permite ;&e &s&%rios $aam &so da %rea de mem'ria compartilDada do servidor OracleQ ;&e
armaFena c'di"o SQLQ visto ;&e v%rios &s&%rios e)ec&tam o mesmo *loco de c'di"o. 4m terceiro
l&"arQ estando os procedimentos e $&nes no *ancoQ evita-se tr%$e"o na rede e dimin&i-se o nCmero
de cDamadas $eitas ao servidor.
Ban&teno de &m Cnico c'di"o.
9om apenas &m *loco de c'di"o &tiliFado por v%rios &s&%rios eQ possivelmenteQ por v%rios
m'd&los de &ma aplicao o& aplicaesQ o processo de man&teno se torna mais $%cil. O&tra
caracterEstica ( a possi*ilidade de ser $eita a man&teno de &m procedimento sem inter$erir com a
&tiliFao deste por o&tros &s&%rios.
DBC Database Company 7
Sol&es
Di;erenas entre Su1(ro0ramas de Banco de Dados e
Su1(ro0ramas de <(,icao
Su1(ro0ramas de Banco de Dados Su1(ro0ramas de <(,icao
ArmaFenados no *anco de dados Oracle. ArmaFenados nos m'd&los Oracle 6ormsQ
Oracle ReportsQ e Oracle /rapDics da
aplicao.
Doc&mentados no dicion%rio de dados
Oracle.
Doc&mentados nos m'd&los da aplicao.
4)ec&tados a partir de ;&al;&er am*iente
;&e acesse o *anco de dados Oracle.
4)ec&tados a partir dos m'd&los da
aplicao.
Podem re$erenciar o&tros s&*pro"ramas
de *anco de dados.
Podem re$erenciar s&*pro"ramas da
aplicao e s&*pro"ramas de *anco de
dados.
DisponEvel para aplicaes a partir de
comandos de controle de se"&rana do
*anco de dados.
DisponEvel para aplicaes por meio de
se"&rana ao nEvel do m'd&lo.
O1s.: no decorrer do c&rsoQ os termos procedimento o& proced&re sero &tiliFados
"enericamente para descrever procedimentos o& $&nes de *anco de dadosQ para simpli$icao.
DBC Database Company 8
Sol&es
=riando Procedimentos e un!es de Banco de Dados
Procedimentos e $&nes de *anco de dados so considerados o*+etos do *anco assim como
ta*elasQ sin1nimosQ visesQ etc. Dessa $orma podemos criar proced&res do mesmo +eito ;&e criamos
estes o&tros o*+etosQ atrav(s do SQL?Pl&s.
E$em(,o: criando &ma proced&re via SQL?Pl&s2
4ntretantoQ no con+&nto de $erramentas Developer 7 est% incl&Eda &ma $erramenta cDamada
Proced&re B&ilderQ desenvolvida especE$icamente para o tra*alDo com c'di"o PL/SQL armaFenado
em *anco de dados.
E$em(,o: criando &ma proced&re via Proced&re B&ilder2
DBC Database Company 8
Sol&es
E$ecutando Su1(ro0ramas
O m(todo de e)ec&o de s&*pro"ramas depende do am*iente a partir do ;&al ele est% sendo
e)ec&tado. =o SQL?Pl&s e no Server Bana"erQ dispara-se &m procedimento o& $&no atrav(s do
comando 4U49>!4. A partir de o&tro *loco PL/SQLQ se+a em &m m'd&lo Oracle 6ormsQ Oracle
ReportsQ o& o&tro s&*pro"ramaQ devem ser $eitas cDamadas diretas ao nome do s&*pro"rama.
!am*(m so &sadas cDamadas diretas no Proced&re B&ilderQ na linDa de comando da +anela
PL/SQL #nterpreter.
E$em(,o2 e)ec&tando &m procedimento a partir do SQL?Pl&s2
E$em(,o: e)ec&tando &ma proced&re a partir de &ma tri""er Pre-#nsertQ ao nEvel de m'd&loQ
em &m m'd&lo Oracle 6orms2
E$em(,o: e)ec&tando &ma proced&re a partir do Proced&re B&ilder2
DBC Database Company :
SQL> EXECUTE aumenta_salario;
PL/SQL procedure sucessfully completed.
SQL> SELECT sal
2 FROM emp
3 WHERE ename = `KING';
SAL
---------
5500
BEGIN
aumenta_salario; => Dispara a procedure de
banco
END;
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
O <m1iente de Desen+o,+imento do Procedure Bui,der
O Proced&re B&ilder se"&e os mesmos padres das demais $erramentas do Developer 72
6orms B&ilderQ Report B&ilder e /rapDics B&ilder. S&a &tiliFao ( $eita por meio de +anelas e
men&s. Se vocA tem conDecimento de al"&ma das o&tras $erramentas do Developer 7 poder%
reconDecer as +anelas O*+ect =avi"atorQ PL/SQL 4ditor e PL/SQL #nterpreter. Al(m dissoQ &ma das
principais entradas do O*+ect =avi"ator no Proced&re B&ilderQ a Data*ase O*+ectsQ ( idAntica K
entrada Data*ase O*+ects encontrada no O*+ect =avi"ator das demais $erramentasQ o ;&e si"ni$ica
;&e ( possEvel &tiliFar o Proced&re B&ilder Sde dentroT das o&tras $erramentas.
O am*iente do Proced&re B&ilder ( &tiliFado em d&as linDas de desenvolvimento2 para
desenvolver *i*liotecas de s&*rotinas a serem &tiliFadas em m'd&los Oracle 6orms o& Oracle
Reports e para desenvolver constr&es PL/SQL armaFenadas e e)ec&tadas pelo *anco Oracle.
-nidades de Pro0rama Desen+o,+idas no =,iente e -nidades de Pro0rama Desen+o,+idas no
Ser+idor
Q&ando desenvolvemos s&*rotinas no Proced&re B&ilder para &so em m'd&los do Developer
7Q diF ;&e estamos desenvolvendo PL/SQL no cliente. 4 ;&ando escrevemos s&*rotinas no *anco
de dadosQ estamos desenvolvendo PL/SQL no servidor. A di$erena est% no meio de
armaFenamento e na compilao dos s&*pro"ramas.
4m termos de armaFenamentoQ desenvolver &m s&*pro"rama no cliente si"ni$ica ;&e o ele
ser% armaFenadoQ em ar;&ivo o& no *anco da dadosQ apenas ;&ando o desenvolvedor o $iFer
e)plicitamente. De o&tra $ormaQ ele ser% perdido no momento ;&e o Proced&re B&ilder $or
encerrado. Para pro"ramas desenvolvidos no servidorQ o armaFenamento ( $eito +&ntamente com a
compilao do c'di"oQ ;&ando o c'di"o ( salvo no dicion%rio de dados do *anco Oracle.
Q&anto a compilaoQ para s&*pro"ramas $eitos no clienteQ o respons%vel por ela ser% a
m%;&ina clienteQ o& se+aQ a m%;&ina local ;&e e)ec&ta o Proced&re B&ilderQ e o PL/SQL 4n"ine
Ncompilador PL/SQLPQ &sado para $aFer a compilaoQ ser% o do Proced&re B&ilder. 4m pro"ramas
$eitos no servidorQ ( o servidor ;&e ir% e)ec&tar a compilao e o PL/SQL 4n"ine &sado ( o do
servidor Oracle.
=ote ;&e &m c'di"o compilado com s&cesso pelo PL/SQL 4n"ine do servidor pode no ser
i"&almente entendido pelo PL/SQL 4n"ine do cliente e vice-versa. Pacotes de so$tVare incl&Edos
no Proced&re B&ilder NB&ilt-in PacGa"esP $ornecem rotinas destinadas a serem &sadas em
s&*pro"ramas desenvolvidos para m'd&los Oracle 6orms e Oracle ReportsQ ;&e tam*(m poss&em
esses pacotes e ;&e no so reconDecidos pelo compilador do servidor. Da mesma $orma e)istem
rotinas do servidor ;&e no so reconDecidas pelo compilador do cliente.
=o am*iente do Proced&re B&ilder s&*pro"ramas desenvolvidos no cliente so a;&eles
escritos atrav(s da +anela Pro"ram >nit 4ditor. S&*pro"ramas desenvolvidos no servidor so
a;&eles escritos atrav(s da +anela Stored Pro"ram >nit 4ditor. W possEvel SarrastarT Ncom drag-
and-dropP &m s&*pro"rama do cliente para o servidor e vice-versa no O*+ect =avi"ator Nve+a
adianteP.
DBC Database Company
Sol&es
<s 4ane,as >ue com(!e o am1iente do Procedure Bui,der so:
?ane,a Descrio
O*+ect =avi"ator /erencia constr&es PL/SQLR e)ec&ta aes de
dep&rao.
Pro"ram >nit 4ditor 9ria e edita c'di"o $onte PL/SQL.
Stored Pro"ram >nit 4ditor 9ria e edita c'di"o $onte PL/SQL no servidor.
PL/SQL #nterpreter Dep&ra c'di"o PL/SQLR e)ec&ta pro"ramas PL/SQL.
Data*ase !ri""er 4ditor 9ria e edita tri""ers de *anco
4ssas +anelas podem ser cDamadas atrav(s do item de men& Pro"ram.
DBC Database Company ,
Sol&es
?ane,a O14ect @a+i0ator
O O*+ect =avi"ator ( a +anela principal de todos aplicativos do Developer 7. 4la mostra
v%rios o*+etosQ incl&indo &nidades de pro"ramaQ o*+etos do *anco de dados e &s&%riosQ de $orma
estr&t&rada em &ma %rvore Dier%r;&ica. Permite manip&lar s&*pro"ramasQ vari%veisQ *i*liotecasQ
etc. atrav(s da e)panso e contrao dos nodos da %rvore. Permite mover &m s&*pro"rama do
am*iente cliente para o servidor atrav(s de Sdrag-and-dropT. 4ssa +anelaQ ao contr%rio das demaisQ
no pode ser $ecDada.
=a lateral es;&erda do O*+ect =avi"ator D% &ma *arra de $erramentas com *otes para a*rirQ
salvar e editar doc&mentosQ al(m de *otes para "erenciar a %rvore NcriarQ removerQ e)pandir e
contrair nodosP.
X es;&erda de cada nodo e)iste &m Econe ;&e identi$ica o se& tipoQ e &ma cai)a ;&e pode
conter &m sinal de SmaisT NYPQ o ;&e indica ;&e a;&ele nodo poss&i s&*-nodos e pode ser
e)pandidoQ o& &m sinal de SmenosT N-P o ;&e indica ;&e a;&ele nodo est% e)pandido e pode ser
contraEdo.
DBC Database Company 0
Sol&es
?ane,a Pro0ram -nit Editor
A +anela Pro"ram >nit 4ditor serve para editarQ compilarQ corri"ir e remover s&*pro"ramas no
lado do cliente. W dividido em Barra de >tilidadesQ posicionada na parte de cimaQ ;&e cont(m
*otes e &m campo de nave"aoQ Zrea de 4dioQ onde se edita o c'di"o PL/SQLQ <anela de 4rros
e Bensa"ensQ ;&e aparece a*ai)o da Zrea de 4dio ;&ando a compilao detecta errosQ e Barra de
Stat&sQ posicionada em *ai)oQ ;&e in$orma se o c'di"o $oi alterado o& no e se $oi compilado com
s&cesso o& no.
DBC Database Company 3
Sol&es
?ane,a Stored Pro0ram -nit Editor
A +anela Stored Pro"ram >nit 4ditor ( m&ito semelDante K +anela Pro"ram >nit 4ditor. 4la
serve por(mQ para editarQ compilarQ corri"ir e remover s&*pro"ramas no lado do servidor. Os
componentes da Stored Pro"ram >nit 4ditor so os mesmos2 Barra de >tilidadesQ Zrea de 4dioQ
<anela de 4rros e Bensa"ens e Barra de Stat&s. B&dam al"&ns *otes da Barra de >tilidades2 o
*oto 9ompileQ para compilaoQ ( s&*stit&Edo pelo *oto SaveQ para compilao e "ravao no
*anco de dados OracleR o *oto DeleteQ para remover rotinasQ ( s&*stit&Edo pelo *oto DropQ para
remoo de rotinas do *rancoR e o *oto ApplIQ para con$irmao das m&danas Nmas no
compilaoP no e)iste nessa +anela.
DBC Database Company 5
Sol&es
?ane,a Data1ase #ri00er Editor
=o O*+ect =avi"atorQ a*ai)o da entradas Data*se O*+ects Nome_Usurio !a*lesQ e)iste a
entrada !ri""ers. A;&i se criam tri""ers de *ancoQ ;&e poss&em c'di"o PL/SQL a ser "ravado e
e)ec&tado pelo servidor Oracle. !ri""ers de *ancoQ assim como essa +anelaQ sero vistas em
capEt&lo posterior.
DBC Database Company 7
Sol&es
?ane,a PL/SQL Inter(reter
A +anela PL/SQL #nterpreter ( dividida em dois componentes2 o So&rce PaineQ ;&e e)i*e o
c'di"o PL/SQL da rotina correntemente selecionada no O*+ect =avi"atorQ e o #nterpreter PaineQ
onde so di"itados comandos para manip&lao das rotinas. A partir do #nterpreter Paine podem ser
disparadas s&*rotinasQ di"tando-se o nome da rotina eQ se necess%rioQ valores para se&s par@metrosQ
terminando-se a cDamada com ponto-e-vEr"&laNRP.
Sinta$e:
O #nterpreter Paine aceita comandos SQL da mesma $orma ;&e o SQL?Pl&s. O So&rce Paine
serve para dep&rao de s&*pro"ramas e ser% visto em o&tro capEt&lo com mais detalDes.
DBC Database Company 8
PL/SQL>
nome_procedure[(parmetro1[,parmetro2[,...]])];
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
2.
2.
Procedimentos de Banco de Dados
Procedimentos de Banco de Dados
DBC Database Company
Sol&es
O14eti+os
9riar procedimentos de *anco de dados &tiliFando o SQL?Pl&s e o Proced&re B&ilder.
9riar procedimentos &tiliFando par@metros.
4)ec&tar procedimentos a partir do SQL?Pl&sQ do Proced&re B&ilder e de *locos PL/SQL.
Remover procedimentos do *anco de dados &tiliFando o SQL?Pl&s e o Proced&re B&ilder.
DBC Database Company ,
Sol&es
=riando Procedimentos de Banco de Dados atra+As do
SQLBP,us
9rie &m novo procedimento atrav(s do SQL?Pl&s &tiliFando o comando 9R4A!4
PRO94D>R4. 4dite o comando em &m editor de te)to e salve-o como &m scriptQ o& armaFene-o
no buffer do SQL?Pl&s. Rode o script, o& o conteCdo do bufferQ para e)ec&tar o comando e "ravar o
c'di"o-$onte e o c'di"o compiladoQ cDamado P-9odeQ no *anco de dados.
Se necess%rioQ declare &ma lista de ar"&mentos Npar@metrosP. De$ina as aes a serem
e)ec&tadas pela proced&re de$inindo identi$icadores locais Nvari%veisQ por e)emploP entre as
palavras-cDave #S e B4/#=Q e comandos PL/SQL na seo e)ec&t%velQ entre as palavras-cDave
B4/#= e 4=D No& 4=D nomeHproced&reP. Das palavras-cDaveQ apenas 4=D ( terminada com
ponto-e-vEr"&la NRP.
Sinta$e:
A compilao ser% $eita pelo servidor OracleQ ;&e ( capaF de identi$icar erros de compilao.
4la no identi$ica por(m erros de e)ec&oQ ;&e devem ser previstos pelo desenvolvedor e so
identi$icados d&rante o processamento dos procedimentos. 9aso e)istam erros de compilaoQ ser%
mostrada a se"&inte mensa"em2
Ainda assim o procedimento ser% criadoQ por(m ele no poder% ser e)ec&tado at( ;&e se+a
recriado sem erros. Para veri$icar os erros no SQL?Pl&sQ e)ec&te o comando SMOL 4RRORS. O
"erenciamento de erros ser% disc&tido em detalDes em capEt&lo posterior.
=o ( possEvel $aFermos alteraes em &m procedimento atrav(s de comandos AL!4RQ como
no caso de ta*elas NAL!4R !ABL4P. Para alterar &m procedimentoQ recrie-oQ &tiliFando a opo
OR R4PLA94.
DBC Database Company 0
CREATE [OR REPLACE] PROCEDURE nome_procedure
[(nome_parmetro [tipo] datatype,
nome_parmetro [tipo] datatype,...)]
IS
BEGIN
Comandos PL/SQL
[EXCEPTION
Tratamento de excees]
END;
Warning: Procedure created with compilation
errors.
Sol&es
E$em(,o: criando &m procedimento ;&e at&aliFa os sal%rios de todos os empre"ados.
DBC Database Company 3
SQL> CREATE OR REPLACE PROCEDURE aumenta_salario
2 IS
3 BEGIN
4 UPDATE emp
5 SET sal = sal * 1.1;
6 END;
7 /
Procedure created.
Sol&es
=riando Procedures (e,o Procedure Bui,der
1. #nvo;&e o Proced&re B&ilder atrav(s do ar;&ivo e)ec&t%vel D47.4U4Q o& SclicandoT em
&m atalDo para esse mesmo pro"rama.
,. 9onecte-se ao *anco de dadosQ selecionando no men& s&perior as opes 6ile 9onnect.
4ntre com o nome do &s&%rioQ a senDa e o nome do *anco de dados para cone)o.
0. =o O*+ect =avi"atorQ selecione a entrada Pro"ram >nits e cli;&e no *oto 9reate NEcone
SYTPQ localiFado na *arra de $erramentas K es;&erda. O di%lo"o =eV Pro"ram >nit aparecer%.
3. 4ntre &m nome para a s&*rotina e selecione o tipo de Pro"ram >nit a ser criado
NProced&reQ 6&nctionQ PacGa"e Speci$ication o& PacGa"e BodIPQ nesse casoQ &m procedimento
Nproced&reP +% vem selecionado. 9li;&e em O[. A +anela para edio de te)to NPro"ram >nit
4ditorP ser% a*erta.
5. 4dite os comandos PL/SQL ;&e comporo a proced&reQ $&no o& pacGa"e Na ser visto em
capEt&lo posteriorP. O c'di"o no inicia com o comando 9R4A!4 OR R4PLA94Q como no
SQL?Pl&sQ mas com &ma das palavras-cDave PRO94D>R4Q 6>=9!#O=Q PA9[A/4 o&
PA9[A/4 BOD\. !am*(m no se deve colocar &ma *arra N/P no $inal. O Proced&re B&ilder
DBC Database Company 5
Sol&es
e)ec&tar% esse comando implicitamente com a proced&re $or salva. Ap's a di"itaoQ e$et&e &m
cli;&e no *oto 9OBP#L4 para compilar a Pro"ram >nit. 9aso e)istam errosQ eles sero mostrados
na parte in$erior da +anela de edioQ indicando as linDas e a col&nas onde ocorreram erros e
mensa"ens e)plicativas.
7. 4m caso de errosQ corri+a-os e compile novamente. Ap's &ma compilao *em s&cedidaQ
e$et&e &m cli;&e no *oto 9loseQ para sair.
8. Para salvar a Pro"ram >nit no *anco de dadosQ e)panda a entrada Data*ase O*+ects e a
entrada para o &s&%rio ;&e ser% o dono da Pro"ram >nit. 9li;&e so*re a Pro"ram >nit ;&e vocA
crio& e e arraste-a com o mo&se pressionado. Solte o mo&se so*re a entrada Stored Pro"ram >nit
do &s&%rio ;&e ser% o dono da Pro"ram >nit.
DBC Database Company 7
Sol&es
ParCmetros
4m s&*pro"ramas PL/SQLQ declare par@metros Nar"&mentosP para esta*elecer com&nicao
entre o s&*pro"rama e o am*iente ;&e o disparo&. As re"ras e)planadas a;&i valem tanto para
procedimentos ;&anto para $&nesQ ;&e sero vistas no capEt&lo se"&inte.
4)istem trAs tipos de par@metros2
#= ]D46A>L! e)pr^
O>! ]=O9OP\^
#= O>! ]=O9OP\^
Par@metros devem ser declarados como &m tipo de dado escalar N.AR9MAR,Q =>BB4RQ
etc.P sem precisoQ o& como &m tipo _!\P4 o& _ROL!\P4.
DBC Database Company 8
Sol&es
ParCmetros I@
Passe valores a partir do am*iente cDamador para a proced&re o& $&no &tiliFando
par@metros de entrada N#=P. O tipo S#=T ( o tipo pr(-de$inidoQ o& se+aQ se no $or especi$icado &m
tipo para &m par@metroQ o tipo S#=T ( ass&mido.
Os par@metros do tipo S#=T podem ser opcionaisQ declarando-seQ ap's o tipoQ &ma cl%&s&la
D46A>L! e &ma e)presso pr(-de$inida do mesmo tipo do par@metro. Par@metros opcionais
ass&mem se&s valores pr(-de$inidos ;&ando nenD&m valor ( passado para eles na cDamada do
s&*pro"rama.
Os valores passados para &m par@metro #= podem ser constantesQ literaisQ e)presses o&
vari%veis. Dentro do s&*pro"ramaQ &m par@metro #= a"e como &ma constanteQ de $orma ;&e no
podem rece*er atri*&ies de valores dentro do s&*pro"rama N&m erro de compilao ( "erado
nesse casoP.
E$em(,o: 9riando e e)ec&tando &ma proced&re com par@metro de entrada N#=P.
4limine par@metros de entrada N#=P desnecess%riosQ derivando valores internamente na
proced&re o& &tiliFando valores de$a&ltQ o& ainda &tiliFando $&nes de derivao. Par@metros
D46A>L! devem $icar no $inal da lista de par@metros.
E$em(,o: criando e e)c&tando &m procedimento com par@metro opcinal.
DBC Database Company 8
SQL> CREATE OR REPLACE PROCEDURE aumenta_salario
2 (p_empno IN emp.empno%TYPE)
3 IS
4 BEGIN
5 UPDATE emp
6 SET sal = sal * 1.1
7 WHERE empno = p_empno;
8 END;
9 / 7 /
Procedure created.
SQL> EXECUTE aumenta_salario(7839);
PL/SQL procedure successfully completed.
SQL> CREATE OR REPLACE PROCEDURE aumenta_salario
2 (p_porcent IN NUMBER DEFAULT 10)
3 IS
4 BEGIN
5 UPDATE emp
6 SET sal = sal * (p_porcent / 100);
7 END;
8 /
Procedure created.
SQL> EXECUTE aumenta_salario;
PL/SQL procedure successfully completed.
Sol&es
ParCmetros O-#
Par@metros do tipo SO>!T servem para retornar &m valor ao am*iente cDamador. =a
cDamada de &ma rotina com par@metros de saEdaQ colo;&e nas posies desses par@metros vari%veis
dos mesmos tipos de dado. =o corpo da rotinaQ par@metros de saEda se comportam como vari%veisQ
e podem ter se&s valores atri*&Edos. 4sses valores sero passados para as vari%veis presentes na
cDamada.
E$em(,o: 9riando &ma proced&re com par@metros de saEda NO>!P.
E$em(,o: cDamada do procedimento declarado anteriormente.
DBC Database Company :
SQL> CREATE OR REPLACE PROCEDURE
consulta_empregado
2 (p_empno IN emp.empno%TYPE,
3 p_ename OUT emp.ename%TYPE,
4 p_sal OUT emp.sal%TYPE,
5 p_comm OUT emp.comm%TYPE)
6 IS
7 BEGIN
8 SELECT ename, sal , comm
9 INTO p_ename, p_sal, p_comm --
Atribuindo
10 FROM emp -- valores.
11 WHERE empno = p_empno;
12 END consulta_empregado;
13 /
DECLARE
v_nome emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_comm emp.comm%TYPE;
BEGIN
consulta_empregado(7839, -- Valor de
entrada.
v_nome, -- Valor de sada.
v_sal, -- Valor de sada.
v_comm);-- Valor de sada.
END;
Sol&es
ParCmetros I@ O-#
Passe valores a partir do am*iente cDamador para a proced&re e retorne valores nos mesmos
par@metros &tiliFando par@metros de entrada e saEda NI@ O-#P. Par@metros de entrada e saEda no
podem ser opcionais e tam*(m devem ser &tiliFadas vari%veis nas cDamadas para os ;&ais possm
ser retornados valores atri*&Edos pela proced&re o& $&no.
E$em(,o: 9riando &ma proced&re com par@metros de entrada e saEda N#= O>!P.
ParCmetros O-# e I@ O-# (or re;er)ncia.
4m PL/SQLQ os par@metros do tipo S#=T $&ncionam internamente por re$erAnciaQ en;&anto
par@metros SO>!T e S#= O>!T $&ncionam por c'pia. #sso si"ni$ica ;&eQ para esses CltimosQ na
trans$erAncia de valores entre o am*iente cDamador e o s&*pro"rama NsaEdaQ no caso do tipo
SO>!TQ e entrada/saEdaQ no caso do tipo S#= O>!TPQ tais valores so copiados entre as re"ies de
mem'ria das vari%veis presentes na cDamada e as re"ies de mem'ria dos par@metros do
s&*pro"rama.
Q&ando os valores trans$eridos em mem'ria $orem "randesQ essas c'pias se tornam onerosasQ
in$l&enciando o desempenDo da rotina. 4m Oracle8iQ ( possEvel &sarmos par@metros SO>!S e S#=
O>!T por re$erAnciaQ de modo ;&e a %rea de mem'ria &sada pela vari%vel do am*iente cDamador e
pelo par@metro do s&*pro"rama se+am a mesmaQ evitando assim ;&al;&er tra*alDo de c'pia e
melDorando si"ni$icativamente o desempenDo da rotina. Para istoQ *asta declarar esses par@metros
com a opo =O9OP\.
E$em(,o: declarando par@metros de saEda por re$erAncia.
DBC Database Company 1
CREATE OR REPLACE PROCEDURE formata_numero
(p_telefone IN OUT VARCHAR2)
IS
BEGIN
p_telefone := substr(p_telefone, 1, 3)||'-`||
substr(p_telefone, 4, 4);
END;
/
SQL> CREATE OR REPLACE PROCEDURE
consulta_empregado
2 (p_empno IN emp.empno%TYPE,
3 p_ename OUT NOCOPY emp.ename%TYPE,
4 p_sal OUT NOCOPY emp.sal%TYPE,
5 p_comm OUT NOCOPY emp.comm%TYPE)
6 IS
7 ...
Sol&es
E$ecutando Procedures e un!es com 3D,ti(,os ParCmetros
Para escrevermos cDamadas de s&*pro"ramas com par@metrosQ podemos &tiliFar trAs
m(todos2 PosicionalQ =omeado e 9om*inado. O res&ltado no &so dos di$erentes m(todos ( o
mesmo. A vanta"em no &so de &m o& o&tro m(todo est% na economia de c'di"o escrito e nas
in$ormaes ;&e deve poss&ir o desenvolvedor para &tiliFar cada m(todo.
Passando (arCmetros 7 3Atodo Posiciona,
Para &tiliFar o m(todo posicionalQ passe os valores dos par@metros na ordem em ;&e eles
$oram declarados na proced&re o& $&no. Desse modoQ o primeiro valorQ sem ele literal o& em &ma
vari%velQ ser% atri*&Edo ao primeiro par@metro declaradoQ o se"&ndo valor ao se"&ndo parametroQe
assim por diante. Para passarmos &m valor para o ;&arto par@metroQ por e)emploQ devemos
in$ormar o*ri"atoriamente valores para os trAs par@metros antecedentes. Os tipos dos valores
devem corresponderQ ( claroQ aos tipos dos par@metros declarados. O m(todo posicional ( o mais
com&mQ pois necessitamos sa*er apenas ;&e tipos de valores devem ser passados.
E$em(,o:
Passando ParCmetros 7 3Atodo @omeado
>tiliFe o m(todo nomeado ;&ando so conDecidos os nomes dos par@metros declarados na
s&*rotinaQ ;&ando se dese+a Sp&larT &m o& mais par@metros o& ;&ando no se conDece a ordem
NposiesP em ;&e os par@metros $oram declarados. Passe os valores em &ma ordem aleat'ria
precedendo-os com os nomes dos par@metros declarados na proced&re o& $&noQ se"&idos do
sEm*olo `a Ni"&al-maiorP. =ote ;&e para Sp&larT par@metrosQ o& se+aQ in$ormar valores para al"&ns
ar"&mentos apenasQ ( necess%rio ;&e se+am declarados valores default para todos K;&eles
par@metros omitidos na cDamada.
E$em(,o:
DBC Database Company 11
BEGIN
hire_emp(`Ricardo', `SALESMAN', 7839, 3000, 30);
END;
BEGIN
hire_emp( p_deptno => 32,
p_sal => 3000,
p_job => `CLERK',
p_mgr => 10,
p_ename => `Jones');
END;
Sol&es
Passando ParCmetros 7 3Atodo =om1inado
O m(todo com*inado consiste de al"&ns par@metros Nos primeirosP serem passados
posicionalmenteQ e os o&tros Nos CltimosP serem passados de $orma nominal. >ma veF ;&e se passa
&m valor na $orma nominalQ os valores s&*se;bentes no podem ser passados na $orma posicional.
E$em(,o:
DBC Database Company 1,
BEGIN
hire_emp(`Roberto', -- Forma posicional.
`CLERK', -- Forma posicional.
p_deptno => 30, -- Forma nominal.
p_sal => 2500, -- Forma nominal.
p_mgr => 7839); -- Forma nominal.
END;
Sol&es
E$ecutando Procedimentos
A sinta)e para e)ec&o de &m procedimento depende de ;&al am*iente ele est% sendo
cDamado.
Q&ando Do&verem ar"&mentos a serem passados para par@metros do procedimentoQ estes
aparecem entre parAnteses e separados por vEr"&las. Q&ando no Do&verem ar"&mentosQ no so
&sados parAnteses. Os valores dos ar"&mentos devem corresponder aos tipos de dados declarados
nos par@metros do procedimento. =o caso de par@metros de entradaQ o valor pode ser &m literalQ
&ma e)pressoQ &ma constante o& &ma vari%vel inicialiFada. =o caso de par@metros de saEda o&
entrada e saEdaQ devem ser passadas como ar"&mentos vari%veis pr(viamente declaradas com os
mesmos tipos dos par@metros.
SQLBP,us
Para e)ec&tarmos &m procedimento a partir do SQL?Pl&sQ devemos &sar o comando
4U49>!4 No& apenas 4U49P se"&ido do nome do procedimento e de se&s ar"&mentos.
Para declarar vari%veis no SQL?Pl&sQ &tiliFe o comando .AR#ABL4 No& apenas .ARPQ
se"&ido do nome e do tipo da vari%vel. .ari%veis caracter devem ter precisoQ vari%veis n&m(ricas
no.
Para vis&aliFar os valores das vari%veisQ &tiliFe o comando PR#=! o& PR#=! nome_varivel.
=a cDamada do procedimentoQ vari%veis devem aparecer com a notao de vari%veis B#=DQ
isto (Q precedidas de dois pontos N2P.
E$em(,o:
DBC Database Company 10
SQL> EXEC[UTE] nome_procedimento(valor1,
valor2, ...)
SQL> VAR nome VARCHAR2(10)
SQL> VAR salario NUMBER
SQL> VAR comm NUMBER
SQL> EXEC consulta_empregado( 7829, :nome, :salario,
:comm );
PL/SQL procedure sucessfully completed.
SQL> PRINT
NOME
----------
Joo
...
Sol&es
Procedure Bui,der
Para e)ec&tar &m procedimento no Proced&re B&ilder &se a +anela PL/SQL #nterpreter. =o
#nterpreter Paine Npainel *rancoQ na parte in$erior dessas +anelaP di"ite o nome do procedimento
se"&ido de se&s ar"&mentos e com ponto-e-vEr"&la no $inal.
Para declarar vari%veis no Proced&re B&ilderQ &tiliFe o comado .9R4A!4 com a se"&intes
sinta)es2
4ssas sinta)es server para vari%veis caracterQ n&m(ricasQ *in%rias e dataQ respectivamente.
L4=/!M ( o ar"&mento de tamanDo m%)imo para vari%veis caracter e RAL. PR49#S#O= ( o
ar"&mento de tamanDo para var%veis n&m(ricasQ e S9AL4 ( o nCmero de casas decimais das
mesmas.
=a cDamada do procedimentoQ vari%veis devem aparecer com a notao de vari%veis B#=DQ
isto (Q precedidas de dois pontos N2P.
Para vis&aliFar os valores das vari%veisQ e)ec&te o procedimento P>!HL#=4 da pacGa"e
!4U!H#OQ passando como ar"&mento &ma string composta daNsP vari%velNisP a serem vistas
NpacGa"es sero disc&tidas em capEt&lo posteriorP.
E$em(,o:
DBC Database Company 13
PL/SQL> nome_procedimento(valor1, valor2, ...); .CREATE CHAR var_name [LENGTH number]
.CREATE NUMBER var_name [PRECISION number] [SCALE
number]
.CREATE RAW var_name [LENGTH number]
.CREATE DATE var_name
TEXT_IO.PUT_LINE(string);
PL/SQL> .CREATE CHAR nome LENGTH 10;
PL/SQL> .CREATE NUMBER salario PRECISION 10;
PL/SQL> .CREATE NUMBER comm PRECISION 10;
PL/SQL> consulta_empregado( 7829, :nome, :salario, :comm );
PL/SQL> TEXT_IO.PUT_LINE(:nome||', `||:salario||', `||:comm);
Joo da Silva, 1500, 200
Sol&es
B,ocos PL/SQL
9Damadas de procedimentos de dentro de *locos PL/SQL so $eitas &sando-se o nome do
procedimento se"&ido de se&s ar"&mentos e terminados em ponto-e-vEr"&la. Q&ando &sadas
vari%veis no l&"ar dos ar"&mentosQ essas vari%veis sero locais ao *loco PL/SQL e previamente
declaradas no mesmo.
E$em(,o: cDamando &m procedimento de dentro de &m *loco an1nimo.
E$ecutando Procedures e un!es em Outro Sc6ema
4)ec&te &ma proced&re o& &ma $&no e)istente no domEnio NscDemaP de o&tro &s&%rio
pre$i)ando o nome da rotina com o nome do &s&%rio dono dessa rotinaQ passando os par@metros
necess%rios.
E$em(,o: e)ec&tando a proced&re D4B#!4H4BPR4/ADO do &s&%rio S9O!!.
E$ecutando Procedures e un!es em um Banco de Dados Eemoto
4)ec&te &ma proced&re o& &ma $&no em &m *anco de dados remoto pre$i)ando o nome da
proced&re com o nome do &s&%rio dono da proced&reQ $ornecendo o nome do AL#AS de cone)o
com o *anco de dados remoto e passando os par@metros necess%rios.
E$em(,o: e)ec&tando a proced&re D4B#!4H4BPR4/ADO do &s&%rio S9O!! no *anco
S4R.4R,.
DBC Database Company 15
DECLARE
v_nome emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_comm emp.comm%TYPE;
BEGIN
consulta_empregado(7839, v_nome, v_sal,
v_comm);
END;
SQL> EXECUTE scott.demite_empregado(7788);
SQL> EXECUTE scott.demite_empregado@server2(10);
Sol&es
E$ercFcios 2
1. 9rie &m procedimento de *anco de dados cDamado 9ADAS!RAHP4SSOA ;&e insira &m
novo re"istro na ta*ela de P4SSOAS. O procedimento deve rece*er como par@metros de entrada o
nome da pessoa e o se& tipo Ncampo P4SSH!\P4P. Os demais campos o*ri"at'rios da ta*ela
devem ser de$inidos dentro do procedimento. Para o c'di"oQ &tiliFe a se;&ence P4SSHS4QR para a
data da Cltima at&aliFaoQ &tiliFe a $&no S\SDA!4Q e para a sit&ao de cr(ditoQ a constante S#T.
O*s.2 os valores possEveis para o campo P4SSH!\P4 so2 S6TQ para pessoa $EsicaQ e S<TQ para
pessoa +&rEdica.
0. 9rie &m procedimento cDamada 9ADAS!RAH64R#ADOSQ ;&e insere &m re"istro na
ta*ela 64R#ADOS. Passe como par@metro os valores para os trAs campos da ta*ela2 D!H464!#.A
Ndata do $eriadoPQ D4S9R#9AOQ >=6H9OD#/O. 6aa com ;&e o c'di"o da &nidade $ederativa
tenDa &m valor de$a&lt de 1 NBrasilP.
3. 4)ec&te o procedimento 9ADAS!RAH64R#ADO pelo menos trAs veFesQ &sando cada &m
dos m(todos de passa"em de par@metros2 posicionalQ nomeado e com*inado.
DBC Database Company 17
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
3.
3.
Funes de Banco de Dados
Funes de Banco de Dados
DBC Database Company
Sol&es
O14eti+os
9riar $&nes de *anco de dados &tiliFando o SQL?Pl&s e o Proced&re B&ilder.
9riar $&nes &tiliFando par@metros.
4)ec&tar $&nes a partir do SQL?Pl&sQ do Proced&re B&ilder e de *locos PL/SQL.
Remover $&nes do *anco de dados &tiliFando o SQL?Pl&s e o Proced&re B&ilder.
DBC Database Company ,
Sol&es
=riando un!es de Banco de Dados atra+As do SQLBP,us
>ma $&no ( &ma s&*rotina ;&e sempre retorna &m valor para o am*iente ;&e a disparo&Q o
;&al deve estar preparado para rece*er este valor. >tiliFe &ma $&no ao inv(s de &m procedimento
;&ando a rotina retornar o*ri"atoriamente um valor. Se a rotina p&der retornar nenD&m o& mais de
&m valorQ considere o &so de &m procedimento com par@metros SO>!T No& S#= O>!TP. Por(mQ
no e)istem restries ;&anto ao &so de $&nes com par@metro de saEda.
9rie &ma nova $&no &tiliFando o comando 9R4A!4 6>=9!#O=. Se necess%rioQ declare
&ma lista de ar"&mentos Npar@metrosP. De$ina as aes a serem e)ec&tadas pela $&no de$inindo
identi$icadores locais entre as palavras-cDave #S e B4/#=Q e comandos PL/SQL na seo
e)ec&t%velQ entre as palavras-cDave B4/#= e 4=D No& 4=D nomeH$&noP. Das palavras-cDaveQ
apenas 4=D ( terminada com ponto-e-vEr"&la NRP.
Sinta$e:
De$ina tam*(m o tipo de dado a ser retornado pela $&no na cl%&s&la R4!>R=Q lo"o ap's
os par@metros. O tipo de retorno de &ma $&no deve ser &m tipo de dado aceito em PL/SQLQ tais
como BOOL4A=Q .AR9MAR,Q etcQ no $icando limitado apenas aos tipos aceitos pelo servidor
Oracle.
/aranta ;&eQ em al"&m momento d&rante a e)ec&o da $&noQ o $l&)o do pro"rama atin+a
&m comando SR4!>R=TQ encerrando o pro"rama e retornando &m valor do tipo especi$icado na
cl%&s&la R4!>R=.
Assim como nos procedimentosQ &tiliFa-se a opo OR R4PLA94 para recriar a $&noQ
$aFendo assim alteraes.
DBC Database Company 0
CREATE [OR REPLACE] FUNCTION nome_funo
[(nome_parmetro [tipo] datatype,
nome_parmetro [tipo] datatype,...)]
RETURN datatype
IS
BEGIN
Bloco PL/SQL
[EXCEPTION
Tratamento de excees]
END;
Sol&es
E$em(,o: 9riando &ma $&no ;&e retorna &m valor n&m(rico.
DBC Database Company 3
SQL> CREATE OR REPLACE FUNCTION consulta_salario
2 (p_empno IN emp.empno%TYPE)
3 RETURN NUMBER IS
4 v_salario emp.sal%TYPE := 0;
5 BEGIN
6 SELECT sal
7 INTO v_salario
8 FROM emp
9 WHERE empno = p_empno;
10 RETURN(v_salario);
11 END;
12 /
Function created.
Sol&es
=riando un!es (e,o Procedure Bui,der
Os passos para criar &ma $&no no Porced&re B&ilder so os mesmos da criao de &m
procedimento. Por(mQ no di%lo"o =eV Pro"ram >nitQ escolDa a opo S6&nctionT ao inv(s de
SProced&reT.
DBC Database Company 5
Sol&es
=onsidera!es so1re un!es de Banco de Dados
4speciais consideraes devem ser tomadas ao criar $&nes. 6&nes criadas pelo &s&%rio
podem ser &sadas tam*(m em comandos SQLQ tais como as $&nes Oracle !OH9MARQ =.LQ
S>BS!RQ etc. #sso traF as vanta"ens de e)ec&tar aes em SQL ;&e no esto disponEveis
ori"inalmente na lin"&a"emQ como processamentos mais comple)osR permitir a criao de $&nes
;&e $aam $iltra"ens de dados em cl%&s&las LM4R4R e a &tiliFao do rec&rso de e)ec&o em
paralelo de rotinas ;&e rodem em SQL ;&e se+am e)ec&tados em paralelo Npara *ancos com
Parallel OptionP.
6&nes podem estar presentes na cl%&s&la LM4R4 de comandos DBL e S4L49!. !am*(m
nas cl%&s&las S4L49!Q MA.#=/Q 9O==49! B\Q S!AR! L#!MQ /RO>P B\ e ORD4R B\ de
&m comando S4L49!. 4m comandos #=S4R!Q podem estar ainda na cl%&s&la .AL>4S. 4 em
comandos >PDA!4Q na cl%&s&la S4!.
E$em(,o: &sando &ma $&no cDamada 9alc&laHAcrescimo ;&e aceita &m nCmero como
par@metro Nno e)emploQ a col&na SALAR#OP e retorna &m nCmeroQ em &m comando S4L49!.
4ssa caracterEstica torna as $&nes de *anco de dados m&ito poderosas e est% disponEvel na
verso de PL/SQL ,.1 e posteriores. 4ntretandoQ para &tiliFar $&nes de *anco de dados em
comandos SQLQ as se"&intes restries de aplicam2
As $&nes devem ser armaFenadas no servidor de *anco de dados. #sso permite ;&e
c%lc&los se+am e$et&ados pelo servidor nos pr'prios comandos de cons&ltaQ podendo servir
para restrin"ir dados ;&e de o&tra $orma seriam retonados para a aplicao.
=o corpo da $&noQ no podem Daver comandos DBLQ o& se+aQ a $&no no pode $aFer
alteraes no *anco de dados.
A $&no deve ser do tipo Single-Ro e no !ultiple-Ro. O& se+aQ no pode ser &ma
$&no de "r&po.
Apenas par@metros do tipo S#=T so aceitos para a $&no.
!ipos de dados dos par@metros devem ser a;&eles aceitos pelo Oracle ServerQ tais como
9MARQ DA!4 o& =>BB4R. !ipos PL/SQLQ tais como BOOL4A=Q R49ORD o&
!ABL4 no so aceitos.
O tipo de retorno deve ser &m tipo aceito pelo Oracle Server.
=o so permitidas cDamadasQ no corpo da $&noQ K s&*rotinas ;&e deso*edeam al"&ma
das restries anteriores.
DBC Database Company 7
SQL> SELECT nome,
2 calcula_acrescimo(salario) `Acresc.'
3 FROM cadastro_funcionario
4 WHERE cod_funcionario = 12345;
NOME Acresc.
---------------- ---------
Joo da Silva 1328.1
Sol&es
ParCmetros em un!es e E$ecuo com 3D,ti(,os
ParCmetros
O &so de par@metros em $&nes ( idAntico ao se& &so em procedimentosQ e os trAs m(todos
de passa"em de ar"&mentos e)plicado no capEt&lo anterior para procedimentos valem tam*(m para
$&nes.
E$ecutando un!es
4)ec&te $&nes de $orma semelDante aos procedimentosQ prestando ateno Ks re"ras de cada
am*iente. =o entantoQ como &ma $&no retorna sempre &m valorQ ela deve ser atri*&Eda K &ma
vari%vel o& deve estar em &ma e)pressoQ na ;&al representar% o valor retornado.
E$ecutando un!es a (artir do SQLBP,us
>tiliFe o comando .AR#ABL4 o& No& apenas .ARP para declarar a vari%vel ;&e rece*er% o
valor retornado pela $&no. >tiliFe o comando 4U49>!4 No& apenas 4U49P para e)ec&tar &ma
atri*&io da $&no K vari%vel previamente declarada..eri$i;&e o conteCdo da vari%vel com o
comando PR#=!.
E$em(,o:
E$ecutando un!es a (artir do Procedure Bui,der
>tiliFe o comando S.9R4A!4T no PL/SQL #nterpreter para declarar a vari%vel de am*iente
;&e rece*er% o res&ltado da $&no. Atri*&a a $&no K variavel criadaQ re$erenciando-a como &ma
vari%vel B#=DQ como no SQL?Pl&sQ pre$i)ando-a com dois-pontos N2P. >tiliFe a proced&re
P>!HL#=4 da pacGa"e !4U!H#O para mostrar o res&ltado.
E$em(,o:
E$ecutando un!es a (artir de um 1,oco PL/SQL
9olo;&e a cDamada da $&no em &ma atri*&ioQ como Svar 2` $&noT
DBC Database Company 8
SQL> VARIABLE g_salario NUMBER
SQL> EXECUTE :g_salario :=
consulta_salario(7839);
PL/SQL procedure successfully completed.
SQL> PRINT g_salario
G_SALARIO
---------
5000
PL/SQL> .CREATE NUMBER numero PRECISION 7 SCALE
2
PL/SQL> :numero := consulta_salario(`KING');
PL/SQL> TEXT_IO.PUT_LINE(:numero);
5000
Sol&es
E$em(,o:
DBC Database Company 8
PROCEDURE processa_emp (p_empno IN emp.empno%TYPE)
IS
v_sal emp.sal%TYPE;
BEGIN
-- Chamada (teste) de uma funo que retorna um
-- valor booleano (TRUE/FALSE).
IF existe_empregado(p_empno) THEN
-- Chamada de uma funo que retorna um nmero.
v_sal := get_sal(p_empno);
END IF;
END;
Sol&es
Eemo+endo un!es de Banco de Dados
Pe,o SQLBP,us
>tiliFe o comando DROP 6>=9!#O= nome_fun"#o para remover &ma $&no.
E$em(,o:
Pe,o Procedure Bui,der
=o O*+ect =avi"atorQ selecione a entrada Data*ase O*+ectsQ selecione e e)panda a entrada
para o se& &s&%rio. Selecione a entrada Stored Pro"ram >nitsQ selecione a Pro"ram >nit a ser
removida e e$et&e &m cli;&e no Econe DeleteQ o& tecle Delete e con$irme a deleo.
DBC Database Company :
SQL> DROP FUNCTION consulta_salario;
Function dropped.
Sol&es
E$ercFcios 3
1. 9rie e e)ec&te &ma $&no ;&e retorne o preo de &m c&rso a partir de &m c'di"o
in$ormado como par@metro de entrada.
O*s.2 no se es;&ea de inicialiFar &ma vari%vel no Proced&re B&ilder atrav(s do comando
S.9R4A!4 =>BB4R nomeHdaHvariavel PR49#S#O= 10 S9AL4 ,TQ para rece*er o res&ltado
da $&noQ e de vis&aliFar o conteCdo dessa vari%vel atrav(s do comando
S!4U!H#O.P>!HL#=4N nomeHdaHvariavel PRT.
,. 9rie e e)ec&te &ma $&no ;&e retorne o nCmero de dias de d&rao de &m c&rso a partir
do nCmero de Doras de d&rao deste. A $&no deve aceitar &m se"&ndo par@metro !>R=OQ ;&e
mostra como os dias devem ser calc&lados. !&rnos da manD NcBdP o& da tarde Nc!dPQ so de 3
Doras. !&rnos da noite Nc=dP so de 0 Doras. 4 t&rno inte"ral Nc#dP so de 8 Doras.
0. 4)ec&te a $&no criada no e)ercEcio anterior em comandos SQLQ como S4L49!Q por
e)emplo.
DBC Database Company 1
PL/SQL> SELECT horas, calcula_duracao_curso(horas, `N')
+> FROM cursos;
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
.
.
!ratamento de E"cees
!ratamento de E"cees
DBC Database Company
Sol&es
O14eti+os
9onDecer os tipos de e)cees e)istentes em PL/SQL.
9onDecer os m(todos de tratamento de e)cees.
9ompreender como $&nciona a propa"ao de e)cees.
DBC Database Company ,
Sol&es
#ratando E$ce!es
4)cees so eventos Nnormalmente errosPQ os ;&ais podemos tratarQ desi"nando aes a
serem tomadas ;&ando &m o& mais desses eventos ocorrerem em PL/SQL.
Q&ando &m desses eventos ocorrer d&rante a e)ec&o do pro"ramaQ e no Do&ver &m
tratamento ade;&ado para eleQ o am*iente em ;&e esse pro"rama est% sendo e)ec&tado emitir% &ma
mensa"em de erro apropriadaQ como por e)emploQ &m erro do servidor Oracle o& &ma mensa"em
do Oracle 6orms.
4)istem trAs tipos de e)cees2
#nterr&pes de pro"rama com mensa"ens Ncomando RA#S4HAPPL#9A!#O=H4RRORP.
4)cees pr(-de$inidas Oracle N!OOHBA=\HROLSQ =OHDA!AH6O>=DQ etc.P.
4)cees de$inidas pelo desenvolvedor2
4)cees disparadas pelo desenvolvedor Ncomando RA#S4P.
4)cees ;&e interceptam erros Oracle Npra"ma 4U94P!#O=H#=#!P.
!rate ;&al;&er tipo de e)cees de e)ec&o na seo de tratamento de e)cees
N4U94P!#O=PQ escrevendo &m *loco PL/SQLQ o& ento permita ;&e ela se propa"&e para o
am*iente cDamador da s&*rotinaQ onde pode Daver &m tratamento mais especE$ico.
DBC Database Company 0
Sol&es
Interru(!es de Pro0rama
W possEvel interromper a e)ec&o de &m s&*pro"rama ;&e este+a rodando no servidor
$racle apenasQ atrav(s do comando RA#S4HAPPL#9A!#O=H4RROR. 4ste comando termina de
$orma normal a e)ec&o da rotina e retorna para o am*iente cDamador &ma mensa"em no $ormato
de mensa"em de erro Oracle.
O comando poss&i trAs par@metros2 &m nCmeroQ &ma strin" e &m valor *oleano. O nCmero ( o
c'di"o de erro a ser mostrado +&ntamente com a mensa"em no am*iente cDamadorQ e deve estar no
intervalo ]O,Q O,:::^. A string cont(m o te)to da mensa"em de erro com at( ,38 *Ites de
tamanDo. Por CltimoQ opcionalmenteQ vem &m valor *oleano ;&eQ se $or !R>4Q coloca o erro na
pilDa de erros pr(viosQ e se $or 6ALS4 No defaultPQ o erro so*repe o&tros erros.
O c'di"o &tiliFado no $ica de nenD&ma $orma associado K mensa"emQ e pode ser re&tiliFado
inCmeras veFes em o&tros comandos RA#S4HAPPL#9A!#O=H4RRORQ assim como a mensa"em.
A doc&mentao dos c'di"os &tiliFados em &ma aplicao e s&as respectivas mensa"ens ( de
inteira responsa*ilidade dos desenvolvedores.
Sinta$e:
#nterr&pes de pro"rama so normalmente &tiliFadas como tratamento de o&tros tipos de
e)ceesQ como e)cees pr(-de$inidasQ mas os comandos RA#S4HAPPL#9A!#O=H4RROR
podem aparecer em ;&al;&er parte e)ec&t%vel do c'di"o PL/SQL.
E$em(,o: interrompendo &m *loco PL/SQL ;&ando a data em data_vencimento $or anterior K
data at&al.
E$em(,o: &sando RA#S4HAPPL#9A!#O=H4RROR para tratar &ma e)ceo
=OHDA!AH6O>=D Nocorre ;&ando &m comando S4L49! no retorna re"istrosP.
DBC Database Company 3
RAISE_APPLICATION_ERROR(cdigo, mensagem [,{TRUE|
FALSE}]);
IF data_vencimento < SYSDATE THEN
RAISE_APPLICATION_ERROR(-20300, `Conta vencida.');
END IF;
Sol&es
DBC Database Company 5
DECLARE
v_nome cadastro_funcionario.nome%TYPE;
BEGIN
SELECT nome
INTO v_nome
FROM cadastro_funcionario
WHERE codigo = p_codigo;
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001,'Funcionrio no
encontrado.);
END;
Sol&es
E$ce!es PrA7de;inidas Orac,e
4)cees pr(-de$inidas devem ser tratadas na seo 4U94P!#O= de &m *loco de c'di"o
PL/SQLQ &tiliFando-se &ma cl%&s&la LM4= para cada e)ceo. Ap's essa cl%&s&la vem o nome da
e)ceoQ ;&e serve como teste de &ma condioQ e a cl%&s&la !M4=. Ap's essa cl%&s&laQ deve vir o
comando o& comandos ;&e determinam o ;&e deve ser $eito caso tal e)ceo ocorra Ncaso o teste
se+a verdadeiroP. A e)ceo O!M4RSQ se estiver presenteQ deve o*ri"atoriamente ser a Cltima a ser
tratadaQ pois ela a*ran"e todas as e)cees ;&e no $oram tratadas em cl%&s&las LM4= anteriores.
Sinta$e:
4sse tipo de e)ceo incl&i as e)cees !OOHBA=\HROLSQ disparada ;&ando &m
comando S4L49! retorna mais de &m re"istroQ e =OHDA!AH6O>=D ;&ando &m comando
S4L49! no retorna re"istrosQ o ;&e so comportamentos no previstos para esse comando em
PL/SQLR e O!M4RSQ &ma e)ceo de$inida para tratar demais e)cees ;&e no tenDam rece*ido
&m tratamento especE$ico.
4)istem por(mQ v%rias e)cees pr(-de$inidas na pacGa"e S!A=DARD em OracleQ e em
o&tras pacGa"es $ornecidas com o *anco de dados o& o&tros aplicativosQ como o Developer 7. Para
conDecA-lasQ deve-se cons&ltar a doc&mentao %&'S(& User)s *uide and ReferenceQ $ornecida
com o *anco de dadosQ o& o Melp Online presente nas $erramentas do Developer 7.
4)cees devem ser previstas e tratadas sempre ;&e possEvel. 4)cees no tratadas ca&sam a
interr&po a*r&pta e anormal de &ma rotina PL/SQLQ retornando para o am*iente cDamador &ma
mensa"em de erro do tipo2
>s&almenteQ o tratamento de &ma e)ceo ( $eito com o &so de comandos
RA#S4HAPPL#9A!#O=H4RROR para interromper o pro"rama emitindo &ma mensa"em. Por(m
;&al;&er ao pode ser tomadaQ incl&sive nenD&ma. >m tratamento de e)ceo pode consistirQ pr
e)emploQ apenas de &m comando S=>LLRTQ o ;&e $ar% com ;&e o pro"rama termine normalmenteQ
sem erros. Por o&tro ladoQ todo &m novo *loco PL/SQL pode ser de$inidoQ podendo incl&sive
poss&ir s&a pr'pria seo de tratamento de e)cees. 4ntretantoQ &ma veF ;&e o $l&)o de e)ec&o
( desviado para a seo 4U94P!#O=Q ele no retorna para o ponto da seo e)ec&t%vel do
pro"rama onde a e)ceo $oi disparada. >m *loco PL/SQL sempre cDe"a ao se& $im ap's se&
tratamento de e)ceoQ se"&indo a e)ec&o para o ponto onde este *loco $oi disparado.
DBC Database Company 7
BEGIN
Comandos executveis
EXCEPTION
WHEN nome_exceo1 THEN
Comandos executveis
[WHEN nome_exceo2 THEN
Comandos executveis
[WHEN nome_exceo3 THEN
Comandos executveis]]
...
END;
ORA-01403: no data found
Sol&es
E$ce!es PrA7de;inidas Orac,e 7 =ontinuao
E$em(,o:
SQL=ODE e SQLEEE3
>ma t(cnica com&m no tratamento da e)ceo O!M4RS ( o &so das $&nes SQL9OD4Q
;&e retorna o c'di"o do erro Oracle ;&e disparo& a e)ceoQ e SQL4RRBQ ;&e retorna a mensa"em
"erada por esse erro. 9om essas d&as $&nesQ podemos identi$icar &ma e)ceo e capt&rar s&a
mensa"em.
SQL9OD4 sempre retorna &m nCmero ne"ativoQ com a e)ceo de =OHDA!AH6O>=DQ em
;&e retorna Y1Q e de e)cees de$inidas pelo &s&%rioQ em ;&e retorna Y1.
E$em(,o: &sando SQL9OD4 e SQL4RRB para tratar a e)cees.
DBC Database Company 8
CREATE OR REPLACE FUNCTION existe_empregado
(p_ename IN emp.ename%TYPE) RETURN BOOLEAN IS
v_salario emp.sal%TYPE;
BEGIN
SELECT sal
INTO v_salario
FROM emp
WHERE ename = p_ename;
RETURN(TRUE);
EXCEPTION
WHEN no_data_found THEN
RETURN(FALSE);
WHEN too_many_rows THEN
RETURN(TRUE);
WHEN OTHERS
RAISE_APPLICATION_ERROR(-20210, `Exceo
desconhecida');
END;
...
EXCEPTION
WHEN SQLCODE = -2291 THEN -- Parent key not found.
NULL;
WHEN SQLCODE = -1 THEN -- Chave primria duplicada.
RAISE_APPLICATION_ERROR(-20001, `Cdigo j existe');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20009, `A seguinte exceo
ocorreu: `||SQLERRM);
END;
Sol&es
E$ce!es De;inidas (e,o Desen+o,+edor
O desenvolvedor pode criar s&as pr'prias e)cees declarando &m identi$icador do tipo
4U94P!#O= na seo de declarao de vari%veis do *loco PL/SQL. 6eito issoQ esse identi$icador
pode ser &sado para desviar o $l&)o de e)ec&o do pro"rama para a seo de tratamento de
e)cees atrav(s do comando RA#S4. 4sse identi$icador pode tam*(m ser &sado para interceptar
&m erro Oracle e)istente para o ;&al no e)iste e)ceo pr(-de$inida.
E$ce!es Dis(aradas (e,o Desen+o,+edor
=o e)emplo a se"&irQ &ma e)ceo ( declarada com o nome 9O=!AH.4=9#DA. =a seo
e)ec&t%vel &m teste ( $eito para identi$icar se &m denominador vale Fero. =esse casoQ a e)ceo (
disparada com o comando RA#S4 e o $l&)o de e)ec&o passa para a seo 4U94P!#O=Q onde
9O=!AH.4=9#DA ( tratada de $orma a interromper o pro"ramaQ passando &ma mensa"em
conveniente.
E$em(,o:
E$ce!es >ue interce(tam erros Orac,e
Q&ando ( previsto ;&e &m erro Oracle pode ocorrer d&rante a e)ec&o de &m s&*pro"ramaQ
pode-se tomar medidas para prevenir a interr&po a*r&pta com erroQ trasn$ormando este em &ma
e)ceo ;&e pode ser tratada. Para issoQ declara-se &m identi$icador do tipo 4U94P!#O= e
DBC Database Company 8
CREATE OR REPLACE FUNCTION valor_conta (p_conta IN NUMBER)
RETURN NUMBER IS
v_data_venc DATE;
v_valor NUMBER;
v_juros NUMBER;
e_conta_vencida EXCEPTION;
BEGIN
SELECT data_vencimento, valor, juros
INTO v_data_venc, v_valor, v_juros
FROM contas
WHERE codigo = p_conta;
IF p_data_vencimento < trunc(SYSDATE) THEN
RAISE e_conta_vencida;
ELSE
RETURN v_valor;
END IF;
EXCEPTION
WHEN e_conta_vencida THEN
UPDATE contas
SET valor = valor + juros
WHERE conta = p_conta;
RETURN v_valor + v_juros;
END;
Sol&es
associa-se ele ao erro previsto atrav(s de &ma cDamada pra"ma 4U94P!#O=H#=#!Q ainda na seo
de declarao de vari%veisQ passando como par@metros o nome da e)ceo criada e o nCmero do
erro Oracle e)istente ao ;&al se ;&er associar a e)ceo.
Sinta$e:
Dessa $ormaQ se o erro ocorrer d&rante a e)ec&o do s&*pro"ramaQ o $l&)o de e)ec&o ser%
a&tomaticamente desviado para a seo 4U94P!#O=Q onde ser% tratadaQ como se $osse &ma
e)ceo Oracle pr(-de$inida.
E$em(,o:
DBC Database Company :
PRAGMA EXCEPTION_INIT(nome_exceo,
numero_erro);
PROCEDURE insere_empregado
(p_empno IN emp.empno%TYPE,
p_sal IN emp.sal%TYPE,
p_deptno IN emp.deptno%TYPE)
IS
fk_inexistente EXCEPTION;
PRAGMA EXCEPTION_INIT(fk_inexistente, -2291);
BEGIN
INSERT INTO emp
(empno, sal, deptno)
VALUES
(p_empno, p_sal, p_deptno);
EXCEPTION
WHEN fk_inexistente THEN
RAISE_APPLICATION_ERROR(-20200, `Departamento no
existe');
END;
Sol&es
Pro(a0ando uma E$ceo Orac,e
>ma e)ceo se propa"a ;&ando ela no ( tratada na rotina em ;&e $oi disparada. =esse casoQ
&m tratamento para a e)ceo ( proc&rado no am*iente cDamadorQ ;&e pode ser tam*(m &ma rotina
com seo 4U94P!#O=. Se &m tratamento tam*(m no $or encontrado nesse nEvelQ a e)ceo
contin&a se propa"ando at( atin"ir &m tratamento o& o am*iente operacionalQ ;&ando &ma
mensa"em de Se)ceo no tratadaT ser% enviada.
#sso permite ;&e criemos s&*rotinas "en(ricasQ sem tratamento de e)ceoQ ;&e tero s&as
e)cees tratadas de $ormas di$erentes por cada rotina ;&e as cDamarem.
E$em(,o: procedimento ;&e cDama o&tro procedimento .eri$icaH4mpre"ado...
E$em(,o: ... ;&e no trata &ma possEvel e)ceo =OHDA!AH6O>=D.
DBC Database Company 1
PROCEDURE atualiza_cadastro(p_empno IN emp.empno
%TYPE)
IS
BEGIN
...
verifica_empregado(p_empno);
...
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR(-20001, `Funcionrio
no existe');
END;
/
PROCEDURE verifica_empregado
(p_empno IN emp.empno%TYPE) IS
nDummy INTEGER(1)
BEGIN
SELECT 1
INTO nDummy
FROM emp
WHERE empno = p_empno;
END;
Sol&es
Outros e$em(,os de e$ce!es:
E$em(,o: !ratanto &ma e)ceo Oracle pr(-de$inida.
DBC Database Company 11
CREATE OR REPLACE PROCEDURE hire_emp
(p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_sal IN emp.sal%TYPE)
IS
v_hiredate emp.hiredate%TYPE;
v_comm emp.comm%TYPE;
v_deptno emp.deptno%TYPE;
BEGIN
v_hiredate := SYSDATE;
IF p_job = 'SALESMAN' THEN
v_comm := 5;
ELSE
v_comm := NULL;
END IF;
SELECT deptno
INTO v_deptno
FROM emp
WHERE empno = p_mgr;
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm,
deptno)
VALUES
(EMP_EMPNO_SEQ.NEXTVAL, p_ename, p_job, p_mgr,
v_hiredate, p_sal, v_comm, v_deptno);
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20201, 'Cdigo de
gerente invlido');
END;
/
SQL> EXECUTE hire_emp(`Ricardo', `SALESMAN', 9999,
2000);
begin hire_emp(`Ricardo', `SALESMAN', 9999, 2000); end;
*
ERROR at line 1:
ORA-20201: Cdigo de gerente invlido
ORA-06512: at WORK1.HIRE_EMP, line 28
ORA-06512: at line 1
Sol&es
E$em(,o: !ratanto &ma e)ceo Oracle interceptada por &ma e)ceo de$inida pelo
desenvolvedor.
DBC Database Company 1,
CREATE OR REPLACE PROCEDURE hire_emp
(p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_sal IN emp.sal%TYPE,
p_deptno IN emp.deptno%TYPE)
IS
v_hiredate emp.hiredate%TYPE;
v_comm emp.comm%TYPE;
e_invalid_manager EXCEPTION;
PRAGMA EXCEPTION_INIT(e_invalid_manager, -2291);
BEGIN
v_hiredate := SYSDATE;
IF p_job = 'SALESMAN' THEN
v_comm := 10;
ELSE
v_comm := NULL;
END IF;
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm,
deptno)
VALUES
(EMP_EMPNO_SEQ.NEXTVAL, p_ename, p_job, p_mgr,
v_hiredate, p_sal, v_comm, p_deptno);
COMMIT;
EXCEPTION
WHEN e_invalid_manager THEN
RAISE_APPLICATION_ERROR(-20201, 'Cdigo de
gerente invlido');
END;
/
SQL> EXECUTE hire_emp(`Ricardo', `SALESMAN', 9999,
2000);
begin hire_emp(`Ricardo', `SALESMAN', 9999, 2000); end;
*
ERROR at line 1:
ORA-20201: Cdigo de gerente invlido
ORA-06512: at WORK1.HIRE_EMP, line 28
ORA-06512: at line 1
Sol&es
E$ercFcios "
1. Bodi$i;&e a $&no 9O=S>L!AHPR49O paraQ no caso do comando S4L49! no
rec&perar nenD&m re"istroQ o pro"rama ser interrompido com a mensa"em S=o e)iste c&rso com
esse c'di"oT.
,. Altere o procedimento 9ADAS!RAH64R#ADO para interceptar o erro de cDave prim%ria
d&plicada Nc'di"o de erro O1PQ caso tentem inserir &m $eriado +% cadastradoQ e trate o erro como
&ma e)ceoQ disparando &ma mensa"em apropriada. A cDave prim%ria de 64R#ADOS ( composta
de D!H464!#.A e >=6H9OD#/O. Provo;&e o erroQ e)ec&tando o procedimento para &m $eriado
+% e)istente.
0. A e)ceo interceptada no e)ercEcio anterior poderia ser tratada de $orma di$erentee Se
simQ comoe
DBC Database Company 10
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
#.
#.
$erenciando Procedures e
$erenciando Procedures e

Funes de Banco de Dados
Funes de Banco de Dados
DBC Database Company
Sol&es
O14eti+os
Doc&mentar e cons&ltar o c'di"o $onte de procedimentos e $&nes PL/SQL no *anco de
dados.
9ompilar procedimentos e $&nes PL/SQL no *anco de dados.
Dep&rar procedimentos e $&nes.
Prod&Fir scripts para $acilitar o desenvolvimento.
9ontrolar a se"&rana &tiliFando procedimentos e $&nes de *anco de dadosQ *em como a
se"&rana dos o*+etos ;&e as mesmas re$erenciam.
DBC Database Company ,
Sol&es
&erenciando Procedimentos e un!es 7 8iso &era,
Ap's criar procedimentos e $&nes no *anco de dadosQ o*tenDa in$ormaes so*re o c'di"o
$onte e os erros de compilao a partir de vises do Dicion%rio de Dados e comandos interativos.
In;orma!es so1re Procedimentos e un!es arma.enadas no Banco de dados
#i(o de
In;ormao
Descrio 3Atodo de acesso
9'di"o 6onte 9'di"o $onte do procedimento o&
da $&no
9ons&lte a viso
>S4RHSO>R94 o& &tiliFe o
comando D4S9R#B4.
P-code 9'di"o o*+eto compilado =o acessEvel.
4rros de
9ompilao
4rros de sinta)e 9ons&lte a viso
>S4RH4RRORS
O&
>tiliFe o comando SMOL
4RRORS.
#n$ormaes de
De*&"
#n$ormaes so*re o conteCdo de
vari%veis.
>tiliFe os procedimentos da
PacGa"e DBBSHO>!P>! o&
&tiliFe o PL/SQL #nterpreter
do Proced&re B&ilder.
Documentao
9ons&lte in$ormaes so*re todas os procedimentos e $&nes armaFenados no *anco de
dados cons&ltando a viso >S4RHOB<49!S do Dicion%rio de Dados.
.iso -SEEGOB?E=#S
=o,una Descrio
OB<49!H=AB4 =ome do o*+eto
OB<49!H#D #denti$icador interno do o*+eto para o Oracle.
OB<49!H!\P4 !ipo de o*+eto NPRO94D>R4Q 6>=9!#O=Q PA9[A/4
o& PA9[A/4 BOD\P.
9R4A!4D Data de criao do o*+eto.
BOD#6#4D Data em ;&e o o*+eto $oi modi$icado pela Cltima veF.
!#B4S!ABP Mora em ;&e o o*+eto $oi compilado pela Cltima veF.
S!A!>S Sit&ao do o*+eto N.AL#D o& #=.AL#DP. Ser% visto em
detalDe nos pr')imos capEt&los.
O1s.: cons&lte tam*(m ALLHOB<49!S e DBAHOB<49!S.
DBC Database Company 0
Sol&es
=onsu,tando o =Hdi0o onte
9ons&lte o c'di"o $onte de &m procedimento o& $&no armaFenada no *anco de dados
&sando a viso >S4RHSO>R94 do Dicion%rio de Dados.
.iso -SEEGSO-E=E
=o,una Descrio
=AB4 =ome do o*+eto
!\P4 !ipo de o*+eto NPRO94D>R4Q 6>=9!#O=Q PA9[A/4
o& PA9[A/4 BOD\P.
L#=4 =Cmero da linDa do c'di"o $onte.
!4U! !e)to da linDa do c'di"o $onte.
O1s.: 9ons&lte tam*(m ALLHSO>R94 e DBAHSO>R94.
E$em(,os de =onsu,tas
9ons&ltando o nome de todas os procedimentos e $&nes do &s&%rio conectado.
DBC Database Company 3
SQL> SELECT object_name, object_type
2 FROM user_objects
3 WHERE object_type IN (`PROCEDURE', `FUNCTION')
4 ORDER BY object_name;
SQL> SELECT text
2 FROM user_source
3 WHERE type = `PROCEDURE'
4 AND name = `CADASTRA_PESSOA';
TEXT
------------------------------------------------------
PROCEDURE cadastra_pessoa
(pNome IN VARCHAR2,
pPess_Type IN VARCHAR2)
IS
BEGIN
INSERT INTO PESSOAS
(codigo, nome, dt_ultima_atualizacao,
situacao_credito, pess_type)
VALUES
(PESS_SEQ.NEXTVAL, pNome, SYSDATE,
'I', pPess_Type);
END;
14 rows selected.
Sol&es
9ons&ltando o c'di"o $onte do procedimento 9ADAS!RAHP4SSOA.
=onsu,tando o @ome e a Lista de ParCmetros
9ons&lte o nome e a lista de par@metros de &m procedimento o& de &ma $&no armaFenada
no *anco de dados &tiliFando o comando D4S9R#B4 do SQL?Pl&s.
E$em(,os:
9ons&ltando a lista de par@metros do procedimento 9ADAS!RAHP4SSOA.
9ons&ltando a lista de par@metros da $&no 9O=S>L!AHPR49O.
DBC Database Company 5
SQL> DESCRIBE cadastra_pessoa
PROCEDURE CADASTRA_PESSOA
Argument Name Type In/Out
Default?
------------------------------ ----------------------- ------
--------
PNOME VARCHAR2 IN
PPESS_TYPE VARCHAR2 IN
SQL> DESCRIBE CONSULTA_PRECO
FUNCTION CONSULTA_PRECO RETURNS NUMBER
Argument Name Type In/Out
Default?
------------------------------ ----------------------- ------
--------
PCODIGO VARCHAR2 IN
Sol&es
=onsu,tando Erros
9ons&lte os erros de sinta)e de compilaes de procedimentos e $&nes &tiliFando a viso
>S4RH4RRORS do Dicion%rio de *anco de dados.
.iso -SEEGEEEOES
=o,una Descrio
=AB4 =ome do o*+eto.
!\P4 !ipo de o*+eto NPRO94D>R4Q 6>=9!#O=Q PA9[A/4 o&
PA9[A/4 BOD\P.
L#=4 =Cmero da linDa do c'di"o $onte onde ocorre& o erro.
POS#!#O= Posio na linDa onde o erro ocorre&.
!4U! !e)to da mensa"em de erro.
O1s.: 9ons&lte tam*(m ALLH4RRORS e DBAH4RRORS.
E$em(,o: cons&ltando os erros de sinta)e do procedimento 6#R4H4BP.
9ons&lte os erros de sinta)e para compilaes de procedimentos e $&nes interativamente
pelo SQL?Pl&s atrav(s do comando SMOL 4RRORS.
Sinta$e:
DBC Database Company 7
SQL> COLUMN pos FORMAT a4
SQL> COLUMN text FORMAT a60
SQL> SELECT line||'/'||position pos, text
2 FROM user_errors
3 WHERE name = 'CADASTRA_PESSOA'
4 ORDER BY line;
POS TEXT
----
------------------------------------------------------------
8/3 PLS-00103: Encountered the symbol "COMMIT" when expecting
on
e of the following:
;
The symbol ";" was substituted for "COMMIT" to continue.
Sol&es
DBC Database Company 8
SHOW ERROR[S] [{PROCEDURE|FUNCTION|PACKAGE}
nome]
Sol&es
=onsu,tando Erros 7 =ontinuao
E$em(,o2 cons&ltando os erros de sinta)e do procedimento 9ADAS!RAHP4SSOA.
9ons&lte os erros de sinta)e para compilaes de procedimentos e $&nes interativamente
atrav(s do Proced&re B&ilder. =a +anela de edio do *loco PL/SQL e$et&e &m cli;&e no *oto
SA.4 o& 9OBP#L4. 9aso a proced&re o& $&no poss&a erros de compilaoQ eles sero
mostrados imediatamenteQ in$ormando a linDaQ a posio e a mensa"em do erro ocorridoR o c&rsor
p%ra na linDa/col&na onde e)iste o erro.
E$em(,o2 9ons&lte os erros do procedimento #=S4R4H#=S!R>!OR.
DBC Database Company 8
SQL> SHOW ERRORS
Errors for PROCEDURE CADASTRA_PESSOA:
LINE/COL ERROR
--------
-----------------------------------------------------------------
8/3 PLS-00103: Encountered the symbol "COMMIT" when expecting one of
the following:
;
The symbol ";" was substituted for "COMMIT" to continue.
Sol&es
De(urando Su1(ro0ramas
O processo de dep&rao depende do am*iente no ;&al se est% tra*alDando. =o SQL?Pl&sQ ele
deve ser SimplementadoT atrav(s de comandos disponi*iliFados em &ma pacGa"e. =o Proced&re
B&ilderQ a +anela PL/SQL #nterpreter poss&i v%rios rec&rsos para o processo de dep&rao de &m
pro"rama.
De(urao no SQLBP,us
=o D% nenD&m tipo de rec&rso especE$ico para dep&rao no SQL?Pl&s. Para issoQ &tiliFa-se
&ma pacGa"e cDamada DBBSHO>!P>!Q disponi*iliFada pela Oracle e normalmente instalada
lo"o ap's a instalao do *anco de dados. Os procedimento dessa pacGa"e se destinam a mostrar
te)to na tela.
Distri*&a comandos da pacGa"e DBBSHO>!P>! no c'di"o do pro"rama ;&e dese+a dep&rar
para mostrar mensa"ens de aviso e conteCdos de vari%veis. Depois de dep&rado o c'di"oQ retire os
comandos e disponi*iliFe o pro"rama para o&tros &s&%rios.
Procedimento Descrio
4=ABL4 Ma*ilita e redimensiona o *&$$er de saEda.
P>! Adiciona &m te)to Nstrin"P para a linDa corrente do *&$$er de saEda.
=4LHL#=4 9oloca &m caracter de ;&e*ra de linDa no *&$$er de saEda.
P>!HL#=4 9om*ina as aes de P>! e =4LHL#=4.
D#SABL4 Desa*ilita o *&$$er de saEda.
Ma*ilite os procedimento da pacGa"e DBBSHO>!P>! pelo SQL?Pl&s &tiliFando o comando
S4! S4R.4RO>!P>! O=.
Sinta$e:
Preparando o te)to para a mensa"em de saEda do procedimento com a proced&re P>!.
Bostrando o te)to para a mensa"em de saEda do procedimento com a proced&re
%E&'LI%E.
9om*inando P>! e =4LHL#=4 &tiliFando o procedimento P>!HL#=4.
DBC Database Company :
SET serveroutput {on|off} DBMS_OUTPUT.PUT('mensagem de sada'); DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE('mensagem de sada');
Sol&es
De(urao no SQLBP,us 7 =ontinuao
E$em(,o: dep&rando &m procedimento pelo SQL?Pl&s.
DBC Database Company 1
CREATE OR REPLACE PROCEDURE FIRE_EMP
(p_empno in emp.empno%type) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(`Vou remover o registro...');
DELETE FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE(`Registro removido.');
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20200, 'Funcionrio no
existe');
END IF;
DBMS_OUTPUT.PUT_LINE(`Vou confirmar as alteraes...');
COMMIT;
DBMS_OUTPUT.PUT_LINE(`Alteraes confirmadas.');
END;
/
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE fire_emp(7788);
Vou remover o registro...
Registro removido.
Vou confirmar as alteraes...
Alteraes confirmadas.
PL/SQL procedure successufully completed.
Sol&es
De(urao no Procedure Bui,der
Dep&re procedimentos e $&nes interativamente &tiliFando o PL/SQL #nterpreterQ do
Proced&re B&ilder.
Ireas do Procedure Bui,der
So&rce Pane Npainel cinFaP2 mostra o c'di"o PL/SQL de &ma &nidade de pro"rama
NPro"ram >nitP.
#nterpreter Pane Npainel *rancoQ com promptP2 %rea &tiliFada para entrar comandos SQL e
PL/SQL.
O*+ect =avi"ator Pane Nnormalmente no mostradoP2 c'pia do O*+ect =avi"ator. Bostra
os o*+etos do Proced&re B&ilder Dierar;&icamente e a pilDa de cDamada N$&nesQ
procedimentos e vari%veis locaisP. Pode ser &tiliFado para alterar o valor de vari%veis
dinamicamente en;&anto vocA dep&ra a Pro"ram >nit.
Passo 1
=o O*+ect =avi"ator selecione a Pro"ram >nit ;&e vocA dese+a dep&rar. O c'di"o PL/SQL da
Pro"ram >nit selecionada deve aparecer no So&rce Pane do PL/SQL #nterpreter.
DBC Database Company 11
Sol&es
De(urao no Procedure Bui,der 7 =ontinuao
Passo 2
4ntre com as aes de De*&"Q de$inindo os *reaGpoints Ne$et&e &m d&plo cli;&e na linDa
dese+adaP.

Passo 3
=a linDa de comando do PL/SQL #nterpreterQ e)ec&te o procedimento a ser dep&rado. A cada
*reaGpoint atin"ido o PL/SQL #nterpreter ( invocado de modo ;&e vocA possa monitorar e intera"ir
com a Pro"ram >nitQ e)ec&tando-a linDa a linDa.
DBC Database Company 1,
Sol&es
De(urao no Procedure Bui,der 7 =ontinuao
Passo "
>tiliFe os *otes da tool*ar do PL/SQL #nterpreter para e)ec&tar o procedimento
controladamente e a entrada StacG no O*+ect =avi"ator para cons&ltar e alterar o valor de vari%veis
locais do procedimento.
DBC Database Company 10
Sol&es
=om(onentes do Procedure Bui,der
=om(onentes Descrio
So&rce Pane 9'di"o $onteQ somente para leit&raQ da &nidade de pro"rama corrente.
=este painel vocA pode selecionar linDas de c'di"o e setar *reaGpoints.
O*+ect =avi"ator
Pane
Lista Dier%r;&ica dos o*+etos.
#nterpreter Pane LinDa de comando onde vocA entra com comandos SQL Q PL/SQL e
comandos do de*&""er.
Step #nto NB&ttonP 4)ec&ta o comando S!4P #=!O.
O comando S!4P #=!O avana a e)ec&o para o pr')imo
s&*pro"rama cDamado por esta linDa o& e)ec&ta a linDa corrente e
avana para a pr')ima.
Step Over NB&ttonP 4)ec&ta o comando S!4P O.4R.
O comando S!4P O.4R salta a cDamada de &m s&*pro"ramaQ
avanando para a pr')ima linDa.
Step O&t NB&ttonP 4)ec&ta o comando S!4P O>!.
O comando S!4P O>! salta para o t(rmino do s&*pro"rama corrente.
/o NB&ttonP 4)ec&ta o comando /O.
O comando /O se"&e a e)ec&o inde$inidamente.
Reset NB&ttonP 4)ec&ta o comando R4S4!.
O comando R4S4! termina o s&*pro"rama corrente imediatamente.
9lose NB&ttonP 6ecDa o #nterpreter/De*&""er.
=avi"ator 9ontrols 9reateQ DeleteQ 4)pandQ 9ollapseQ 4)pand AllQ 9ollapse AllQ 6ind.
9ontrola aes do O*+ect =avi"ator.
=omandos do PL/SQL Inter(reter
Os se"&intes comandos podem ser in$ormados na linDa de comando do PL/SQL #nterpreter
N#ntepreter PaneP.
Os comandos marcados com N?P so e;&ivalentes aos *otes da tool*ar do PL/SQL
#nterpreter.
=omando Descrio
.S!4P #=!O N?P Avana a e)ec&o para o pr')imo s&*pro"rama cDamado
por esta linDa o& e)ec&ta a linDa corrente e avana para a
pr')ima.
.S!4P O.4R N?P Salta a cDamada de &m s&*pro"ramaQ avanando para a
pr')ima linDa.
.S!4P O>! N?P Salta para o t(rmino do s&*pro"rama corrente.
./O N?P Se"&e a e)ec&o inde$inidamente.
.R4S4! N?P !ermina o s&*pro"rama corrente imediatamente.
.SMOL LO9ALS Bostra todas as vari%veis locais Nvari%veis PL/SQL
declaradas localmenteP e par@metros.
DBC Database Company 13
Sol&es
Desa1i,itando Brea/(oints
=o so&rce paneQ desa*ilite &m brea+points criados com &m d&plo cli;&e no se& nCmero.
=onsu,tando e <,terando o 8a,or de 8ari:+eis Locais durante a De(urao
=o O*+ect =avi"atorQ selecione e a*ra a entrada stacG para vis&aliFar o valor das vari%veis
locais da proced&re. Para alterar o valor de &ma vari%vel localQ e$et&e dois cli;&es so*re o se& valor
correnteR o valor deve $icar aF&l permitindo ;&e vocA entre com &m novo valorQ tecle enter o&
e$et&e &m cli;&e com o mo&se.
DBC Database Company 15
Sol&es
=ontro,ando a Se0urana
O*tenDa os privil("ios necess%rios para e)ec&tar aes relacionadas a proced&res e $&nes
de *anco de dados.
O(erao Pri+i,A0ios @ecess:rios Outros Pri+i,A0ios
9R4A!4 9R4A!4 PRO94D>R4
o&
9R4A!4 A=\ PRO94D>R4
Acesso a todos os o*+etos
re$erenciados pela proced&re.
9R4A!4 OR
R4PLA94
Propriedade da proced&re
o&
9R4A!4 PRO94D>R4
o&
9R4A!4 A=\ PRO94D>R4
Acesso a todos os o*+etos
re$erenciados pela proced&re.
DROP Propriedade da proced&re
o&
DROP A=\ PRO94D>R4
=enD&m o&tro privil("io
4U49>!4 Propriedade da proced&re
o&
4U49>!4
o&
4U49>!4 A=\ PRO94D>R4
=enD&m o&tro privil("io
Prote+a os dados dos o*+etos de serem re$erenciados diretamente pelo &s&%rio provendo
somente acesso aos dados dos o*+etos atrav(s de proced&res.
>ma proced&re ( e)ec&tada so*re o domEnio de se"&rana de se& dono NoVnerP.
Para rec&perar dados atrav(s de &ma proced&reQ o &s&%rio deve poss&ir o privil("io de
e)ec&tar a proced&re e no necessariamente poss&ir os privil("ios de acesso direto aos o*+etos
re$erenciados por ela.
E$em(,o: provendo acesso indireto aos dados.
S&ponDa ;&e o &s&%rio RM ( o dono da ta*ela SH4BP. O &s&%rio LOR[1 dese+a
desenvolver &ma proced&re cDamada M#R4H4BP para cadastrar novos $&ncion%rios e dese+a ;&e o
&s&%rio S9O!! possa cadastrar novos $&ncion%rios somente atrav(s desta proced&re.
1. >s&%rio RM provA o privil("io de #=S4R! na ta*ela SH4BP para o &s&%rio LOR[1 de
modo ;&e ele possa criar e compilar a proced&re M#R4H4BP.
,. >s&%rio LOR[1 provA o privil("io de 4U49>!4 na proced&re M#R4H4BP para o
&s&%rio S9O!! de modo ;&e ele possa e)ec&tar esta proced&re.
DBC Database Company 17
GRANT INSERT ON emp TO work1; GRANT EXECUTE ON hire_emp TO scott;
Sol&es
E$ercFcios %
1. Liste o nome e o stat&s de todas os procedimentos e $&nes ;&e vocA poss&i.
,. Liste o c'di"o $onte completo da $&no 9O=S>L!AHPR49O &tiliFando o comando
S4L49!.
0. Altere a $&no 9O=S>L!AHPR49O de modo a deli*eradamente provocar &m erroQ por
e)emplo retire o ponto-e-vEr"&la do comando S4L49!. !ente recompilar a $&no.
3. Liste os erros de compilao da $&no 9O=S>L!AHPR49O &tiliFando o comando
S4L49!Q o comando SMOL 4RRORS e o Proced&re B&ilder.
5. 9orri+a a $&no 9O=S>L!AHPR49O e recompile-a.
7. 4)ec&te e dep&re o procedimento 9O=S>L!AHPR49O pelo Proced&re B&ilder. Dep&re-
o tam*(m pelo SQL?Pl&sQ adicionando cDamadas K pacGa"e DBBSHO>!P>! no procedimento.
O*s.2 para ativar a saEda da pacGa"e DBBSHO>!P>! no SQL?Pl&sQ lem*re-se de e)ec&tar o
comando S4! S4R.4RO>!P>! O= antes de e)ec&tar a $&no.
DBC Database Company 18
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
(.
(.
$erenciando De)end*ncias em
$erenciando De)end*ncias em

Procedimentos e Funes
Procedimentos e Funes
DBC Database Company
Sol&es
O14eti+os
Re"istrar e trilDar dependAncias em procedimentos.
Prever o e$eito de m&danas em o*+etos do *anco de dados so*re procedimentos e $&nes.
/erenciar dependAncias em procedimentos em &m *anco de dados local.
/erenciar dependAncias em procedimentos em &m *anco de dados remoto Ndistri*&EdoP.
DBC Database Company ,
Sol&es
&erenciando De(end)ncias
Da mesma $orma ;&e &ma viso depende da ta*ela o& ta*elas so*re as ;&ais ela $oi criadaQ
diF-se ;&e &m procedimento depende de &m o*+eto do *anco ao ;&al ele $aF re$erAncia dentro do
se& c'di"o. Por e)emplo2 &m procedimento cDamado !4S!AH9ABPO $aF &ma cons&lta na ta*ela
D4P!. W dito ;&e o procedimento !4S!AH9ABPO depende da ta*ela D4P!Q poisQ se esta ta*ela
$or alterada o& removidaQ o procedimento pode dei)ar de $&ncionar.
Sempre ;&e &m o*+eto do *anco de dados $or alteradoQ todos os o*+etos do mesmo *anco ;&e
dependem dele so invalidados. #sso pode ser veri$icado atrav(s do campo S#<#-S da ta*ela
>S4RHOB<49!SQ ;&e poss&i valores J8<LIDK e JI@8<LIDK.
Lo"icamenteQ o processo de invalidar o*+etos dependentes ocorre em cascata. >m
procedimento ;&e re$erencie o*+etos ;&e $icaram com stat&s I@8<LIDQ $ica por s&a veF com stat&s
I@8<LID tam*(m.
E$em(,o:
1. >ma de$inio de ta*ela ( alterada N&ma col&na nova ( adicionada o& o tamanDo de &ma
col&na ( alteradoQ por e)emploP.
,. >ma viso ;&e re$erencia a ta*ela alterada $ica com o stat&s #=.AL#D.
0. >m procedimento ;&e re$erencia a viso ;&e $ico& com stat&s #=.AL#D $ica com stat&s
#=.AL#D em cascata.
E$em(,o:
1. >ma de$inio de ta*ela ( alterada N&ma col&na nova ( adicionada o& o tamanDo de &ma
col&na ( alteradoQ por e)emploP.
,. >m procedimento ;&e re$erencia a ta*ela alterada $ica com o stat&s #=.AL#D.
0. >m procedimento ;&e re$erencia o procedimento ;&e $ico& com stat&s #=.AL#D $ica com
stat&s #=.AL#D em cascata.
DBC Database Company 0
Sol&es
#i(os de De(end)ncias
DependAncias so classi$icadas como Diretas o& #ndiretas e como Locais o& Remotas.
De(end)ncias Diretas
>m procedimento o& $&no depende diretamente de &m o*+eto ;&ando o re$erencia
diretamente dentro do se& *loco PL/SQL.
O14eto De(endente O14eto Diretamente Ee;erenciado
Procedimento o& 6&no !a*ela
Procedimento o& 6&no .iso
Procedimento o& 6&no Se;&ence
Procedimento o& 6&no Procedimento o& 6&no
.iso !a*ela
O1s.: >m sin1nimo no ( considerado &m o*+eto dependenteQ por;&e ele ( simplesmente &m
o&tro nome para o o*+eto. Se &m procedimento re$erencia &m sin1nimoQ ela depende diretamente
do o*+eto apontado pelo sin1nimo.
De(end)ncias Indiretas
>m procedimento o& $&no depende indiretamente de &m o*+eto se ele re$erencia &m o*+eto
intermedi%rio ;&e re$erencia o&tros o*+etos ca&sando &ma cadeia de dependAncias.
E$em(,os:
O14eto De(endente O14eto Intermedi:rio O14eto Indiretamente
Ee;erenciado
Procedimento
o& 6&no
.iso !a*ela
Procedimento
o& 6&no
.iso .iso
Procedimento
o& 6&no
Procedimento
O& 6&no
!a*ela
Procedimento
o& 6&no
Procedimento
O& 6&no
.iso
Procedimento
o& 6&no
Procedimento
O& 6&no
Se;&ence
DBC Database Company 3
Sol&es
#i(os de De(end)ncias 7 =ontinuao
De(end)ncia Loca,
DependAncia Local ( &ma dependAncia de o*+etos ;&e esto no mesmo Banco de dados.
4)emplo2
1. >ma de$inio de !a*ela ( alterada N&ma col&na nova ( adicionadaQ o& o tamanDo de &ma
col&na ( alteradoP.
,. >ma .ieV ;&e re$erencia a ta*ela $ica com o stat&s #=.AL#D.
0. >ma procedimento ;&e re$erencia a viso ;&e $ico& com stat&s #=.AL#DQ $ica com stat&s
#=.AL#D em cascata.
3. >m procedimento ;&e re$erencia o procedimento ;&e $ico& com stat&s #=.AL#DQ $ica
com stat&s #=.AL#D em cascata.
O*s.2 todos os o*+etos esto no mesmo *anco de dados
De(end)ncia Eemota
DependAncia Remota ( &ma dependAncia de o*+etos ;&e esto em *anco de dados di$erentes.
4)emplo2
1. >ma De$inio de !a*ela ( alterada N&ma col&na nova ( adicionada o& o tamanDo de &ma
col&na ( alteradoP.
,. >ma viso ;&e re$erencia a ta*ela $ica com o stat&s #=.AL#D.
0. >m procedimento ;&e re$erencia a viso ;&e $ico& com stat&s #=.AL#DQ $ica com stat&s
#=.AL#D em cascata.
3. >m procedimento ;&e est% em o&tro *anco de dados re$erencia o procedimento ;&e $ico&
com stat&s #=.AL#D. #sto caracteriFa &ma dependAncia remota ;&e poss&i &m tratamento di$erente
;&e ser% visto mais adiante.
DBC Database Company 5
Sol&es
#ratamento de De(end)ncias Locais Diretas
Recompile man&almente todos os o*+etos ;&e poss&em dependAncia direta o& indireta do
o*+eto alterado.
=onsu,tando a +iso -SEEGDEPE@DE@=IES
A viso >S4RHD4P4=D4=9#4S mostra os o*+etos ;&e poss&em dependAncia direta de &m
determinado o*+eto.
.iso >S4RHD4P4=D4=9#4S
=o,una Descrio
=AB4 =ome do o*+eto dependente
!\P4 !ipo de o*+eto NPRO94D>R4Q 6>=9!#O=Q
PA9[A/4 o& PA9[A/4 BOD\P.
R464R4=94DHOL=4R ScDema N=ome do &s&%rio donoP do o*+eto
re$erenciado.
R464R4=94DH=AB4 =ome do o*+eto re$erenciado
R464R4=94DH!\P4 !ipo do o*+eto re$erenciado.
O1s.: cons&lte tam*(m ALLHD4P4=D4=9#4S e DBAHD4P4=D4=9#4S.
E$em(,o: cons&ltando dependAncias diretas.
DBC Database Company 7
SQL> COLUMN referenced_name FORMAT a15
SQL> COLUMN referenced_type FORMAT a15
SQL> COLUMN name FORMAT a23
SQL>
SQL> SELECT name, type, referenced_name, referenced_type
2 FROM user_dependencies
3 WHERE referenced_name IN ('EMP');
NAME TYPE REFERENCED_NAME REFERENCED_TYPE
----------------------- ------------ --------------- ---------------
AUMENTA_SALARIO PROCEDURE EMP TABLE
CONSULTA_SALARIO FUNCTION EMP TABLE
DEMITE_EMPREGADO PROCEDURE EMP TABLE
HIRE_EMP PROCEDURE EMP TABLE
INSERE_NIVEL_SALARIAL PROCEDURE EMP TABLE
5 rows selected.
Sol&es
#ratamento de De(end)ncias Locais Indiretas
Recompile man&almente todos os o*+etos ;&e poss&em dependAncia direta o& indireta do
o*+eto alterado.
=onsu,tando as ta1e,as DEP#EEE e IDEP#EEE
9rie as vises D4P!R44 e #D4P!R44 e)ec&tando o script &tldtree.s;l $ornecido +&ntamente
com o *anco de dados Oracle.
PreencDa os dados das vises D4P!R44 e #D4P!R44 com a cadeia de dependAncia para &m
determinado o*+etos e)ec&tando a proced&re D4P!R44H6#LL.
Sinta$e:
Onde2
ParCmetro Descrio
!ipoHo*+eto !ipo do o*+eto para ;&al vocA dese+a analisar a cadeia
de dependAncia.
>s&%rioHdonoHo*+eto ScDema do o*+eto a ser analisado.
=omeHo*+eto =ome do o*+eto a ser analisado.
=onsu,tando a +iso DEP#EEE
.is&aliFe &ma representao ta*&lar da cadeia de dependAncia direta e indireta de o*+etos
para &m determinado o*+eto cons&ltando a viso D4P!R44.
.iso D4P!R44
=o,una Descrio
=4S!4DHL4.4L /ra& de dependAncia.
!\P4 !ipo de dependAncia do o*+eto.
OL=4R ScDema N&s&%rio dono do o*+eto dependenteP.
=AB4 =ome do o*+eto dependente.
S4Qf =Cmero para classi$icao das linDas de saEda.
DBC Database Company 8
DEPTREE_FILL ('tipo_objeto',
'usurio_dono_objeto',
'nome_objeto');
Sol&es
#ratamento de De(end)ncias Locais Indiretas 7 =ontinuao
=onsu,tando a +iso IDEP#EEE
.is&aliFe &ma representao Dier%r;&ica da cadeia de dependAncia direta e indireta de o*+etos
para &m determinado o*+eto cons&ltando a viso #D4P!R44
.iso #D4P!R44
=o,una Descrio
D4P4=D4=9#4S DependAncias
E$em(,os:
9ons&ltando a viso D4P!R44
DBC Database Company 8
SQL> EXECUTE deptree_fill(`TABLE', `WORK1', `EMP');
PL/SQL procedure successuflly completed.
SQL> SELECT nested_level, type, name
2 FROM deptree
3 ORDER BY seq#;
NESTED_LEVEL TYPE NAME
------------ ------------
------------------------------
0 TABLE EMP
1 PROCEDURE AUMENTA_SALARIO
1 PROCEDURE DEMITE_EMPREGADO
2 FUNCTION VERIFICA_EMPREGADO
1 FUNCTION CONSULTA_SALARIO
1 PROCEDURE INSERE_NIVEL_SALARIAL
1 PROCEDURE HIRE_EMP
1 FUNCTION VERIFICA_EMPREGADO
8 rows selected.
Sol&es
9ons&ltando a viso #D4P!R44
DBC Database Company :
SQL> SELECT *
2 FROM ideptree;
DEPENDENCIES
-----------------------------------------
TABLE WORK1.EMP
PROCEDURE WORK1.AUMENTA_SALARIO
PROCEDURE WORK1.DEMITE_EMPREGADO
FUNCTION WORK1.VERIFICA_EMPREGADO
FUNCTION WORK1.CONSULTA_SALARIO
PROCEDURE WORK1.INSERE_NIVEL_SALARIAL
PROCEDURE WORK1.HIRE_EMP
FUNCTION WORK1.VERIFICA_EMPREGADO
8 rows selected.
Sol&es
Eecom(i,ando Procedures e un!es
Ap's analisar a cadeia de dependAncias recompile e)plicitamente todos os o*+etos
dependentes do o*+eto alterado.
=om(i,ando uma Procedure
Sinta$e:
=om(i,ando uma uno
Sinta$e:
O1s.: para compilar &ma proced&re o& &ma $&no ( necess%rio ser o dono o& ter o
privil("io AL!4R A=\ PRO94D>R4.
Al"&mas alteraes em o*+etos re$erenciados podero $aFer com ;&e a tentativa de
compilao da proced&re o& da $&no tenDa s&cesso o& $alDe..e+a e)emplos na ta*ela a*ai)o.
O14eto
Ee;erenciado
<,terao =om(i,ao da Procedure ou uno
!a*ela A ta*ela ( removida 6alDa
!a*ela A ta*ela ( renomeada 6alDa
9ol&na >ma col&na ( adicionada. 6alDa se a re$erAncia no $or &tiliFando _ROL!\P4R
o& se o comando insert no &tiliFar &ma lista e)plEcita
de col&nas.
Ou: S&cesso se a re$erAncia $or _ROL!\P4.
O*s.2 se a col&na adicionada no permite n&los
ocorrer% erro de e)ec&oR depende totalmente da
$orma de &so das col&nas.
9ol&na >ma col&na ( alterada. 6alDa se a re$erAncia no $or &tiliFando _ROL!\P4
o& _!\P4
Ou: S&cesso se a re$erAncia $or _ROL!\P4 o&
_!\P4.
O*s.2 depende totalmente da $orma de &so das col&nas.
.iso A viso re$erenciada (
s&*stit&Eda por &ma viso
com col&nas di$erentes.
6alDa se a re$erencia no $or &tiliFando _ROL!\P4
o& _!\P4
Ou: S&cesso se a re$erencia $or _ROL!\P4 o&
_!\P4.
O*s.2depende totalmente da $orma de &so das col&nas.
.iso A viso re$erenciada (
s&*stit&ida por &ma viso
com as mesmas col&nas.
S&cesso.
O*s.2 depende totalmente da $orma de &so das col&nas.
Se;&ence >ma se;&ence ( removida 6alDa.
Proced&re >ma lista de ar"&mentos de
&ma proced&re ( modi$icada.
6alDa.
Proced&re Bloco PL/SQL ( modi$icado. S&cesso.
E$em(,os:
DBC Database Company 1
ALTER PROCEDURE nome_procedure COMPILE; ALTER FUNCTION nome_funo COMPILE;
Sol&es
S&ponDa ;&e d&as proced&res NQ>4R\H4BP e ADDH4BPP dependam da ta*ela SH4BPR
Q>4R\H4BP depende diretamente da ta*ela SH4BP e ADDH4BP depende
indiretamente pela vieV =4LH4BP. .eri$i;&e o e$eito das se"&intes m&danas em
relao ao s&cesso da compilao das d&as proced&res.
O14eto
Ee;erenciado
<,terao =om(i,ao das (rocedures
<DDGE3P e Q-EELGE3P
!a*ela A ta*ela ( SH4BP ( removida. 6alDa.
!a*ela A ta*ela SH4BP ( renomeada. 6alDa.
9ol&na >ma col&na ( adicionada a ta*ela
SH4BP.
6alDa se a re$erencia no $or
&tiliFando _ROL!\P4Q o& se o
comando insert no &tiliFar &ma lista
e)plicita de col&nas
O&
S&cesso se a re$erencia $or
_ROL!\P4.
O*s.2 se a col&na adicionada no
permite n&los ocorrer% erro de
e)ec&oQ isto (Q depende totalmente
da $orma de &so das col&nas.
.iso A viso =4LH4BP ( removida. Somente a compilao de ADDH4BP
$alDa.
S&ponDa ;&e d&as proced&res NRA#S4HSAL e R4D>94HSALP dependam da ta*ela
SH4BPR RA#S4HSAL at&aliFa diretamente a ta*ela SH4BP e R4D>94HSAL at&aliFa a
ta*ela SH4BP via a proced&re RA#S4HSAL. .eri$i;&e o e$eito das se"&intes m&danas
em relao ao s&cesso da compilao das d&as proced&res.
O14eto
Ee;erenciado
<,terao =om(i,ao das Procedure
E<ISEGS<L e EED-=EGS<L
Proced&re A l'"ica interna da proced&re
RA#S4HSAL ( modi$icada No
corpo do *loco PL/SQLP
S&cesso.
Proced&re >m dos par@metros de
RA#S4HSAL ( eliminado.
6alDa.
DBC Database Company 11
Sol&es
=riando O14etos no 3esmo Sc6ema da Procedure
A criao de &m o*+eto em &m scDema onde $oi criada &ma proced&re o& $&noQ pode $aFer
com ;&e tal proced&re o& $&no $i;&e com stat&s #=.AL#D. #sso ocorre caso e)ista &m sin1nimo
pC*lico com o mesmo nome do o*+eto criadoQ e a proced&re re$erencie esse sin1nimo. O pro*lema
se deve ao $ato de ;&e a proced&re o& $&no passa a re$erenciar o o*+eto criado no se& scDemaQ ao
inv(s da;&ele associado ao sin1nimo pC*licoQ devido a Dierar;&ia de re$erAncias do Oracle.
E$em(,o:
S&ponDa ;&e a proced&re Q>4R\H4BP re$erencie &m sin1nimo pC*lico cDamado SH4BP
para a ta*ela SH4BP no scDema RM. Se vocA criar &ma ta*ela cDamada SH4BP no mesmo scDema
onde $oi criada a proced&re Q>4R\H4BPQ a proced&re $icar% com status I@8<LIDQ visto ;&e ela
passa a re$erenciar a nova ta*ela.
8eri;icando o Status de Procedures e un!es
9ons&lte o stat&s de proced&res o& $&nes pela col&na S!A!>S da viso >S4RHOB<49!S.
E$em(,o:
DBC Database Company 1,
SQL> COLUMN object_name FORMAT a25
SQL> SELECT object_name, object_type, status
2 FROM user_objects
3 WHERE object_type IN ('PROCEDURE',
'FUNCTION');
OBJECT_NAME OBJECT_TYPE STATUS
------------------------- ------------- -------
AUMENTA_SALARIO PROCEDURE VALID
CONSULTA_SALARIO FUNCTION VALID
DEMITE_EMPREGADO PROCEDURE VALID
DEPTREE_FILL PROCEDURE VALID
FIRE_EMP PROCEDURE INVALID
HIRE_EMP PROCEDURE VALID
INSERE_NIVEL_SALARIAL PROCEDURE VALID
7 rows selected.
Sol&es
8eri;icando Pri+i,A0ios (ara e$ecuo de Procedures e
un!es
Os privil("ios so cDecados em momento de e)ec&o da proced&re o& $&no para
a&toriFao de e)ec&oR no entantoQ a remoo NRevoGeP de &m privil("io necess%rio para a
e)ec&o da proced&re no altera se& S!A!>S para #=.AL#DQ mas ela no poder% ser a&toriFada
para e)ec&o.
E$em(,o:
O14eto
Ee;erenciado
<,terao <utori.ao de
e$ecuo
!a*ela >m privil("io relevante para a
e)ec&o da proced&re ( revo"ado
NrevoGedP.
6alDa.
!a*ela >m privil("io irrelevante para a
e)ec&o da proced&re ( revo"ado
NrevoGedP.
S&cesso.
E$em(,o:
S&ponDa ;&e d&as proced&res NQ>4R\H4BP e ADDH4BPP criadas no scDema LOR[1
dependam da ta*ela SH4BP no scDema RMR Q>4R\H4BP depende diretamente da ta*ela SH4BP
e ADDH4BP depende indiretamente pela vieV =4LH4BP no scDema RM. Analise as re-
a&toriFaes de e)ec&o das d&as proced&res nas sit&aes a*ai)o2
O14eto
Ee;erenciado
<,terao <utori.ao de e$ecuo
!a*ela Os privil("ios de S4L49! e
#=S4R! na ta*ela SH4BP do
scDema RM so revo"ados
para o &s&%rio LOR[1.
Q>4R\H4BP $alDa.
ADDH4BP s&cesso.
!a*ela Os privil("ios de S4L49! e
#=S4R! na vieV =4LH4BP
do scDema RM so revo"ados
para o &s&%rio LOR[1.
Q>4R\H4BP S&cesso
ADDH4BP $alDa.
DBC Database Company 10
Sol&es
Eecom(i,ando Procedures e un!es Im(,icitamente
O Oracle recompila o*+etos com stat&s i"&al a I@8<LID a&tomaticamente ;&ando eles so
invocadosQ antes de serem e)ec&tados.
3ecanismo de Eecom(i,ao <utom:tica (ara De(end)ncias Locais
1. O Oracle trilDa no dicion%rio de dados as dependAncias entre todos os o*+etos relacionados
direta o& indiretamente.
,. O Oracle re"istra no dicion%rio de dados o S!A!>S de cada o*+eto .AL#D o& #=.AL#D.
O stat&s #=.AL#D indica ;&e o o*+eto necessita ser recompilado antes de ser e)ec&tado.
0. Se a e)istAncia de &ma especi$icao de o*+eto ( alterada o Oracle marca todos os o*+etos
dependentes como #=.AL#D.
3. Q&ando &ma proced&re o& $&no com stat&s #=.AL#D ( invocada em momento de
e)ec&oQ o Oracle tenta recompil%-la antes de e)ec&t%-la. Se a proced&re compila com s&cesso o
Oracle altera se& S!A!>S para .AL#DQ caso contr%rio o stat&s permanece #=.AL#D e o Oracle
emite &m erro de e)ec&o.
5. Dentro da cadeia de dependAnciasQ o Oracle valida os o*+etos rec&rsivamente.
O1s.: ( $ortemente recomendado recompilar os o*+etos dependentes man&almente para evitar
a possi*idade de erros de e)ec&o por prov%veis $alDas de compilao.
DBC Database Company 13
Sol&es
#ratamento E$(,Fcito de De(end)ncias Eemotas
Q&ando &m o*+eto de *anco de dados ( dependente de &m o*+eto em &m *anco de dados
di$erenteQ o Oracle no pode tratar as dependAncias remotas pelo dicion%rio de dados local.
9om&ni;&e ao dono da proced&re o& $&no remota dependente do o*+eto alterado para ;&e
ela se+a recompilada e)plicitamente.
O mecanismo de tratamento de dependAncias remotas ( di$erente do mecanismo de
tratamento de dependAncias locais.
O1s.: W $ortemente recomendado recompilar os o*+etos remotos dependentes man&almente
para evitar a possi*ilidade de erros de e)ec&o por prov%veis $alDas de compilao.
DBC Database Company 15
Sol&es
3ecanismo de #ratamento autom:tico de de(end)ncias
Eemotas
S&ponDa ;&e a proced&re A de$inida no *anco de dados A depende remotamente da
proced&re B de$inida no *anco de dados B.
1. Q&ando a proced&re B NremotaP ( compiladaQ o Oracle re"istra no P-code da proced&re B a
data e a Dora da compilao NtimestampP.
E$em(,o2 a proced&re B ( compilada as 82 Doras.
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B compilada as 82
Stat&s .AL#D
,. Q&ando a proced&re A NlocalP ( compiladaQ o Oracle re"istra no P-code da proced&re A a
data e a Dora da compilao NtimestampP da proced&re A e da proced&re B NremotaP.
E$em(,o2 a proced&re A ( compilada as :2 Doras
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B compilada Ks 82
Proced&re A compilada Ks :2
Stat&s .AL#D
Proced&re B compilada Ks 82
Stat&s .AL#D
0. Q&ando a proced&re A NlocalP ( invocada para e)ec&oQ o Oracle compara a data e a Dora
da compilao da proced&re B NtimestampP re"istradas no P-code da proced&re A e no P-code da
proced&re B. Se $orem i"&ais si"ni$ica ;&e a proced&re B no $oi compilada ap's a Cltima
compilao da proced&re A.
E$em(,o2 a proced&re A ( invocada as 112 Doras
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B 9ompilada as 82
Proced&re A 9ompilada as :2
Stat&s .AL#D
Proced&re B 9ompilada as 82
Stat&s .AL#D
9omo a proced&re B no $oi recompilada ap's a Cltima compilao da proced&re A N:2
DorasPQ a proced&re A ( e)ec&tada normalmente.
DBC Database Company 17
Sol&es
3ecanismo de #ratamento autom:tico de de(end)ncias Eemotas 7 =ontinuao
3. SeQ ;&ando a proced&re A NlocalP ( invocada para e)ec&oQ o Oracle compara a data e a
Dora da compilao da proced&re B NtimestampP re"istradas no P-code de am*as proced&resQ as
datas o& Doras no $orem i"&aisQ si"ni$ica ;&e a proced&re B $oi compilada ap's a Cltima
compilao da A. O Oracle ento coloca o stat&s #=.AL#D na proced&re A e retorna &m erro de
e)ec&o NORA-37,P para a e)ec&o da A .
E$em(,o2 a proced&re A ( invocada as 112 Doras
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B 9ompilada as 82
Proced&re A 9ompilada as :2
Stat&s #=.AL#D
Proced&re B 9ompilada as 12
Stat&s .AL#D
9omo a proced&re B $oi recompilada N12 DorasP ap's a Cltima compilao da proced&re A
N:2 DorasPQ o Oracle ento coloca o stat&s #=.AL#D na proced&re A e retorna o erro de e)ec&o
ORA-37, para a A .
5. A proced&re A NlocalP ( invocada para e)ec&o novamenteQ por(m ela est% com stat&s
#=.AL#DQ ento o Oracle recompila a proced&re antes de tentar e)ec&t%-laQ at&aliFando a data e a
Dora da Cltima compilao da proced&re B e da proced&re A no P-code da proced&re A . Se a
compilao termina com s&cesso o Oracle prosse"&e a e)ec&o da proced&re AQ comparando a
data e a Dora da compilao da proced&re B NtimestampP re"istrada no P-code de am*as as
proced&res. As datas/Doras devem a"ora estar i"&aisQ si"ni$icando ;&e a proced&re B no $oi
compilada ap's a Cltima compilao da A. O Oracle ento e)ec&ta a proced&re A .
E$em(,o2 a proced&re A ( invocada novamente as 1121 Doras e no ocorre erros de
compilao.
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B 9ompilada as 12
Proced&re A 9ompilada as 1121
Stat&s .AL#D
Proced&re B 9ompilada as 12
Stat&s .AL#D
9omo a proced&re A ( recompilada com s&cesso N1121 DorasP ap's a Cltima compilao da
proced&re B N12 DorasPQ o Oracle ento coloca o stat&s .AL#D na proced&re A e a e)ec&ta.
7. Q&ando a proced&re A NlocalP $or invocada para e)ec&o novamenteQ o Oracle ir%
recompil%-la antes de tentar e)ec&t%-laQ pois ela est% com stat&s #=.AL#D. Por(m se a compilao
$alDaQ o stat&s da proced&re A permanece #=.AL#D e o Oracle retorna &m erro de e)ec&o NORA-
37,P para a e)ec&o da proced&re A.
E$em(,o2 a proced&re A ( invocada novamente as 1121 Doras e ocorre erros de compilao.
Procedure <
Banco de Dados <
Procedure B
Banco de Dados B
Proced&re B 9ompilada as 12
Proced&re A 9ompilada as 1121
Stat&s #=.AL#D
Proced&re B 9ompilada as 12
Stat&s .AL#D
9omo a proced&re A no ( recompilada com s&cesso ela permanece com stat&s #=.AL#D e o
Oracle retorna o erro de e)ec&o ORA-37, para a e)ec&o da proced&re A.
DBC Database Company 18
Sol&es
E$ercFcios '
1. Liste o nome e o stat&s de todas os se&s procedimentos e $&nes.
,. Liste o nome e o tipo de todos os o*+etos com dependAncias diretas da ta*ela P4SSOAS.
0. Liste todas as dependAncias diretas e indiretas da ta*ela P4SSOAS.
4)ec&te o script g&tldtree.s;lg para criar as ta*elas D4P!R44 e #D4P!R44 e o procedimento
D4P!R44H6#LL para o se& &s&%rio.
3. #nvalide o procedimento 9ADAS!RAHP4SSOAQ adicionando &ma col&na cDamada
9OB4=!AR#OQ do tipo .AR9MAR,N1PQ na ta*ela P4SSOAS.
5. 9ons&lte novamente o nome e o stat&s dos procedimentos e $&nes.
7. !ente e)ec&tar o procedimento 9ADAS!AHP4SSOA. O ;&e acontecee
8. 9ons&lte novamente o nome e o stat&s dos procedimentos e $&nes.
DBC Database Company 18
SQL> start utldtree.sql
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
+.
+.
Desen,o-,endo e .ti-i/ando
Desen,o-,endo e .ti-i/ando

Pac0a1es
Pac0a1es
DBC Database Company
Sol&es
O14eti+os
9riar PacGa"es PL/SQL de *anco de dados para a"r&par vari%veisQ c&rsoresQ constantesQ
e)ceesQ proced&res e $&nes.
9riar constr&es pC*licas e privadas em &ma pacGa"e
#nvocar &ma constr&o componente de &ma pacGa"e.
/erenciar pacGa"esQ c'di"o $onte e erros de compilao.
/erenciar dependAncias ;&e envolvem pacGa"es.
4ntender as vanta"ens de &ma pacGa"e.
DBC Database Company ,
Sol&es
Desen+o,+endo Pac/a0es 7 8iso &era,
Desenvolva PacGa"es de *anco de dados para a"r&par o*+etos PL/SQL Nidenti$icadores e
rotinasP.
=onstru!es em Pac/a0es
=onstru!es Descrio
.ari%vel #denti$icador ;&e pode ter valores alterados.
9&rsor #denti$icador associado a &m comando S4L49!.
9onstante #denti$icador com &m valor $i)o.
4)ceo #denti$icador para &ma condio anormal.
Proced&re S&*rotina com ar"&mentos Npar@metrosP.
6&no S&*rotina com ar"&mentos Npar@metrosP ;&e retorna
o*ri"atoriamente &m valor.
9rie &ma PacGa"e em d&as partes2 PacGa"e speci$ication e PacGa"e BodI.
=onstru!es PD1,icas em Pac/a0es
9onstr&es pC*licas em &ma pacGa"e so a;&elas ;&e podem ser invocadas por proced&res
o& $&nes e)ternas a pacGa"e.
Devem ser declaradas na PacGa"e speci$ication e de$inidas no PacGa"e BodI.
=onstru!es Pri+adas em Pac/a0es
9onstr&es privadas em &ma pacGa"e so a;&elas ;&e s' podem ser invocadas por
proced&res o& $&nes da pr'pria pacGa"e.
Devem ser declaradas e de$inidas no PacGa"e BodI.
DBC Database Company 0
Sol&es
=riando Pac/a0es de Banco de Dados
9rie &ma nova pacGa"e escrevendo o te)to para o c'di"o da PacGa"e speci$ication e o te)to
para o c'di"o da PacGa"e BodI. >tiliFe o SQL?Pl&s o& o Proced&re B&ilder.
Passos (ara a criao de uma Pac/a0e
1. 4screva o comando 9R4A!4 PA9[A/4Q de$inindo a PacGa"e speci$ication.
,. 4)ec&te o comando 9R4A!4 PA9[A/4 para criar a PacGa"e speci$ication.
0. 4screva o comando 9R4A!4 PA9[A/4 BOD\Q de$inindo o PacGa"e BodI.
3. 4)ec&te o comando 9R4A!4 PA9[A/4 BOD\ para criar o PacGa"e BodI.
5. #nvo;&e ;&al;&er constr&o pC*lica Ndeclarada na PacGa"e speci$icationP a partir de &m
am*iente Oracle.
=riando a Pac/a0e s(eci;ication no SQLBP,us
9rie &ma PacGa"e speci$ication &tiliFando o comando 9R4A!4 PacGa"e.
E$em(,o:
DBC Database Company 3
CREATE [OR REPLACE] PACKAGE nome_package
IS|AS
Declarao de varivel
Declarao de cursor
Declarao de procedure
Declarao de funo
END[ nome_package];
CREATE OR REPLACE PACKAGE package_comissao
IS
g_comm emp.comm%TYPE;
FUNCTION valida_comissao(p_comm IN emp.comm%TYPE)
RETURN BOOLEAN;
PROCEDURE inicializa_comissao(p_comm IN emp.comm
%TYPE);
END;
Sol&es
=riando a Pac/a0e s(eci;ication no Procedure Bui,der
1. #nvo;&e o Proced&re B&ilder e conecte-se no *anco de dados.
,. =o O*+ect =avi"atorQ selecione a entrada Pro"ram >nitsR cli;&e no Econe 9reateR o
di%lo"o =eV Pro"ram >nit deve aparecerR selecione o tipo de Pro"ram >nit a ser criado NPacGa"e
speci$icationP.
0. Ap'sQ con$orme a se"&nda telaQ edite os comandos PL/SQL ;&e compe a criao da
pacGa"e. =o ( necess%rio iniciar com o comando 9R4A!4 OR R4PLA94 nem &ma *arra N/P no
$inal.. Ap's a di"itao e$et&e &m cli;&e no *oto 9OBP#L4 para compilar a Pro"ram >nitR caso
Da+am errosQ eles sero mostrados indicando a linDa e col&na onde e)iste o erro.
DBC Database Company 5
Sol&es
=riando a Pac/a0e s(eci;ication no Procedure Bui,der7 =ontinuao
5. 9aso Da+a errosQ corri+a e compile novamenteR ap's compilarQ cli;&e em OG. 4$et&e &m
cli;&e no *oto 9lose para sair.
7. Para salvar a PacGa"e speci$ication no *anco de dadosQ e)panda a entrada Data*ase
O*+ectsR e)panda a entrada para &s&%rio ;&e ser% o dono da PacGa"e speci$icationR cli;&e so*re a
Pro"ram >nit ;&e vocA crio&R a"arre e arraste-a com o mo&se pressionadoR solte o mo&se so*re a
entrada Stored Pro"ram >nit do &s&%rio ;&e ser% o dono da PacGa"e speci$ication.
DBC Database Company 7
Sol&es
=riando o Pac/a0e BodM
=riando o Pckage BodM (e,o SQLBP,us
9rie o PacGa"e BodI &tiliFando o comando 9R4A!4 PA9[A/4 BOD\.
O1s.: a ordem em ;&e a constr&o ( de$inida dentro do PacGa"e BodI $aF di$erenaQ de$ina
&ma constr&o antes de re$erenci%-la em o&tra constr&o.
DBC Database Company 8
CREATE [OR REPLACE] PACKAGE BODY nome_package
IS|AS
Declarao de varivel
Declarao de cursor
Declarao de exceo
Declarao e definio de procedure
Declarao e definio de funo
END[ nome_package];
CREATE OR REPLACE PACKAGE BODY package_comissao
IS
FUNCTION valida_comissao (p_comm IN emp.comm%TYPE)
RETURN BOOLEAN
IS
v_max_comm emp.comm%TYPE;
BEGIN
SELECT MAX(NVL(comm, 0))
INTO v_max_comm
FROM emp;
IF p_comm > v_max_comm THEN
RETURN(FALSE);
ELSE
RETURN(TRUE);
END IF;
END valida_comissao;
PROCEDURE inicializa_comissao (p_comm IN emp.comm%TYPE)
IS
BEGIN
IF valida_comissao(v_comm_rate) THEN
g_comm := p_comm;
ELSE
RAISE_APPLICATION_ERROR(-20210, 'Percentual invlido');
END IF;
END inicializa_comissao;
END package_comissao;
Sol&es
=riando o Pac/a0e BodM (e,o Procedure Bui,der
1. =o O*+ect =avi"atorQ selecione a entrada Pro"ram >nitsQ cli;&e no Econe 9reateQ o di%lo"o
=eV Pro"ram >nit deve aparecerQ selecione o tipo de Pro"ram >nit a ser criado NPacGa"e BodIP.
DBC Database Company 8
Sol&es
=riando o Pac/a0e BodM (e,o Procedure Bui,der 7 =ontinuao
3. 4dite os comandos PL/SQL ;&e compe a criao da PacGa"eQ no ( necess%rio preceder
com o comando 9R4A!4 OR R4PLA94. Ap's a di"itao e$et&e &m cli;&e no *oto 9OBP#L4
para compilar a Pro"ram >nitR caso Da+am errosQ eles sero mostrados indicando a linDa e col&na
onde e)iste o erro.
DBC Database Company :
Sol&es
=riando o Pac/a0e BodM 7 =ontinuao
5. 9aso Do&ver errosQ corri+a e compile novamenteQ ap's compilar OGQ e$et&e &m cli;&e no
*oto 9lose para sair.
7. Para salvar o PacGa"e BodI no *anco de dadosQ e)panda a entrada Data*ase O*+ectsQ
e)panda a entrada para &s&%rio ;&e ser% o dono da PacGa"e BodIQ cli;&e so*re a Pro"ram >nit ;&e
vocA crio&Q a"arre e arraste-a com o mo&se pressionadoQ solte o mo&se so*re a entrada Stored
Pro"ram >nit do &s&%rio ;&e ser% o dono do PacGa"e BodI.
DBC Database Company 1
Sol&es
De;inindo uma Procedure de Nnica E$ecuo
De$ina &ma proced&re privada para ser e)ec&tada &ma Cnica veF dentro da sessoQ somente
na primeira veF ;&e &ma constr&o da pacGa"e $or invocada.
E$em(,o: inicialiFe o percent&al de comisso Ncom o res&ltado da m(dia de percent&ais de
comisso entre os empre"adosP na primeira veF em ;&e a pacGa"e $or cDamada na sesso.
DBC Database Company 11
CREATE OR REPLACE PACKAGE BODY package_comissao
IS
FUNCTION valida_comissao (p_comm IN emp.comm%TYPE)
RETURN BOOLEAN
IS
v_max_comm emp.comm%TYPE;
BEGIN
SELECT MAX(NVL(comm, 0))
INTO v_max_comm
FROM emp;
IF p_comm > v_max_comm THEN
RETURN(FALSE);
ELSE
RETURN(TRUE);
END IF;
END valida_comissao;
PROCEDURE inicializa_comissao (p_comm IN emp.comm%TYPE)
IS
BEGIN
IF valida_comissao(v_comm_rate) THEN
g_comm := p_comm;
ELSE
RAISE_APPLICATION_ERROR(-20210, 'Percentual invlido');
END IF;
END inicializa_comissao;
BEGIN
SELECT AVG(NVL(comm, 0))
INTO g_comm
FROM emp;
END package_comissao;
/
Sol&es
Eemo+endo a Pac/a0e s(eci;ication
Remova a PacGa"e speci$ication e o respectivo PacGa"e BodI com o comando DROP
PA9[A/4.
Sinta$e:
Eemo+endo o Pac/a0e BodM
Remova o PacGa"e BodI com o comando DROP PA9[A/4 BOD\.
Sinta$e:
DBC Database Company 1,
DROP PACKAGE nome_package; DROP PACKAGE BODY nome_package;
Sol&es
In+ocando =onstru!es de Pac/a0es
#nvo;&e &ma constr&o de &ma pacGa"e a partir de &ma constr&o da pacGa"e o& e)terna K
ela.
Somente as constr&es pC*licas de &ma pacGa"e podem ser invocadas por constr&es
e)ternas a pacGa"e.
In+ocando =onstru!es de Pac/a0es a (artir de =onstru!es da Pac/a0e
#nvo;&e &ma constr&o de &ma pacGa"e a partir de &ma constr&o da pr'pria pacGa"e
simplesmente invocando se& nome Nproced&re o& $&noP o& identi$icador Nvari%veisQ c&rsoresQ
constantes o& e)ceesPQ sem pre$i)os.
E$em(,o:

DBC Database Company 10
CREATE OR REPLACE PACKAGE BODY package_comissao
IS
FUNCTION valida_comissao (p_comm IN emp.comm%TYPE)
RETURN BOOLEAN
IS
...
END valida_comissao;
PROCEDURE inicializa_comissao (p_comm IN emp.comm%TYPE)
IS
BEGIN
IF valida_comissao(v_comm_rate) THEN -- Funo da
package.
g_comm := p_comm; -- Varivel da
ELSE -- package.
RAISE_APPLICATION_ERROR(-20210, 'Percentual invlido');
END IF;
END inicializa_comissao;
...
END package_comissao;
/
Sol&es
In+ocando =onstru!es de Pac/a0es a (artir de =onstru!es e$ternas O Pac/a0e
#nvo;&e &ma constr&o de &ma PacGa"e a partir de &ma constr&o e)terna K pacGa"e
invocando a constr&o pre$i)ando o nome da proced&re o& $&no com o nome da pacGa"e para
;&al ela pertence.
E$em(,o 1: invocando a proced&re #=#9#AL#hAH9OB#SSAO da pacGa"e PA9[A/4H
9OB#SSAO a partir do SQL?Pl&s.
E$em(,o 2: invocando a proced&re #=#9#AL#hAH9OB#SSAO da pacGa"e PA9[A/4H
9OB#SSAO do scDema do &s&%rio S9O!! a partir do SQL?Pl&s.
E$em(,o 3: invocando a proced&re R4S4!H9OBBHRA!4 da pacGa"e 9OBBH
PA9[A/4 do scDema do &s&%rio S9O!! no *anco de dados S4R.4R, a partir do SQL?Pl&s.
DBC Database Company 13
SQL> EXECUTE
package_comissao.inicializa_comissao(0.15);
PL/SQL procedure successfully completed.
SQL> EXECUTE
scott.package_comissao.inicializa_comissao(0.15);
SQL> EXECUTE
package_comissao.inicializa_comissao@SERVER2(0.15);
Sol&es
In+ocando =onstru!es de Pac/a0es a (artir de =onstru!es e$ternas O Pac/a0e 7
=ontinuao
Para re$erenciar vari%veisQ c&rsoresQ constantes o& e)cees de &ma pacGa"e a partir de &ma
constr&o e)terna K pacGa"e ( necess%rio pre$i)ar com o nome da pacGa"e.
E$em(,o: re$erenciando a vari%vel 0Gcomm da pacGa"e de &ma constr&o e)terna K
pacGa"e.
DBC Database Company 15
CREATE OR REPLACE PROCEDURE hire_emp
(p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_sal IN emp.sal%TYPE)
IS
v_hiredate emp.hiredate%TYPE;
v_comm emp.comm%TYPE;
v_deptno emp.deptno%TYPE;
BEGIN
v_hiredate := SYSDATE;
IF p_job = 'SALESMAN' THEN
v_comm := 5;
ELSE
v_comm := package_comissao.g_comm;
END IF;
SELECT deptno
INTO v_deptno
FROM emp
WHERE empno = p_mgr;
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm,
deptno)
VALUES
(EMP_EMPNO_SEQ.NEXTVAL, p_ename, p_job, p_mgr,
v_hiredate, p_sal, v_comm, v_deptno);
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20201, 'Cdigo de
gerente invlido');
END;
/
Sol&es
&erenciando Pac/a0es
/erencie o desenvolvimento de pacGa"es com os mesmos comandos e estrat("ias &tiliFados
para proced&res e $&nes normais.
#i(o de
In;ormao
Descrio 3Atodo de acesso
9'di"o 6onte 9'di"o $onte da PacGa"e 9ons&ltar a vieV
>S4RHSO>R94.
P-code 9'di"o o*+eto compilado =o acessEvel.
4rros de
9ompilao
4rros de sinta)e 9ons&ltar a vieV
>S4RH4RRORS.
#n$ormaes de
De*&"
#n$ormaes so*re o conteCdo de
vari%veis.
>tiliFar as proced&res da
pacGa"e DBBSHO>!P>! o&
a PL/SQL #nterpreter do
Proced&re B&ilder.
9ontrole de
se"&rana
Privil("ios necess%rios para
e)ec&tar a pacGa"e.
O*ter o privil("io de
4U49>!4 para a pacGa"e.
DBC Database Company 17
Sol&es
&erenciando De(end)ncias em Pac/a0es
De(end)ncias em re;er)ncias a constru!es de uma (ac/a0e
Simpli$i;&e o "erenciamento de dependAncias &tiliFando pacGa"esQ ;&ando re$erenciar &ma
proced&re de &ma pacGa"e a partir de &ma rotina e)terna K pacGa"e.
Se o PacGa"e BodI da pacGa"e re$erenciada ( alteradoQ e a PacGa"e speci$ication no (
alteradaQ a proced&re o& a $&no ;&e re$erencia a pacGa"e no ( invalidada.
Se o PacGa"e speci$ication da pacGa"e re$erenciada ( alteradaQ ento a proced&re o& a $&no
;&e re$erencia a pacGa"e ( invalidadaQ assim como o PacGa"e BodI da pacGa"e alterada.
De(end)ncias em re;er)ncias de uma Pac/a0e a Procedures e un!es normais
Se &ma proced&re o& $&no re$erenciada por &ma pacGa"e $or alteradaQ o PacGa"e BodI (
invalidadoQ por(m a PacGa"e speci$ication no (.
Assim como em proced&res e em $&nes ( recomendado recompilar e)plicitamente as
pacGa"es inv%lidas devido a alterao de o*+etos ;&e ela depende direta o& indiretamenteQ local o&
remotamente.
Os mecanismos de "erenciamento de dependAncias locais e remotas $&ncionam para as
pacGa"es e)atamente como para proced&res e $&nes normais.
Eecom(i,ando Pac/a0es
9ompilando PacGa"e speci$ication e PacGa"e BodI.
Sinta$e:
9ompilando PacGa"e speci$ication somente.
Sinta$e:
9ompilando PacGa"e BodI somente
Sinta$e:
O1s: =o ( necess%rio recompilar a PacGa"e speci$ication ;&ando recompilando o PacGa"e
BodI e vice versa.
DBC Database Company 18
ALTER PACKAGE nome_package COMPILE; ALTER PACKAGE nome_package COMPILE
SPECIFICATION;
ALTER PACKAGE nome_package COMPILE BODY;
Sol&es
Bene;Fcios do uso de Pac/a0es
Bod&lariFao do desenvolvimento da Aplicao.
Or"aniFao de proced&res e $&nes de *anco de dadosQ a"r&pando proced&res e $&nes
relacionadas.
/erenciamento de proced&res e $&nes.
/erenciamento de Se"&rana.
Possi*ilita a criao de identi$icadores "lo*ais ;&e podem ser re$erenciados d&rante a
sesso.
%erformanceR toda a pacGa"e ( colocada na mem'ria na primeira cDamadaQ red&Findo
acesso a discoQ visto ;&e provavelmente os demais elementos da pacGa"e devero ser
re$erenciados.
DBC Database Company 18
Sol&es
E$ercFcios *
1. 9rie &ma pacGa"e cDamada 4BPR4/ADO. 4ssa pacGa"e deve poss&ir2
>ma $&no pC*lica cDamada 9O=S>L!AH=#.4LHSALAR#ALQ ;&e rece*e como par@metro
o nCmero do empre"ado Ncol&na 4BP=O da ta*ela 4BPP e retorna em ;&e nEvel salarial ele
est% classi$icado Ncol&na /RAD4 da ta*ela SAL/RAD4P.
>m procedimento pC*lico cDamado A!>AL#hAHSALAR#OQ ;&e rece*e como par@metro o
nCmero do empre"ado Ncol&na 4BP=O da ta*ela 4BPP e o novo sal%rio ;&e esse empre"ado
ter%Q e at&aliFa o campo SAL da ta*ela 4BP com esse valor. Antes da at&aliFaoQ por(mQ deve
ser veri$icado se o novo sal%rio est% dentro de al"&m nEvel salarial cadastrado em SAL/RAD4.
Declare &ma vari%vel "lo*al /H4BP=O para armaFenar &m valor default para os par@metros
PH4BP=O da procedure A!>AL#hAHSALAR#O e da $&no
9O=S>L!AH=#.4LHSALAR#AL da pacGa"e.
>m *loco PL/SQL a ser e)ec&tado &ma Cnica veFQ ;&e inicialiFa o valor da vari%vel
/H4BP=O com o maior c'di"o de empre"ado da ta*ela 4BP.
0. Altere somente o PacGa"e BodI da pacGa"e 4BPR4/ADO. Bostre o stat&s da PacGa"e
Speci$ication e da PacGa"e BodI ap's a alterao da pacGa"e. O ;&e vocA noto&e
DBC Database Company 1:
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
2.
2.
Desen,o-,endo e .ti-i/ando
Desen,o-,endo e .ti-i/ando

Data3ase !ri11ers
Data3ase !ri11ers
DBC Database Company
Sol&es
O14eti+os
Distin"bir Data*ase !ri""ers de proced&res de *anco de dados
9riar Data*ase !ri""ers ao nEvel de comando.
9riar Data*ase !ri""ers ao nEvel de linDa.
/erenciar Data*ase !ri""ersQ c'di"o $onte e erros de compilao.
DBC Database Company ,
Sol&es
Data1ase #ri00ers 7 8iso &era,
Desenvolva &ma Data*ase !ri""er para e)ec&tar &m *loco PL/SQL implicitamente ;&ando
&m comando de manip&lao de dados NDBLP $or e)ec&tado para &ma determinada ta*ela.
!ri""ers NliteralmenteQ "atilDosP no so disparadas e)plicitamenteQ como procedimentos o&
$&nesQ atrav(s de cDamadasQ mas sim ;&ando ocorrer &m evento para o ;&al elas $oram
pro"ramadas para responder.
>ma !ri""er de *anco Ndata*ase tri""erP $ica sempre associada K &ma ta*ela o& viso.
!ri""ers podem $&ncionar como &m nEvel mais elevado de validao para ta*elasQ implementando
$&ncionalidades comple)as demais para constraints.
4m Oracle8iQ tri""ers tam*(m podem estar associadas a eventos de *anco de dadosQ como
sD&tdoVn o& start&pQ e a eventos de &s&%riosQ como comandos DDLQ cone)o o& descone)o de
&s&%riosQ e essas tri""ers podem ser de$inidas em nEvel de *anco de dados o& em nEvel de &s&%rioQ
ao inv(s de $icarem em nEvel de &m o*+eto do *anco Nta*ela o& visoP. A;&i trataremos das tri""ers
associadas K ta*elas e visesQ visto ;&e so de maior import@ncia para desenvolvedores.
E,ementos de uma Data1ase #ri00er
E,emento Descrio
!empo Q&ando a !ri""er ( disparada em relao ao evento ;&e
disparo& a !ri""er.
.alores PossEveis2
B,-$R, Nantes do eventoP
.-/,R Ndepois o eventoP
0NS/,.D $- Ns&*stit&i o eventoP2 apenas so*re vises
4vento Q&e comandoNsP de manip&lao de dados na ta*ela
ca&saNmP o disparo da !ri""er.
.alores PossEveis2
0NS,R/
U%D./, 1$- coluna2
D,&,/,
!ipo Q&antas veFes o corpo da tri""er ser% e)ec&tado.
.alores PossEveis3
Statement NnEvel de comando O de$a&ltP
-$R ,.C4 R$5 NnEvel de linDaP
9orpo Q&e ao o& aes a tri""er e)ec&ta.
Bloco de comandos %&'S(&
DBC Database Company 0
Sol&es
#ri00ers em nF+e, de Lin6a e em nF+e, de =omando
#ri00er em nF+e, de =omando #ri00er em nF+e, de Lin6a
4)ec&ta o corpo da !ri""er &ma
Cnica veFQ sempre ;&e &m
determinado comando de
manip&lao de dados $or emitido
para &ma determinada ta*ela.
4)ec&ta o corpo da !ri""er &ma veF para cada
linDa a$etada pelo comando de manip&lao
;&e ca&so& o disparo da tri""er.
E$em(,os: os se"&intes comandos manip&lam &ma Cnica linDaQ lo"o o tipo de tri""er ser%
indi$erente nestes casos.
Q&ando &m comando de manip&lao de dados pode a$etar mCltiplas linDasQ &ma tri""er ao
nEvel de comando ( disparada &ma Cnica veFQ mesmo ;&e nenD&ma linDa se+a a$etada.
Q&ando &m comando de manip&lao de dados pode a$etar mCltiplas linDasQ &ma tri""er ao
nEvel de ,in6a ( disparada &ma veF para cada linDa realmente a$etada pelo comando. Se o comando
no a$etar nenD&ma linDaQ a tri""er no ser% disparada.
E$em(,os: os se"&intes comandos manip&lam mCltiplas linDasQ lo"o o tipo de tri""er ser%
importante nestes casos.
=riando uma #ri00er ao nF+e, de =omando
9rie &ma Data*ase !ri""er &tiliFando o comando 9R4A!4 !R#//4R.
Sinta$e:
#em(os
B46OR4
DBC Database Company 3
INSERT INTO DEPT
VALUES (50, 'LAVANDERIA', NULL);
UPDATE dept
SET loc = `RIO DE JANEIRO'
WHERE deptno = 50;
DELETE FROM DEPT
WHERE deptno = 50;
INSERT INTO EMP
SELECT *
FROM EMP_BACKUP;
UPDATE emp
SET sal = sal * 1.1
WHERE deptno = 30;
DELETE FROM EMP
WHERE deptno = 30;
CREATE [OR REPLACE] TRIGGER nome_trigger
{BEFORE|AFTER|INSTEAD OF}
evento_trigger1
[OR evento_trigger2
[OR evento_trigger3]]
ON nome_tabela
[DECLARE
Declarao de variveis]
BEGIN
Bloco PL/SQL
END;
Sol&es
9rie &ma !ri""er B46OR4 em nEvel de comando paraQ por e)emploQ prevenir a e)ec&o da
operao N#=S4R!Q >PDA!4 e/o& D4L4!4P em certas condies ;&e so comple)as demais para
serem testadas atrav(s de constraints.
E$em(,o2 crie &ma Data*ase !ri""er ao nEvel de comando e permita a insero na ta*ela
4BP somente em certos Dor%rios.
A6!4R
9rie &ma !ri""er A6!4R em nEvel de comando paraQ por e)emploQ a&ditar a operao ;&e
disparo& a tri""er o& e)ec&tar &m c%lc&lo depois da operao completadaQ derivando valores.
E$em(,o: crie &ma Data*ase !ri""er ao nEvel de comando ;&e liste os &s&%rios e conte s&as
operaes de manip&laes de dados. Depois ;&e ;&al;&er &s&%rio at&aliFe a col&na SAL na ta*ela
4BPQ tenDa certeFa ;&e o nCmero de alteraes na col&na SAL no e)ceda o m%)imo permitido ao
&s&%rio.
DBC Database Company 5
CREATE OR REPLACE TRIGGER valida_horario
BEFORE INSERT
ON emp
BEGIN
IF TO_CHAR(SYSDATE, `DAY') IN (`SATURDAY', `SUNDAY') OR
TO_NUMBER(SYSDATE, `HH24') NOT BETWEEN 8 AND 18 THEN
RAISE_APPLICATION_ERROR(`O cadastramento de funcionrios
permitido apenas dentro do horrio comercial');
END IF;
END;
/
CREATE OR REPLACE TRIGGER verifica_numero_alteracoes_salario
AFTER UPDATE OF sal
ON emp
DECLARE
v_nro_alteracoes tabela_auditoria.alteracoes%TYPE;
v_max_alteracoes tabela_auditoria.max_alteracoes%TYPE;
BEGIN
SELECT alteracoes, max_alteracoes
INTO v_nro_alteracoes, v_max_alteracoes
FROM tabela_auditoria
WHERE usuario = USER
AND tabela = `EMP'
AND coluna = `SAL';
IF v_alteracoes >= v_max_alteracoes THEN
RAISE_APPLICATION_ERROR(`Voc realizou todas as mudanas de
salrios que eram permitidas(`||
TO_CHAR(v_alteracoes)||')');
END IF;
END;
Sol&es
=riando uma tri00er com1inando +:rios e+entos
9rie &ma tri""er com*inando o tratamento de v%rios eventos2 e)ec&te &m tratamento
especE$ico para cada evento da tri""er testando as palavras #=S4R!#=/Q >PDA!#=/ e
D4L4!#=/ para identi$icar ;&al evento disparo& a tri""er e desviar para o tratamento especE$ico.
E$em(,o2 crie &ma data*ase tri""er ao nEvel de comando ;&e permita a inseroQ at&aliFao
e deleo na ta*ela SH4BP somente em certos Dor%rios di$erenciando as mensa"ens para cada tipo
de erro e com*inando o tratamento em &ma Cnica tri""er.
DBC Database Company 7
CREATE OR REPLACE TRIGGER verifica_horario
BEFORE INSERT OR UPDATE OR DELETE
ON emp
BEGIN
IF TO_CHAR(SYSDATE, `DAY') IN (`SATURDAY', `SUNDAY') OR
TO_NUMBER(SYSDATE, `HH24') NOT BETWEEN 8 AND 18 THEN
IF INSERTING THEN
RAISE_APPLICATION_ERROR(`O cadastramento de funcionrios

permitido apenas dentro do horrio comercial');


ELSIF DELETING THEN
RAISE_APPLICATION_ERROR(`A remoo de funcionrios
permitida apenas dentro do horrio comercial');
ELSIF UPDATING(`SAL') THEN
RAISE_APPLICATION_ERROR(`Alteraoes de salrios so
permitidas apenas dentro do horrio comercial');
ELSE
RAISE_APPLICATION_ERROR(`Alteraoes de cadastros so
permitidas apenas dentro do horrio comercial');
END IF;
END;
/
Sol&es
#ri00ers em nF+e, de Lin6a
9rie &ma Data*ase !ri""er ao nEvel de linDaQ &tiliFando o comando 9R4A!4 !R#//4R
incl&indo a cl%&s&la 6OR 4A9M ROL e a cl%&s&la LM4= NopcionalP.
Sinta$e:
DBC Database Company 8
CREATE [OR REPLACE] TRIGGER nome_trigger
{BEFORE|AFTER|INSTEAD OF}
evento_trigger1
[OR evento_trigger2
[OR evento_trigger3]]
ON nome_tabela
[REFERENCING [OLD AS novo_qualificador1]
[NEW AS novo_qualificador2]]
FOR EACH ROW
[WHEN condio_de_execuo]
[DECLARE
Declarao de variveis]
BEGIN
Bloco PL/SQL
END;
Sol&es
E$em(,o2 crie &ma tri""er ao nEvel de linDa para contar as operaes de manip&lao de
dados na ta*ela 4BP por di$erentes &s&%rios.
8a,ores OLD e @EP
Dentro de tri""ers ao nEvel de linDa ( possEvel re$erenciar os valores e)istentes antes da
manip&lao de dados atrav(s do ;&ali$icador OLDQ e os valores a serem aplicados pela
manip&lao de dados com o ;&ali$icador =4L. Os ;&ali$icadores OLD e =4L podem ainda ser
s&*stit&Edos por o&tros ;&ali$icadores atrav(s da cl%&s&la opcional R464R4=9#=/Q posicionada
entre o nome de ta*ela da tri""er e a cl%&s&la 6OR 4A9M ROL.
O(erao OLD +a,ue @EP +a,ue
#=S4R! =>LL .alor inserido
>PDA!4 .alor antes do >PDA!4 .alor at&aliFado
D4L4!4 .alor antes do D4L4!4 =>LL
DBC Database Company 8
CREATE OR REPLACE TRIGGER audita_emp
AFTER INSERT OR DELETE OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE tabela_auditoria
SET delecoes = delecoes + 1
WHERE usuario = USER
AND tabela = 'EMP'
AND coluna IS NULL;
ELSIF INSERTING THEN
UPDATE tabela_auditoria
SET insercoes = insercoes + 1
WHERE usuario = USER
AND tabela = 'EMP'
AND coluna IS NULL;
ELSIF UPDATING('SAL') THEN
UPDATE tabela_auditoria
SET atualizacoes = atualizacoes + 1
WHERE usuario = USER
AND tabela = 'EMP'
AND coluna = 'SAL';
ELSE
UPDATE tabela_auditoria
SET atualizacoes = atualizacoes + 1
WHERE usuario = USER
AND tabela = 'EMP'
AND coluna IS NULL;
END IF;
END;
/
Sol&es
O*s.2 >se os ;&ali$icadores OLD e =4L em tri""ers ao nEvel de linDa apenas.
=riando uma #ri00er ao nF+e, de Lin6a 7 =ontinuao
E$em(,o.: acessando valores OLD e =4L em &ma tri""er ao nEvel de linDa.
E$ecuo condiciona,: c,:usu,a PQE@
!ri""ers em nEvel de linDa podem e)ec&tar condicionalmenteQ o& se+aQ apenas para re"istros
a$etados pelo evento ;&e dispara a tri""er e ;&e atendem a &ma determinada condio. Determine
essa condio &tiliFando a cl%&s&la LM4=.
E$em(,o2 calc&lando o valor da comisso a&tomaticamente para $&ncion%rios representante
de vendas.
O1s.: dentro da cl%&s&la LM4= no pre$i)e os ;&ali$icadores OLD e =4L com dois-pontos.
DBC Database Company :
CREATE OR REPLACE TRIGGER audita_empregados
AFTER INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW
BEGIN
INSERT INTO auditoria_empregados
(usuario, data, old_empno, old_ename,
old_job, old_sal, new_empno, new_ename,
new_job, new_sal)
VALUES
(USER, SYSDATE, :old.empno, :old.ename,
:old.job, :old.sal, :new.empno, :new.ename,
:new.job, :new.sal);
END;
/
CREATE OR REPLACE TRIGGER calcula_comissao
BEFORE INSERT OR UPDATE OF sal
ON emp
FOR EACH ROW
WHEN (new.title = `SALESMAN')
BEGIN
IF :new.sal > 1000 THEN
:new.comm = :new.sal * 0.3;
ELSE
:new.comm = :new.sal * 0.5;
END IF;
END;
/
Sol&es
#ri00ers I@S#E<D O
Al(m dos tempos de e)ec&o B46OR4 e A6!4RQ &ma tri""er pode ser criada para o tempo
#=S!4AD O6. 9rie &m tri""er #=S!4AD O6 para s&*stit&ir o processamento padro de comandos
DBL so*re &ma viso.
.ises comple)asQ como por e)emploQ a;&elas criadas a partir de S4L49!s so*re v%rias
ta*elasQ no s&portam al"&ns o& todos comandos DBL. Para maiores detalDesQ ve+a o c&rso
#ntrod&o ao Oracle2 SQLQ SQL?Pl&s e PL/SQL.
Atrav(s de &m tri""er #=S!4AD O6Q ( possEvel realiFar &m processamento transparente a
cada comando DBL disparadoQ ;&e pode realiFar as modi$icaes dese+adas naNsP ta*elaNsP ;&e
compe a viso. O comando DBL ;&e dispara a tri""er no ( e)ec&tadoQ apenas as aes de$inidas
no *loco PL/SQL da tri""er. !ri""ers #=S!4AD O6 so implicitamente tri""ers em nEvel de linDaQ
e vocA pode cons&ltar os valores OLD e =4LQ na tri""erQ por(m no pode modi$icar nenD&m deles.
DBC Database Company 1
Sol&es
Eemo+endo uma Data1ase #ri00er
Remova &ma Data*ase !ri""er com o comando DROP !R#//4R.
Sinta$e:
DBC Database Company 11
DROP TRIGGER nome_trigger;
Sol&es
Ee0ras (ara uso de #ri00ers
Re"ra de Constrainning /ables2 no altere dados em col&nas de cDaves prim%riasQ cDaves
estran"eiras o& cDaves Cnicas de ta*elas relacionadas K;&ela na ;&al a tri""er disparada
est% associada.
So cDamadas constraining tables a;&elas ta*elas ;&e o evento da tri""er pode ter
necessidade de lerQ atrav(s de comandos SQL o& atrav(s de relaes de cDave estran"eira. 4ssas
ta*elas no devem so$rer alteraes a partir da e)ec&o do corpo da tri""er. >ma tentativa de $aFA-
lo ir% disparar &m erro Oracle.
4ssa restrio ( v%lida somente para tri""ers ao nEvel de linDasQ no para statement tri""ers.
4)emplo2 caso a tri""er a*ai)o se+a criada...
... e disparada por &m comando >PDA!4 comoQ...
... o se"&inte erro seria apresentado2
DBC Database Company 1,
CREATE OR REPLACE TRIGGER atualiza_dept
AFTER UPDATE OF deptno
ON dept
FOR EACH ROW
BEGIN
UPDATE emp
SET deptno = :new.deptno
WHERE deptno = :old.deptno;
END;
/
SQL> UPDATE dept
2 SET deptno = 90
3 WHERE deptno = 10;
SQL> UPDATE dept
2 SET deptno = 90
3 WHERE deptno = 10;
UPDATE dept
*
ERROR at line 1:
ORA-04091: table WORK1.DEPT is mutating, trigger/function may not see
it
ORA-06512: at "WORK1.ATUALIZA_DEPT", line 2
ORA-04088: error during execution of trigger 'WORK1.ATUALIZA_DEPT'
Sol&es
Ee0ras (ara uso de #ri00ers RcontinuaoS
Re"ra de !utating /ables2 =o leia in$ormaes de ta*elas ;&e este+am sendo
modi$icadas.
So cDamadas mutating tables a;&elas ta*elas ;&e esto so$rendo alteraes d&rante a
e)ec&o da tri""er. A ta*ela K ;&al a tri""er est% associada ( sempre &ma mutating tableQ assim
como ;&al;&er ta*ela li"ada K essa atrav(s de cDave estran"eira. 4ssas caracterEsticas impedem ;&e
&ma tri""er ao nEvel de linDa en)er"&e &m con+&nto de dados inconsistentes Nalterados mas no
con$irmadosP.
4ssa restrio tam*(m ( v%lida somente para tri""ers ao nEvel de linDasQ no para statement
tri""ers.
4)emplo2 criando-se a tri""er a*ai)o para veri$icar o valor do sal%rio antes de inserir o&
at&aliFar &m valor para ele...
...e disparando-a atrav(s de &m comando >PDA!4 comoQ ...
DBC Database Company 10
CREATE OR REPLACE TRIGGER verifica_salario
BEFORE INSERT OR UPDATE OF sal, job
ON emp
FOR EACH ROW
WHEN (new.job = `PRESIDENT')
DECLARE
v_min_sal emp.sal%TYPE;
v_max_sal emp.sal%TYPE;
BEGIN
SELECT MIN(sal), MAX(sal)
INTO v_min_sal, v_max_sal
FROM emp
WHERE job = `PRESIDENT';
IF :new.sal < v_min_sal OR
:new.sal > v_max_sal THEN
RAISE_APPLICATION_ERROR(-20505, `Salrio
invlido');
END IF;
END;
/
SQL> UPDATE emp
2 SET sal = 1500
3 WHERE ename = `SMITH';
Sol&es
...o*ten-se &m erro como2
DBC Database Company 13
SQL> UPDATE emp
2 SET sal = 1500
3 WHERE ename = `SMITH';
UPDATE emp
*
ERROR at line 1:
ORA-04091: table WORK1.EMP is mutating, trigger/function may not see
it
ORA-06512: at "WORK1.VERIFICA_SALARIO", line 2
ORA-04088: error during execution of trigger 'WORK1.VERIFICA_SALARIO'
Sol&es
&erenciando Data1ase #ri00ers
/erencie o desenvolvimento de data*ase tri""ers com as se"&intes in$ormaes2
#i(o de
In;ormao
Descrio 3Atodo de acesso
9'di"o 6onte 9'di"o $onte da tri""er 9ons&lta K vieV
>S4RH!R#//4RS.
P-code 9'di"o o*+eto compilado =o disponEvel.
4rros de
9ompilao
4rros de sinta)e 9ons&lta K vieV
>S4RH4RRORS.
#n$ormaes de
De*&"
#n$ormaes so*re o conteCdo de
vari%veis.
>tiliFando as proced&res da
pacGa"e DBBSHO>!P>!.
9ontrole de
se"&rana
Privil("ios necess%rios para criar
a tri""erQ para acessar os o*+etos
re$erenciados por ela e para
alterar a ta*ela associada a ela.
O*ter os privil("ios
necess%rios.
4)ec&o Privil("io para a manip&lao de
dados a ser realiFada.
O*ter os privil("ios
necess%rios.
DBC Database Company 15
Sol&es
Desa1i,itando Data1ase #ri00ers
Desa*ilite &ma !ri"er com o comando AL!4R !R#//4R.
Sinta$e:
Ma*ilite &ma !ri"er com o comando AL!4R !R#//4R.
Sinta$e:
Desa*ilite todas as tri""ers para &ma ta*ela especE$ica com o comando AL!4R !ABL4
Sinta$e:
Ma*ilite todas as tri""ers para &ma ta*ela especE$ica com o comando AL!4R !ABL4
Sinta$e:
DBC Database Company 17
ALTER TRIGGER nome_trigger DISABLE; ALTER TRIGGER nome_trigger ENABLE; ALTER TABLE nome_tabela DISABLE ALL TRIGGERS; ALTER TABLE nome_tabela ENABLE ALL TRIGGERS;
Sol&es
=onsu,tando o =Hdi0o onte de Data1ase #ri00ers
9ons&lte a vieV >S4RH!R#//4RS.
4)emplo2
DBC Database Company 18
SQL> DESC user_triggers
Name Null? Type
------------------------------- -------- ----
TRIGGER_NAME NOT NULL VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(26)
TABLE_OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
REFERENCING_NAMES VARCHAR2(87)
WHEN_CLAUSE
VARCHAR2(2000)
STATUS VARCHAR2(8)
DESCRIPTION
VARCHAR2(2000)
TRIGGER_BODY LONG
SQL> SELECT trigger_body
2 FROM user_triggers
3 WHERE trigger_name = `CALCULA_COMISSAO';
Sol&es
Pri+i,A0ios @ecess:rios (ara Desen+o,+er Data1ase #ri00ers
O(erao Pri+i,A0io @ecess:rio Outros Pri+i,A0ios
9R4A!4 9R4A!4 !R#//4R
O&
9R4A!4 A=\ !R#//4R
Acesso a todos os o*+etos
re$erenciados pela tri""er
4
A proprieade da ta*ela associada.
O&
Privil("io AL!4R na ta*ela associada
O&
Privil("io AL!4R A=\ !ABL4.
9R4A!4 OR
R4PLA94
Propriedade da !R#//4R
O&
9R4A!4 !R#//4R
O&
9R4A!4 A=\ !R#//4R
=enD&m o&tro privil("io.
DROP Propriedade da !R#//4R
O&
DROP A=\ !R#//4R
=enD&m o&tro privil("io.
DBC Database Company 18
Sol&es
E$ercFcios 8
1. 9rie &ma tri""er de *anco cDamada .AL#DAHD!H>L!HAL!4RA9AO para a ta*ela
#=S9R#9O4S ;&e compareQ antes de ;&al;&er insero de re"istros o& de alterao do campo
D!H>L!#BAHAL!4RA9AOQ a data da Cltima alterao in$ormada e a data de e$etivao da
inscrio Ncampo D!H464!#.AP. Se a da Cltima alterao $or anterior K data de e$etivaoQ
interrompa o processo com &ma mensa"em de erro.
,. 9rie &ma tri""er de *anco para a ta*ela #=S!R>!OR4S cDamada A>D#!AH9>S!OS
para a&ditar todas as m&danas nos valores-Dora dos instr&tores.
9rie &ma ta*ela de a&ditoria cDamada A>D#!OR#AH9>S!OSQ contendo a se"&inte estr&t&ra2
6aa com ;&e a tri""er insira &m re"istro na ta*ela A>D#!OR#AH9>S!OS para cada re"istro
da ta*ela #=S!R>!OR4S ;&e tiver o valor da Dora alteradoQ "&ardando em
.ALORHA=!4R#OR o valor da Dora antes da at&aliFaoQ e em .ALORHPOS!4R#OR o novo
valor de Dora in$ormado.
DBC Database Company 1:
CREATE TABLE auditoria_salario
(data DATE,
usuario VARCHAR2(30),
valor_anterior NUMBER(13,2),
valor_posterior NUMBER(13,2))
/
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
4.
4.
5ani)u-ando 637etos $randes
5ani)u-ando 637etos $randes
DBC Database Company
Sol&es
O14eti+o
9onDecer os tipos de dados LOB Nlar"e o*+ectsP.
9riar e manter o*+etos tipo LOB.
Di$erenciar o*+etos LOB internos e e)ternos.
9omparar o*+etos do tipo LO=/ com LOBs.
>tiliFar a pacGa"e DBBSHLOB para manip&lar o*+etos LOB.
DBC Database Company ,
Sol&es
#i(os de o14etos 0randes RLar0e O14ects T LOBS
4)istem em Oracle8i tipos de dados destinados a armaFenar in$ormaes ;&e consomem
"rande ;&antidade de espaoQ tais como ima"ensQ sonsQ $ilmes o& te)tos m&ito lon"os. 4sses tipos
so cDamados LOB NLar"e O*+etcsP. Os tipos LOB s&*stit&em os tipos LO=/ e LO=/ RALQ ;&e
passam a e)istir por raFes de compati*ilidade entre verses. 4)istem ;&atro tipos LOB em
Oracle8i2
BLOB2 o*+etos *in%riosQ tais como ima"ensQ vEdeoQ som e o&tros ar;&ivos.
9LOB2 o*+etos al$an&m(ricosQ te)to.
=9LOB2 o*+etos al$an&m(ticos m&lti*Ite de lar"&ra $i)a.
B6#L42 ar;&ivos *in%rios armaFenados e)ternamente ao *anco.
DBC Database Company 0
Sol&es
=aracterFsticas 0erais de cam(os LOB
9ol&nas tipo LOB armaFenam localiFadores. LocaliFadores so endereos ;&e apontam para
o local onde esto armaFenadas as in$ormaes atri*&Edas Ks col&nas LOB. Q&ando cons&ltada &ma
col&na tipo LOBQ o dado retornado ( o localiFador da in$ormaoQ e no a in$ormao propriamente
dita. A manip&lao dessas in$ormaes ( sempre dependente dos localiFadoresQ de $orma ;&e essa
manip&lao se torna mais comple)a ;&e a;&ela &sada em col&nas de o&tros tipos de dados Oracle.
Atrav(s de comandos SQL DBL pode-se $aFer &m tratamento limitado de col&nas LOB.
/rande parte do tratamento ( $eito atrav(s de lin"&a"ens de pro"ramaoQ como PL/SQLQ
&tiliFando *i*liotecas de c'di"o $ornecidas com o *anco Oracle. 4ssas *i*liotecas &sam esses
localiFadores de modo similar a ponteiros de sistema operacional.
=riando uma #a1e,a com cam(os LOB
9ol&nas LOB so de$inidas normalmente atrav(s de comandos DDLQ como o comando
9R4A!4 !ABL4 a*ai)o.
DBC Database Company 3
SQL> CREATE TABLE empregados
2 (codigo NUMBER(5),
3 nome VARCHAR2(35),
4 curriculo CLOB,
5 fotografia BLOB);
Sol&es
LOBs Internos
LOBs internos so armaFenados internamente ao *anco de dados. Os tipos 9LOBQ BLOB e
=9LOB so LOBs internos. Os dados "ravados em col&nas desse tipo $icam em ar;&ivos
"erenciados pelo Oracle e invisEveis para acesso a partir do sistema operacional.
LOBs internos podem tirar vanta"ens de rec&rsos OracleQ tais como2
Becanismos de concorrAncia.
Redo lo""in".
Becanismos de rec&perao.
O tipo de dado BLOB ( interpretado pelo Oracle Server como &ma se;bAncia de *ItesQ
similar ao LO=/ RAL. O tipo de dado 9LOB ( interpretado como &ma se;bAncia de caracteres
sin"le-*Ite. 4 o tipo de dado =9LOB ( interpretado como &ma se;bAncia de caracteres m&lti-*Ite
de lar"&ra $i)aQ *aseada no comprimento de *Ite do con+&nto de caracteres re"ionais &tiliFado no
*anco.
<rma.enamento In7Line e Out7o;7Line
4m cada re"istro de &ma ta*ela contendo &ma col&na tipo LOB internoQ pode estar
armaFenado nessa col&na &m n&lo o& &m localiFadorQ ;&e aponta para &m se"mento LOB. 4ste
se"mento ( "erenciado pelo servidor e ( onde $icam os valores LOB da ta*ela. 4ssa $orma de
armaFenamento ( cDamada out-of-lineQ pois os dados LOB $icam $ora do re"istro da ta*ela.
Por(mQ ;&ando &m dado LOB $or relativamente pe;&eno Nat( apro)imadamente 3 *ItesPQ
o pr'prio dado pode ser armaFenado +&nto com o re"istroQ ;&e ( a $orma de armaFenamento in-line.
Ainda assimQ o re"istro conter% &m localiFadorQ e ( ele ;&e ser% retornado em &ma cons&lta so*re
essa col&na. Se o dado vier a ser at&aliFado para &m tamanDo s&perior K 3 *ItesQ ele ( removido
do re"istro e armaFenado out-of-line.
DBC Database Company 5
Sol&es
LOBs E$ternos
LOBs e)ternos so armaFenados e)ternamente ao *anco de dados. O tipo B6#L4 ( &m LOB
e)terno. Os dados tipo B6#L4 $icam armaFenados em ar;&ivos independentes do *anco OracleQ e
visEveis a partir do sistema operacional. Os dados de &ma ima"emQ por e)emploQ podem $icar em
&m ar;&ivo de $ormato *itmap NBBPPQ P9UQ /#6 o& <P/. >m re"istro com &ma col&na B6#L4
pode conter &m ponteiro NlocaliFadorP para esse ar;&ivo.
Dados tipo B6#L4 cont(m in$ormaes apenas de leit&ra Nread-onlyP para o Oracle. 4stando
vinc&lados ao sistema operacionalQ o Oracle no tem permisso de alterar esses ar;&ivos. !ais
alteraes devem ser $eitas por aplicativos ;&e at&em so*re os ar;&ivos por o&tros meiosQ ;&e no o
servidor Oracle.
O tipo de dado B6#L4 ( $ornecido pelo Oracle Server para ;&e o &s&%rio do *anco de dados
possa ter acesso ao file system do sistema operacional. Atrav(s da lin"&a"em SQL o Oracle8i
permite2
De$inio de o*+etos B6#L4.
Associao de o*+etos B6#L4 com ar;&ivos e)ternos correspondentes.
Se"&rana de acesso para B6#L4s.
O localiFador de &m B6#L4 poss&i &m alias de diret'rioQ o nome do ar;&ivo e al"&mas
in$ormaes de estado.
O <,ias de DiretHrio
4)iste em Oracle &m tipo de o*+eto de *anco de dados denominado D#R49!OR\Q ;&e
especi$ica &m apelido NaliasP para &m diret'rio no file system do servidor. Acessos se"&ros podem
ser disponi*iliFados a ar;&ivos nos diret'rios correspondentes atrav(s de privil("ios $ornecidos de
&m &s&%rio a o&tro Nal"&ns diret'rios podem ser caracteriFados como s' de leit&raQ inacessEveisQ
etc.P.
Aliases de diret'rio tam*(m $ornecem transparAncia de caminDos para di$erentes plata$ormas
o& am*ientes de instalao de &ma aplicao. 9aso Da+a &ma mi"rao de &m am*iente a o&troQ a
DBC Database Company 7
Sol&es
%rvore de diret'rio no precisa ser a mesma NtalveF nem se+a possEvelQ em caso de sistemas
operacionais di$erentesPQ ento *asta ;&e se alterem os aliases para apontarem para os novos
diret'rios.
9rie aliases de diret'rio com o comando 9R4A!4 D#R49!OR\Q como se"&e2
DBC Database Company 8
CREATE OR REPLACE DIRECTORY nome_alias AS
`caminho';
Sol&es
=om(arao entre #i(os de Dados LOB e LO@&
LO@&U LO@& E<P LOB
>ma col&na por ta*ela BCltiplas col&nas por ta*ela
S&porta at( , /B S&porta at( 3 /B
9omando S4L49! retorna dados 9omando S4L49! retorna localiFador
Dados armaFenados in-line Nno re"istroP Dados armaFenados in-line o& out-of-line
=o s&porta tipos o*+eto S&porta tipos o*+eto
Acesso se;bencial aos dados Acesso aleat'rio aos dados
Os tipos de dado LOB ass&mem a"ora a $&no anteriormente desempenDada pelos tipos
LO=/ de armaFenar dados no estr&t&rados. 4ntretantoQ os tipos de dados LOB e LO=/ no so
compatEveis.
A*ai)o al"&mas comparaes entre tipos LOB e LO=/ NLO=/ e LO=/ RALP2
W permitido Daver mais de &ma col&na de &m tipo LOB em &ma ta*elaR LO=/s permitiam
apenas &ma.
O tamanDo m%)imo armaFenado por &m campo LO=/ ( de , "i"a*ItesR LOBs s&portam
at( 3 "i"a*Ites.
Ao rec&perar &m campo de in$ormaoQ LOBs retornam o localiFador do dadoR LO=/s
retornam o dado em si.
!ipos LOB armaFenam o localiFador na ta*elaQ en;&anto o dado $ica em &m se"mento
di$erenteQ a no ser ;&e o dado tenDa menos de 3 *ItesR LO=/s armaFenam todos os
dados em &m mesmo *loco de dados. Al(m dissoQ LOBs permitem ;&e os dados se+am
armaFenados em &m se"mento o& tablespace di$erente o& em ar;&ivos do sistema
operacional.
LOBs s&portam atri*&tos de tipos o*+etoQ com e)ceo de =9LOBR LO=/s no s&portam.
LOBs s&portam acesso aleat'rioR LO=/s so acessados se;bencialmente.
DBC Database Company 8
Sol&es
#ra1a,6ando com LOBs usando SQL
W possEvel intera"ir com LOBs atrav(s de al"&ns comandos SQL para operaes mais
*%sicas. O &so de comandos #=S4R!Q >PDA!4Q D4L4!4 e S4L49! permitem a manip&lao de
valores inteiros. Para operaes mais avanadasQ &sa-se PL/SQLQ atrav(s da pacGa"e DBBSHLOBQ
;&e permiteQ entre o&trosQ leit&ra e escrita de pedaos de in$ormaes LOB.
Para tra*alDar com dados em LOBsQ ( necess%rio primeiro inicialiFar o localiFador de &m
campoQ ;&e pode conter inicialmente =>LL. Para isso LOBs internosQ &tiliFe as $&nes
4BP!\HBLOBNP Npara BLOBsP e 4BP!\H9LOBNP Npara 9LOBs e =9LOBsP.
E$em(,o: inicialiFando &m BLOB na criao do re"istro.
E$em(,o: inicialiFando o campo 9LOB ap's a criao do re"istro.
Para LOBs e)ternos NB6#L4SPQ &tiliFe a $&no B6#L4=AB4NaliasQ ar;&ivoPQ para inicialiFar
os campos. Passe como par@metros o caminDo o& alias de diret'rio e o nome do ar;&ivo.
E$em(,o: inicialiFando &m campo B6#L4 Nima"emPQ ass&mindo &m alias de diret'rio
cDamado D#RH#BA/4=S.
>m comando DBL com s&*cons&lta pode copiar &m dado LOBQ para LOBs internosQ o& &m
localiFador apenasQ para LOBs e)ternos.
E$em(,o: copiando para o empre"ado 358 o c&rrEc&lo do re"istro D46A>L!.
DBC Database Company :
SQL> INSERT INTO empregados
2 VALUES (1001, `Teste',
3 NULL, -- NULL para o campo CLOB.
4 EMPTY_BLOB()); -- campo BLOB
inicializado.
SQL> UPDATE empregados
2 SET curriculo = EMPTY_CLOB();
3 WHERE codigo = 1001;
BFILENAME (alias, nome_arquivo); SQL> UPDATE pessoa
2 SET imagem = BFILENAME(`DIR_IMAGENS','FOTO1001.JPG')
3 WHERE codigo = 1001;
SQL> UPDATE empregados
2 SET curriculo = (SELECT curriculo
3 FROM empregados
4 WHERE nome =
`DEFAULT')
5 WHERE codigo = 4508;
Sol&es
#ra1a,6ando com LOBs usando PL/SQL: (ac/a0e
DB3SGLOB
O*+etos do tipo LOBQ assim como se&s antecessores LO=/ e LO=/ RALQ necessitam de
m(todos especiais para s&a manip&lao. Para LOBsQ esses m(todos esto disponEveis atrav(s da
pacGa"e DBBSHLOB. 4ssa pacGa"e de$ine al"&mas constantesQ entre elas2
Para carre"ar a pacGa"e DBBSHLOBQ o DBA deve se conectar como S\S e disparar os
scripts d*mslo*.s;l e prvtlo*.pl*Q o& e)ec&tar o script catproc.s;l. Depois dissoQ os privil("ios de
acesso K pacGa"e devem ser $ornecidos aos desenvolvedores.
4ssa pacGa"e no d% s&porte a nenD&m mecanismo de concorrAncia NlocGP para operaes
com B6#L4. A responsa*ilidade de reservar linDas antes de ;&al;&er modi$icao em valores LOB
( do desenvolvedor.
Eotinas da (ac/a0e DB3SGLOB
Os procedimentos e $&nes da pacGa"e DBBSHLOB dividem-se em ;&atro cate"orias2
Eotinas >ue modi;icam LOBs Internos:
<PPE@D: anexa um valor LOB a outro valor LOB.
=OPL: copia &ma parte de &m LOB em o&tro LOB.
EE<SE: apaga parte de um LOB, comeando em &m ponto determinado.
LO<DEO3ILE: carre"a dados B6#L4 em &m LOB interno.
#EI3: tr&nca &m valor LOB at( &m tamanDo especi$icado mais c&rto.
PEI#E: grava dados em um LOB em um ponto especi$icado.
PEI#E<PPE@D: "rava dados no $inal de &m LOB.
Eotinas >ue L)em dados de LOBs:
=O3P<EE: compara o valor de dois LOBs.
&E#=Q-@VSIWE: retorna o tamanDo de *loco NcD&nG siFeP para leit&ra e escrita.
&E#LE@&#Q: retorna o tamanho de um valor LOB.
I@S#E: retorna a posio da en(sima ocorrAncia de &m padro dentro de &m LOB.
EE<D: l dados de um LOB, iniciando na posio especi$icada.
S-BS#E: retorna parte de um valor LOB, iniciando na posio especi$icada.
Eotinas >ue tra1a,6am com BILEs Rsomente de ,eituraS:
ILE=LOSE: $ecDa &m ar;&ivo.
ILE=LOSE<LL: $ecDa todos os ar;&ivos previamente a*ertos.
ILEEXIS#S: veri$ica se &m ar;&ivo e)iste no servidor.
ILE&E#@<3E: retorna o alias de diret'rio e nome do ar;&ivo.
ILEISOPE@: veriica se o ar!uivo estava a"erto.
ILEOPE@: a"re um ar!uivo.
Eotinas de a1ertura e ;ec6amento de LOBs:
OPE@: a"re um LOB.
ISOPE@: veriica se um LOB est# a"erto.
DBC Database Company 1
Sol&es
=LOSE: echa um LOB.
Se ;&al;&er par@metro passado para essas $&nes $or =>LLQ a $&no retornar% =>LL. Se
$or passado o valor =>LL para o par@metro de LOB/B6#L4 destino nas $&nes de escritaQ &ma
e)ceo ser% disparada pelo procedimento.
Para conDecer detalDes de $&ncionamento de cada &m dos componentes da pacGa"e
DBBSHLOBQ se&s par@metros e s&as e)ceesQ cons&lte o man&al $racle6i Supplied %ac+ages
Reference 7 DB!S_&$B.
O par@metro o$$set est% presente em m&itas dessas $&nes e procedimentosQ e representaQ
para tipos BLOB e B6#L4Q o nCmero de *Ites at( a posio de onde a operao deve comearQ a
partir do inEcio do campo. Para tipos 9LOB e =9LOBQ o o$$set representa o nCmero de caracteres.
Para par@metros de offset em Oracle8iQ apenas valores positivos so permitidos. Os valores de
offsets e intervalos o*servadas em $&nes de tratamento de strings em SQL no so permitidos.
A lista a se"&ir identi$ica os tipos de dados &sados pelos procedimentos e $&nes da pacGa"e
DBBSHLOB e as sit&aes onde so &sados2
BLOB: &m LOB *in%rio de ori"em o& destino.
E<P: &m *&$$er de ori"em o& destino tipo RAL N*in%rioQ &sado com BLOBP. At( 0,878
*Ites.
=LOB: &m LOB tipo caracter de ori"em o& destino Nincl&indo =9LOBP. At( 0,878 *Ites.
8<E=Q<E2: &m *&$$er caracter de ori"em o& destino N&sado com 9LOB e =9LOBP.
I@#E&EE: especi$ica o tamanDo de &m *&$$er o& LOBQ o o$$set em &m LOBQ o& a ;&antidade
de dados a serem acessados.
BILE: >m o*+eto *in%rioQ "randeQ armaFenado $ora do *anco.
4sses mesmos tipos de dados podem ser &sados em rotinas PL/SQL ;&e tra*alDem com a
pacGa"e DBBSHLOB.
Para e)empli$icar o &so da pacGa"e DBBSHLOBQ veremos em mais detalDes os
procedimentos de leit&ra e escrita mais "en(ricos da pacGa"e DBBSHLOB2 R4AD e LR#!4.
DBC Database Company 11
Sol&es
DB3SGLOB.EE<D
>tiliFe o procedimento R4AD para ler &m pedao de &m valor LOB e retornar &ma
;&antidade especE$ica de dadosQ comeando da posio determinada em offset. Se no Do&verem
mais dados a serem lidosQ &ma e)ceo =OHDA!AH6O>=D ( disparada. O valor em amount
determina o nCmero de *Ites/caracteres a serem lidos. Se o $im do campo $or atin"ido antes de
terem sido lidos amount *Ites/caracteresQ o nCmero de *Ites/caracteres e$etivamente lidos (
retornado em amountQ sendo esse nCmero menor do ;&e a;&ele inicialmente especi$icado.
4m PL/SQLQ &m valor m%)imo de 0,878 ( permitido para par@metros RAL e .AR9MAR,Q
de $orma ;&e devemos tra*alDar com pedaos de in$ormao LOB no maiores do ;&e issoQ de cada
veF. 9erti$i;&e-se ;&e os rec&rsos de sistema alocados so ade;&ados para s&portar esses tamanDos
de buffers para o nCmero de sesses de &s&%rios permitidas. O Oracle Server ir% disparar as
e)cees de mem'ria apropriadas se esses rec&rsos no $orem s&$icientes.
O*s.2 !ipos BLOB e B6#L4 retornam RAL para o par@metro bufferR 9LOB e =9LOB retornam
.AR9MAR,.
E$em(,o:
DBC Database Company 1,
PROCEDURE READ(
lob_source IN BFILE|BLOB|CLOB CHARACTER SET ANY_CS,
amount IN OUT NOCOPY BINARY_INTEGER,
offset IN INTEGER,
buffer OUT RAW|VARCHAR2 CHARACTER SET lob_loc
%CHARSET)
Sol&es
DBC Database Company 10
DECLARE
localizador CLOB;
texto VARCHAR2(32767);
tamanho BYNARY_INTEGER := 32767;
offset INTEGER := 1;
BEGIN
SELECT curriculo
INTO localizador
FROM empregados
WHERE codigo = 5887;
BEGIN
LOOP
DBMS_LOB.READ(localizador, tamanho, offset, texto);
-- Aqui vem o processamento desejado para o pedao lido.
...
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL; -- Fim do LOB atingido.
END;
END;
/
Sol&es
DB3SGLOB.PEI#E
>tiliFe o procedimento LR#!4 para "ravar pedaos de in$ormaesQ contidos em bufferQ com
tamanDo especi$icado em amount na posio indicada em offsetQ partindo do inEcio do campo LOB.
9erti$i;&e-se ;&e o tamanDo in$ormado em amount corresponde K ;&antidade de in$ormao
em bufferQ principalmente para caracteres m&lti-*IteQ pois apenas o nCmero de *Ites/caracteres em
amount ser% "ravado no campo LOB.
E$em(,o: "ravando LOBs atrav(s de PL/SQL
=o e)emploQ a vari%vel LO9AL#hADOR serve como o localiFadorQ e a vari%vel !ABA=MO
rece*e o tamanDo do te)to a ser adicionado. O comando S4L49!...6OR >PDA!4 rec&pera o
localiFador do conteCdo e)istente na col&na 9>RR#9>LO e a*re o LOBQ reservando o re"istro.
Por $imQ o procedimento DBBSHLOB.LR#!4 ( cDamada para "ravar o te)to no valor da col&na
LOB a partir da posio especi$icada em O66S4!. O comando 9OBB#! $ecDa o LOB.
DBC Database Company 13
PROCEDURE WRITE(
lob_dest IN OUT NOCOPY BFILE|BLOB|CLOB CHARACTER SET
ANY_CS,
amount IN BINARY_INTEGER,
offset IN INTEGER,
buffer IN RAW|VARCHAR2 CHARACTER SET lob_loc%CHARSET)
DECLARE
localizador CLOB;
texto VARCHAR2(200);
tamanho BINARY_INTEGER;
offset INTEGER;
BEGIN
texto := `Aqui vai o texto a ser inserido...';
tamanho := LENGTH(texto); -- Numero de caracteres a ser
gravado.
SELECT curriculo
INTO localizador
FROM empregados
WHERE codigo = 5887
FOR UPDATE; -- O FOR UPDATE trava o registro, permitindo o
WRITE
/* O deslocamento igual ao tamanho do texto j existente mais
um. Logo, o novo texto ser adicionado no final. */
offset := LENGTH(texto) + 1;
DBMS_LOB.WRITE(localizador, tamanho, offset, texto);
COMMIT; -- Libera o registro.
DBMS_OUTPUT.PUT_LINE(TO_CHAR(tamanho)||' caracteres
gravados.');
END;
/
Sol&es
Eemo+endo LOBs
Remova re"istros contendo LOBs com o comando SQL D4L4!42
Desassocie &m valor LOB de &m re"istro2
>ma inst@ncia LOB pode ser removida atrav(s de comandos DBL. O comando D4L4!4 ir%
remover a linDaQ destr&indo o valor LOBQ en;&anto o comando >PDA!4 ir% destr&ir apenas a
re$erAncia ao LOBQ preservando a linDa *em como o pr'prio valor LOB. Para issoQ *asta at&aliFar o
conteCdo da col&na LOB com n&loQ atrav(s da palavra-cDave =>LL o& reinicialiFar os
localiFadores com as $&nes 4BP!\H9LOB e 4BP!\HBLOB.
>m valor LOB interno ( destr&Edo ;&ando a linDa ;&e o cont(m $or removidaR ;&ando a
ta*ela $or removida o& tr&ncadaR o&Q implicitamenteQ ;&ando o valor LOB inteiro $or at&aliFado.
Ar;&ivos associados com campos B6#L4 devem ser removidos atrav(s de comandos do
sistema operacional.
DBC Database Company 15
SQL> DELETE FROM empregados
2 WHERE codigo = 5887;
SQL> UPDATE empregados
2 SET curriculo = EMPTY_CLOB()
3 WHERE nome = `Joao';
Sol&es
E$ercFcios 2
1. 9ria a ta*ela P4SSOALQ &sando os se"&intes atri*&tos e tipos de dados2
@ome da =o,una #i(o de Dado Preciso
9odi"o =&merico 7
>ltimoHnome 9aracter 05
9&rric&lo 9LOB -
6oto BLOB -
,. #nsira &m re"istro na ta*ela P4SSOAL. >se a $&no 4BP!\H9LOBNP para o campo
9LOB e o valor =>LL para o campo BLOB.
0. At&aliFe o re"istro criado anteriormenteQ preencDendo o campo 9LOB do re"istro &sando
PL/SQL N&se &m *loco an1nimoP e a pacGa"e DBBSHLOB.
DBC Database Company 17
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
18.
18.
!ra3a-9ando com !i)os 637eto
!ra3a-9ando com !i)os 637eto
DBC Database Company
Sol&es
O14eti+o
Descrever os tipos o*+eto
9riar o*+etos
Banip&lar o*+etos
DBC Database Company ,
Sol&es
#i(os O14etos
>m o*+eto ( &ma a*strao de &ma parte da realidadeQ tal como &m pedido de compraQ &ma
pessoa o& &ma casaQ ;&e poss&i caracterEsticas e comportamentos pr'prios.
>m tipo o*+eto permite implementar tais pedaos da realidade mantendo a mesma
perspectiva. >m tipo o*+eto (Q na pr%ticaQ &m tipo de dado composto de$inido pelo &s&%rioQ ;&e
a"r&pa &m estr&t&ra de dados +&ntamente com $&nes e procedimentos ;&e manip&lam tais dados.
As col&nas ;&e compem a estr&t&ra de dados so cDamadas atributos.
As $&nes e procedimentos a"r&pados no o*+eto so cDamados m8todos.
A estr&t&ra de dados $ormada pelos atri*&tos ( pC*licaQ o& se+aQ pode ser vista por pro"ramas
clienteQ e portantoQ tais atri*&tos podem ser manip&lados individ&almente Ncomo campos de &ma
ta*elaP. Por(m ( recomend%vel ;&e os atri*&tos se+am manip&lados apenas pelos m(todos
disponi*iliFados pelo tipo o*+etoQ de modo a manter a l'"ica associada a esse o*+eto.
O tipo o*+eto $&nciona como &m template o& modelo. A partir desse modelo criam-se
inst@ncias de o*+etosQ todas se"&indo as re"ras de$inidas no tipo o*+eto. Por e)emploQ poderEamos
ter &m tipo o*+eto cDamado 9ARROQ ;&e de$ine &m carro como tendo 9ORQ A=O e PLA9A. A
partir desse tipo o*+eto 9ARROQ poderEamos instanciar &m o*+eto desse tipoQ ;&e teria cor
cvermelDadQ ano 1::: e placa cU\h :15d.
DBC Database Company 0
Sol&es
Estrutura de um #i(o O14eto
Assim como &ma pacGa"e de *anco de dados OracleQ &m tipo o*+eto tem d&as partes2
A especi$icao do o*+eto ( a inter$ace entre o *anco e as aplicaes. 4la declara a
estr&t&ra de dados No con+&nto de atri*&tosP assim como as operaes Nm(todosP para
rec&perar o& manip&lar os dados. !odas as declaraes so pC*licas NvisEveis de $ora do
o*+etoP.
O corpo do o*+eto implementa os m(todos declarados na especi$icao. =eleQ os m(todos
so de$inidos por completo. Podem e)istir tam*(m m(todos privadosQ implementados no
corpo mas no declarados na especi$icaoQ como nas pacGa"es. O corpo do o*+eto pode
ser recriado o& modi$icado sem ser necess%ria ;&al;&er alterao na especi$icao.
O14etos #ransitHrios R#ransient O14ectsS
!ipos o*+eto so criados no *anco de dados e $icam armaFenados no dicion%rio de dados do
Oracle. #nst@ncias de tipos o*+eto Nos o*+etos propriamente ditosP $icam armaFenadas no *anco de
dadosQ e so cDamadas o*+etos persistentes.
4)istem por(m os o*+etos ;&e no $icam armaFenadosQ mas sim so declaradosQ inicialiFadosQ
&sados e apa"ados por pro"ramao. 4sses o*+etos so cDamados transit'rios. Q&ando o pro"rama
terminaQ o o*+eto dei)a de e)istirQ da mesma $orma como vari%veis locaisQ e apenas o tipo o*+eto
permanece armaFenado no *anco.
O*+etos transit'rios so de$inidos como inst@ncias de tipos o*+eto persistentes NarmaFenados
no *ancoPQ portanto tais o*+etos no podem conter tipos de dados PL/SQL. 4ntretantoQ a maioria
dos tipos de dados aceitos pelo Oracle Server podem ser &tiliFados.
<tri1utos
O con+&nto de atri*&tos $ormam a estr&t&ra de dados. O tipo de estr&t&ra de dados depende do
o*+eto do m&ndo real ;&e est% sendo modelado. Por e)emploQ para representar &m est&dante de
c&rso s&perior seriam necess%rios v%rios atri*&tos do tipo .AR9MAR, para armaFenar o nomeQ
endereoQ etc. e &m atri*&to .ARRA\ para armaFenar as cadeiras c&rsadasQ cr(ditos e notas.
Atri*&tos devem ser de$inidos se"&indo as se"&intes re"ras2
>m atri*&to ( declarado com &m nome e &m tipo de dado NdatatypeP.
O tipo de dado pode ser ;&ase ;&al;&er tipo aceito pelo Oracle Server.
=o ( possEvel inicialiFar &m atri*&to na s&a declarao &sando o operador de atri*&io
o& a cl%&s&la D46A>L!.
=o ( possEvel impor &ma constraint =O! =>LL em &m atri*&to.
!ipos o*+eto simples podem conter apenas atri*&tos de tipos de dados Oracle. Para tipos
o*+etos comple)osQ no entantoQ o tipo de dado de &m atri*&to pode ser o&tro tipo o*+eto. #sto
permite a constr&o de &m o*+eto comple)o a partir de tipos o*+eto mais simples.
DBC Database Company 3
Sol&es
3Atodos
>m m(todo ( &m s&*pro"rama Nprocedimento o& $&noP declarado na de$inio do tipo
o*+eto. B(todosQ como procedimentos e $&nes em pacGa"esQ podem poss&ir d&as partes2 &ma
especi$icao e &m corpo.
A especi$icao consiste do nome do m(todoQ &ma lista de par@metros NopcionalP eQ para
$&nesQ &m tipo de retorno. Q&ando &m m(todo aparecer na especi$icao de &m o*+etoQ
ele ( dito &m m(todo pC*licoQ e pode ser visto e re$erenciado pelos desenvolvedores.
O corpo ( &m *loco de c'di"o PL/SQL ;&e e)ec&tar% &ma o& mais operaes especE$icas.
!odo m(todo poss&i corpo. BasQ se ele no poss&ir especi$icaoQ apenas o corpoQ ento
ele ( dito &m m(todo privadoQ e s' pode ser re$erenciado pelos o&tros m(todos do o*+eto.
3Atodos 3em1er e Static
B(todos podem ser declarados do tipo B4BB4R o& S!A!#9.
>m m(todo do tipo B4BB4R sempre poss&i &m primeiro par@metro cDamado S4L6Q
declarado implEcita o& e)plicitamente. 9om eleQ o m(todo B4BB4R pode re$erenciar atri*&tos de
s&a inst@ncia de o*+etoQ &tiliFando os valores especE$icos de se&s atri*&tosQ como por e)emploQ o
valor cvermelDod de cor do o*+eto tipo 9ARRO. #sso permite ;&e se+am $eitas cDamadas a &m
m(todo B4BB4R do tipo2
B(todos S!A!#9 no podem re$erenciar atri*&tos de &ma inst@ncia de o*+eto por;&e eles so
de$inidos no para inst@nciasQ mas para todo &m tipo o*+eto. 6aF-se cDamadas a m(todos S!A!#9
da se"&inte $orma2
3Atodos =onstrutores
!odo tipo o*+eto criado tem &m m(todo implicitamente declarado cDamado m8todo
construtor. 4sse m(todo ( &sado para instanciar &m novo o*+eto de &m tipo o*+eto. B(todos
constr&tores so $&nes com as se"&intes caracterEsticas2
O mesmo nome do tipo o*+eto.
Par@metros $ormais e)atamente i"&ais aos atri*&tos do tipo o*+eto.
>m valor de retorno do tipo do o*+eto.
O constr&tor pode ser invocado em ;&al;&er l&"ar onde &m o*+eto da;&ele tipo se+a
permitido.
DBC Database Company 5
objeto.mtodo_member(parmetros...); tipo_objeto.mtodo_static(parmetros...);
Sol&es
=riando #i(os O14eto
=riando uma Es(eci;icao de #i(o O14eto
>tiliFe o comando 9R4A!4 !\P4 para criar a especi$icao do tipo o*+eto.
Sinta$e
At&almenteQ no ( possEvel de$inir tipos o*+eto dentro de &m *loco PL/SQLQ s&*pro"rama o&
pacGa"e. 4ntretanto ( possEvel $aFA-lo via SQL?Pl&s o& 4nterprise Bana"er atrav(s do comando
9R4A!4 !\P4.
Eestri!es
=a especi$icao do tipo o*+etoQ todos os atri*&tos devem ser declarados antes dos
m(todos.
Se apenas atri*&tos $orem declarados na especi$icao do tipo o*+etoQ no ( necess%rio
declarar &m corpo para o tipo o*+eto.
Atri*&tos no podem ser declarados no corpo do tipo o*+eto.
E$em(,o: 9riando a especi$icao de &m tipo o*+eto simples para nomes.
DBC Database Company 7
CREATE [OR REPLACE] TYPE nome_tipo AS OBJECT
(atributo1 datatype,
atributo2 datatype...[,
{MEMBER|STATIC} {PROCEDURE|FUNCTION} nome
[(parmetros)],
{MEMBER|STATIC} {PROCEDURE|FUNCTION} nome [(parmetros)]
...])
CREATE TYPE tipo_nome AS OBJECT
(prenome VARCHAR2(25),
sobrenome VARCHAR2(25),
iniciais VARCHAR2(7),
MEMBER FUNCTION retorna_nome RETURN VARCHAR2)
/
Sol&es
=riando um =or(o de um #i(o O14eto
>tiliFe o comando 9R4A!4 !\P4 BOD\ para criar o corpo do tipo o*+eto.
Sinta$e
E$em(,o: 9riando o corpo de &m tipo o*+eto simples para nomes.
DBC Database Company 8
CREATE [OR REPLACE] TYPE BODY nome_tipo AS
{MEMBER|STATIC} {PROCEDURE|FUNCTION} nome [(parmetros)]
Corpo do mtodo.
{MEMBER|STATIC} {PROCEDURE|FUNCTION} nome [(parmetros)]
Corpo do mtodo.
...
END;
CREATE TYPE BODY tipo_nome AS
MEMBER FUNCTION retorna_nome RETURN VARCHAR2
IS
BEGIN
RETURN(nome||' `||sobrenome);
END;
END;
/
Sol&es
E$em(,o de =riao de #i(os O14etos
E$em(,o: criando a especi$icao e corpo de &m tipo o*+eto comple)o para pessoas.
DBC Database Company 8
CREATE TYPE tipo_pessoa AS OBJECT
(codigo NUMBER(7),
nome tipo_nome,
endereco VARCHAR2(25),
cidade VARCHAR2(25),
funo VARCHAR2(20),
salario NUMBER(7,2),
MEMBER FUNCTION retorna_endereco RETURN VARCHAR2,
MEMBER PROCEDURE altera_salario
(p_fator IN NUMBER));
/
CREATE TYPE BODY tipo_pessoa AS
MEMBER FUNCTION retorna_endereco RETURN VARCHAR2
IS
BEGIN
RETURN(logradouro||', `||cidade||', `||
cidade||' - `||estado||'. CEP:'||cep);
END;
MEMBER PROCEDURE altera_salario
(p_fator IN NUMBER)
IS
BEGIN
salario := salario * p_fator;
END;
END;
/
Sol&es
-ti,i.ando os #i(os O14etos em #a1e,as
>ma veF criado &m tipo o*+etoQ podemos &s%-lo em constr&es PL/SQL para declarao de
identi$icadoresQ tais como vari%veisQ col&nasQ campos de re"istroQ etc. 4stes por(mQ sero o*+etos
transit'riosQ descartados ao $inal da e)ec&o do pro"ramaQ o&Q no caso de pacGa"esQ possivelmente
no $inal da sesso.
Para criarmos o*+etos persistentesQ precisamos criar estr&t&ras no *anco ;&e &tiliFem o tipo
o*+eto. 4)istem dois tipos de estr&t&ras ;&e o $aFem2 ta*elas com col&nas de &m tipo o*+eto e
ta*elas de o*+etos No*+ect ta*lesP.
=o,unas de ti(o o14eto
9rieQ com o comando 9R4A!4 !ABL4Q &ma ta*ela ;&e contenDa col&nas de tipo o*+eto.
>se ento comandos SQL para inserir o*+etosQ at&aliFar se&s atri*&tos e cDamar se&s m(todos. >se
o m(todo constr&tor para instanciar &m o*+eto na col&na de tipo o*+eto.
E$em(,o:
O*s.2 sempre ;&e se re$erencia &m atri*&to o& m(todo ( o*ri"at'rio o &so de &m alias de
ta*ela.
DBC Database Company :
CREATE TABLE empregados
(codigo NUMBER(5),
nome tipo_nome,
cargo VARCHAR2(30),
...)
/
INSERT INTO empregados
VALUES
(2350,
Tipo_nome(`Joo','Silva','JS'), -- Mtodo
`VENDEDOR', -- construtor
...)
/
SELECT e.nome.retorna_nome() -- chamada de
mtodo
FROM empregados e
WHERE codigo = 2350
/
UPDATE empregados e
SET e.nome.sobrenome = `Souza'
WHERE codigo = 2350
/
Sol&es
#a1e,as de O14etos
4m ta*elas com col&nas de tipo o*+etoQ os o*+etos so parte do re"istro. 4m ta*elas de
o*+etosQ entretantoQ cada re"istro ( &m o*+etoQ e cada col&na corresponde a &m atri*&to do o*+eto.
9rie ta*elas de o*+etos com o comando 9R4A!4 !ABL4 com a se"&inte sinta)e2
!a*elas de o*+etos se comportam de $orma ;&ase idAntica K ta*elas de col&nas. >m S4L49!
so*re &ma ta*ela de o*+etos retornaQ para cada re"istroQ o conteCdo dos atri*&tos do o*+eto desse
re"istroQ en;&anto ;&e em &ma col&na de tipo o*+etoQ &m S4L49! retorna &m o*+eto.
O(erador 8<L-E
Para ;&e &m S4L49! retorne &m o*+eto a partir de &ma ta*ela de o*+etos ( preciso &sar o
operador .AL>4.
E$em(,o: ass&ma &ma ta*ela de o*+etos de nomes.
DBC Database Company 1
CREATE TABLE nome OF tipo_objeto; SQL> CREATE TABLE nomes OF tipo_nome;
Table created.
SQL> INSERT INTO nomes
2 VALUES (tipo_nome(`Joo','Souza','JS'));
1 row inserted.
SQL> SELECT n.prenome, n.sobrenome, n.iniciais
2 FROM nomes n;
PRENOME SOBRENOME INICIAIS
--------- ------------ --------
Joo Souza JS
SQL> SELECT VALUE(n)
2 FROM nomes n;
VALUE(N)
------------------------------
tipo_nome(`Joo','Souza','JS')
Sol&es
=6amada de 3Atodos de O14etos
4)ec&te cDamadas a m(todos de o*+etos atrav(s do &so de notao de pontosQ semelDante Ks
cDamadas de procedimentos e $&nes de pacGa"esQ &sando2
9Damadas de m(todos sem par@metros em SQL e)i"em a presena de parAnteses. 4m
PL/SQLQ os parAnteses so opcionais em cDamadas com&nsQ eQ em cDamadas aninDadasQ
o*ri"at'rios para todos os m(todos menos o Cltimo.
E$em(,o: cDamada de m(todos em SQL.
E$em(,o: cDamada de m(todos em PL/SQL.
DBC Database Company 11
nome_objeto.metodo(parmetros...) SQL> SELECT p.nome.retorna_endereco()
2 FROM pessoas p
3 WHERE codigo = 2350;
SQL> INSERT INTO pessoas
2 VALUES
3 (tipo_pessoa(4498,
4
tipo_nome(`John','Smith','JS'),
5 `Rua ...',
6 ...);
DECLARE
obj_pessoa tipo_pessoa;
v_nome_completo VARCHAR2(100);
BEGIN
SELECT VALUE(p)
INTO obj_pessoa
FROM pessoas
WHERE codigo = 4498;
obj_pessoa.altera_salario(0.12);
v_nome_completo :=
obj_pessoa.retorna_endereco;
...
Sol&es
=onsu,tando Descri!es de #i(os O14eto no Dicion:rio de
Dados
In;orma!es so1re ti(os o14eto (odem ser encontradas nas +is!es:
>S4RHOB<49!S
Descrio de o*+etos do *anco de dados tipo c!\P4d e c!\P4 BOD\d.
>S4RH!\P4S
Descrio dos tipos o*+eto.
>S4RH!\P4HA!!RS
Descrio dos atri*&tos de tipos o*+eto.
In;orma!es so1re mAtodos de ti(os o14eto (odem ser encontradas nas +is!es:
>S4RH!\P4HB4!MODS
Descrio dos m(todos de tipos o*+eto.
>S4RHB4!MODHPARABS
Descrio dos par@metros dos m(todos de tipos o*+eto.
>S4RHB4!MODHR4S>L!S
Descrio dos res&ltados dos m(todos de tipos o*+eto.
DBC Database Company 1,
Sol&es
E$ercFcios 15
1. 9rie &m tipo o*+eto cDamado !#POH.#D4O para representar &ma $ita de vEdeo disponEvel
em &ma locadora. Os atri*&tos so2
<tri1uto #i(o #aman6o
9odi"o =&m(rico 5
!it&lo 9aracter 3
4stado 9aracter 1
DataHDevol&cao Data -
9ate"oria 9aracter 8
Os m(todos so2 LO9ARH6#LB4Q D4.OL.4RH6#LB4Q 9LASS#6#9ARH6#LB4 e
9O=S>L!AH6#LB4.
O estado de &m vEdeo pode ser cD#SPO=#.4LdQ cLO9ADOd o& cR4S4R.ADOd.
9rie o m(todo LO9ARH6#LB4 para modi$icar o estado de &m vEdeo para cLO9ADOd e
determinar a data de devol&oQ passando como par@metro &ma data de devol&o.
9rie o m(todo D4.OL.4RH6#LB4 para limpar a data de devol&o e modi$icar o estado de
&m vEdeo para cD#SPO=#.4Ld.
9rie o m(todo 9LASS#6#9ARH6#LB4 para alterar o campo 9A!4/OR#A de &m vEdeo.
.alores possEveis para a cate"oria so2 cA.4=!>RAdQ c9OB4D#AdQ cS>SP4=S4d e cDRABAd.
Passe como par@metro a cate"oria a classi$icar.
9rie o m(todo 9O=S>L!AH6#LB4 como &ma $&no ;&e retorna &ma string contendo as
in$ormaes so*re &m vEdeo. Determine os nEveis de p&reFa dessa $&no com &ma cDamada de
R4S!R#9!HR464R4=94S ap's s&a declarao de modo ;&e essa $&no possa ser cDamada a
partir de &m comando SQL S4L49!.
,. 9rie &ma ta*ela de o*+etos tipo vEdeo e insira al"&ns o*+etosQ como os do e)emplo.
=Hdi0o #Ftu,o Estado Data De+o,uo =ate0oria
11 Poeira em Alto Bar D#SPO=#.4L in&lla 9OB4D#A
,1: A RocDa R4S4R.ADO in&lla A.4=!>RA
155 Barrados no SDoppin" LO9ADO 1,-BAR-, 9OB4D#A
0. 9rie &m procedimento para alocar &m video. O procedimento deve rece*er como
par@metro o c'di"o do video e deve m&dar se& estado para cLO9ADOd apenas se ele estiver
at&almente disponEvel. Se o $ilme no estiver disponEvelQ mostre as in$ormaes so*re o vEdeo
$ornecidas pelo m(todo 9O=S>L!AH.#D4O. >ma locao d&ra &m dia.
DBC Database Company 10
Desenvolvimento de Aplicaes em PL/SQL em Banco de Dados Oracle8i
11.
11.
So-ues
So-ues
DBC Database Company
Sol&es
E$ercFcios 2
1. 9rie &m procedimento de *anco de dados cDamado 9ADAS!RAHP4SSOA ;&e insira &m
novo re"istro na ta*ela de P4SSOAS. O procedimento deve rece*er como par@metros de entrada o
nome da pessoa e o se& tipo Ncampo P4SSH!\P4P. Os demais campos o*ri"at'rios da ta*ela
devem ser de$inidos dentro do procedimento. Para o c'di"oQ &tiliFe a se;&ence P4SSHS4QR para a
data da Cltima at&aliFaoQ &tiliFe a $&no S\SDA!4Q e para a sit&ao de cr(ditoQ a constante S#T.
O*s.2 os valores possEveis para o campo P4SSH!\P4 so2 S6TQ para pessoa $EsicaQ e S<TQ para
pessoa +&rEdica.
,. 9rie &m procedimento cDamada 9ADAS!RAH64R#ADOSQ ;&e insere &m re"istro na
ta*ela 64R#ADOS. Passe como par@metro os valores para os trAs campos da ta*ela2 D!H464!#.A
Ndata do $eriadoPQ D4S9R#9AOQ >=6H9OD#/O. 6aa com ;&e o c'di"o da &nidade $ederativa
tenDa &m valor de$a&lt de 1 NBrasilP.
0. 4)ec&te o procedimento 9ADAS!RAH64R#ADO pelo menos trAs veFesQ &sando cada &m
dos m(todos de passa"em de par@metros2 posicionalQ nomeado e com*inado.
DBC Database Company ,
PROCEDURE cadastra_pessoa
(pNome IN VARCHAR2,
pPess_Type IN VARCHAR2)
IS
BEGIN
INSERT INTO PESSOAS
(codigo, nome, dt_ultima_atualizacao,
situacao_credito, pess_type)
VALUES
(PESS_SEQ.NEXTVAL, pNome, SYSDATE,
`I', pPess_Type);
END;
PROCEDURE cadastra_feriado
(pData IN feriados.dt_efetiva%TYPE,
pDescricao IN feriados.descricao%TYPE,
pUnf IN feriados.unf_codigo%TYPE DEFAULT
1)
IS
BEGIN
INSERT INTO feriados
(dt_efetiva, descricao, unf_codigo)
VALUES
(pData, pDescricao, pUnf);
END;
Sol&es
DBC Database Company 0
PL/SQL> CADASTRA_FERIADO( `25-DEC-01', `Natal', 1 );
PL/SQL> CADASTRA_FERIADO( `25-DEC-01', `Natal' );
PL/SQL> CADASTRA_FERIADO( pDescricao=>`Carnaval', pData=>`7-JAN-
00',
+> pUnf => 1 );
PL/SQL> CADASTRA_FERIADO( Sysdate, pUnf=>10,
pDescricao=>'Folga' );
Sol&es
E$ercFcios 3
1. 9rie e e)ec&te &ma $&no ;&e retorne o preo de &m c&rso a partir de &m c'di"o
in$ormado como par@metro de entrada.
O*s.2 no se es;&ea de inicialiFar &ma vari%vel no Proced&re B&ilder atrav(s do comando
S.9R4A!4 =>BB4R nomeHdaHvariavel PR49#S#O= 10 S9AL4 ,TQ para rece*er o res&ltado da
$&noQ e de vis&aliFar o conteCdo dessa vari%vel atrav(s do comando
S!4U!H#O.P>!HL#=4N nomeHdaHvariavel PRT.
,. 9rie e e)ec&te &ma $&no ;&e retorne o nCmero de dias de d&rao de &m c&rso a partir
do nCmero de Doras de d&rao deste. A $&no deve aceitar &m se"&ndo par@metro !>R=OQ ;&e
mostra como os dias devem ser calc&lados. !&rnos da manD NcBdP o& da tarde Nc!dPQ so de 3
Doras. !&rnos da noite Nc=dP so de 0 Doras. 4 t&rno inte"ral Nc#dP so de 8 Doras.
DBC Database Company 3
FUNCTION consulta_preco
(pCodigo IN VARCHAR2)
RETURN NUMBER
IS
nPreco CURSOS.PRECO%TYPE;
BEGIN
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = pCodigo;
RETURN nPreco;
END;
FUNCTION calcula_duracao_curso
(p_horas IN NUMBER, p_turno IN VARCHAR2)
RETURN NUMBER IS
BEGIN
IF p_turno = `I' THEN
RETURN( round(p_horas/8) );
ELSIF p_turno = `N' THEN
RETURN( round(p_horas/3) );
ELSE
RETURN( round(p_horas/4) );
END IF;
END;
Sol&es
0. 4)ec&te a $&no criada no e)ercEcio anterior em comandos SQLQ como S4L49!Q por
e)emplo.
DBC Database Company 5
PL/SQL> SELECT horas, calcula_duracao_curso(horas, `N')
+> FROM cursos;
Sol&es
E$ercFcios "
1. Bodi$i;&e a $&no 9O=S>L!AHPR49O paraQ no caso do comando S4L49! no
rec&perar nenD&m re"istroQ o pro"rama ser interrompido com a mensa"em S=o e)iste c&rso com
esse c'di"oT.
DBC Database Company 7
FUNCTION consulta_preco
(pCodigo IN VARCHAR2)
RETURN NUMBER
IS
nPreco CURSOS.PRECO%TYPE;
BEGIN
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = pCodigo;
RETURN nPreco;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR( -20001, `No existe curso com
esse cdigo.');
END;
Sol&es
,. Altere o procedimento 9ADAS!RAH64R#ADO para interceptar o erro de cDave prim%ria
d&plicada Nc'di"o de erro O1PQ caso tentem inserir &m $eriado +% cadastradoQ e trate o erro como
&ma e)ceoQ disparando &ma mensa"em apropriada. A cDave prim%ria de 64R#ADOS ( composta
de D!H464!#.A e >=6H9OD#/O. Provo;&e o erroQ e)ec&tando o procedimento para &m $eriado
+% e)istente.
0. A e)ceo interceptada no e)ercEcio anterior poderia ser tratada de $orma di$erentee Se
simQ comoe
4)iste &ma e)ceo pr(-de$inida para o erro de cDave prim%ria d&plicadaQ cDamada
D>PH.ALHO=H#=D4U. Basta adicionar &ma cl%&s&la na seo 4U94P!#O= do tipo2
DBC Database Company 8
PROCEDURE cadastra_feriado
(pData IN feriados.dt_efetiva%TYPE,
pDescricao IN feriados.descricao%TYPE,
pUnf IN feriados.unf_codigo%TYPE DEFAULT 1)
IS
Chave_duplicada EXCEPTION;
PRAGMA EXCEPTION_INIT( chave_duplicada, -1 );
BEGIN
INSERT INTO feriados
(dt_efetiva, descricao, unf_codigo)
VALUES
(pData, pDescricao, pUnf);
EXCEPTION
WHEN chave_duplicada THEN
RAISE_APPLICATION_ERROR(-20001, `Feriado j cadastrado');
END;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20001, `Feriado j cadastrado');
Sol&es
E$ercFcios %
1. Liste o nome e o stat&s de todas os procedimentos e $&nes ;&e vocA poss&i.
,. Liste o c'di"o $onte completo da $&no 9O=S>L!AHPR49O &tiliFando o comando
S4L49!.
0. Altere a $&no 9O=S>L!AHPR49O de modo a deli*eradamente provocar &m erroQ por
e)emplo retire o ponto-e-vEr"&la do comando S4L49!. !ente recompilar a $&no.
3.
DBC Database Company 8
SELECT substr(object_name, 1, 30)
object_name,status
FROM user_objects
WHERE object_type IN (`PROCEDURE', `FUNCTION');
SELECT text
FROM user_source
WHERE name = `CONSULTA_PRECO';
FUNCTION consulta_preco
(pCodigo IN VARCHAR2)
RETURN NUMBER
IS
nPreco CURSOS.PRECO%TYPE;
BEGIN
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = pCodigo -- Erro de sintaxe.
RETURN nPreco;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR( -20001, `No existe
curso com esse cdigo.');
END;
Sol&es
5. Liste os erros de compilao da $&no 9O=S>L!AHPR49O &tiliFando o comando
S4L49!Q o comando SMOL 4RRORS e o Proced&re B&ilder.
=o Proced&re B&ilderQ *asta compilar &m pro"rama com erros para estes aparecerem na parte
in$erior da +anela Pro"ram >nit 4ditor o& Stored Pro"ram >nit 4ditor.
Atrav(s de &m S4L49!2
Atrav(s do comando do SQL?Pl&sQ &se o comando SMOL 4RRORS2
5. 9orri+a a $&no 9O=S>L!AHPR49O e recompile-a.
DBC Database Company :
SELECT line, position, text
FROM user_errors
WHERE name = `CONSULTA_PRECO';
SQL> show errors FUNCTION consulta_preco
(pCodigo IN VARCHAR2)
RETURN NUMBER
IS
nPreco CURSOS.PRECO%TYPE;
BEGIN
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = pCodigo;
RETURN nPreco;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR( -20001, `No existe
curso com esse cdigo.');
END;
Sol&es
7. 4)ec&te e dep&re o procedimento 9O=S>L!AHPR49O pelo Proced&re B&ilder. Dep&re-
o tam*(m pelo SQL?Pl&sQ adicionando cDamadas K pacGa"e DBBSHO>!P>! no procedimento.
O*s.2 para ativar a saEda da pacGa"e DBBSHO>!P>! no SQL?Pl&sQ lem*re-se de e)ec&tar o
comando S4! S4R.4RO>!P>! O= antes de e)ec&tar a $&no.
DBC Database Company 1
FUNCTION consulta_preco (pCodigo IN VARCHAR2)
RETURN NUMBER
IS
nPreco CURSOS.PRECO%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE( `Incio do programa' );
SELECT preco
INTO nPreco
FROM cursos
WHERE codigo = pCodigo;
DBMS_OUTPUT.PUT_LINE( `Fim do programa com sucesso.
Valor de retorno ser: '||nPreco );
RETURN nPreco;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE( `Fim do programa com
falha' );
RAISE_APPLICATION_ERROR( -20001, `No existe curso
com esse cdigo.');
END;
Sol&es
E$ercFcios '
1. Liste o nome e o stat&s de todas os se&s procedimentos e $&nes.
,. Liste o nome e o tipo de todos os o*+etos com dependAncias diretas da ta*ela P4SSOAS.
0. Liste todas as dependAncias diretas e indiretas da ta*ela P4SSOAS.
4)ec&te o script g&tldtree.s;lg para criar as ta*elas D4P!R44 e #D4P!R44 e o procedimento
D4P!R44H6#LL para o se& &s&%rio.
PreencDa os dados das vises D4P!R44 e #D4P!R44 e)ec&tando o procedimento
D4P!R44H6#LL para a ta*ela P4SSOAS do se& &s&%rio.
9ons&lte a viso D4P!R44.
9ons&lte a viso #D4P!R44.
3. #nvalide o procedimento 9ADAS!RAHP4SSOAQ adicionando &ma col&na cDamada
9OB4=!AR#OQ do tipo .AR9MAR,N1PQ na ta*ela P4SSOAS.
DBC Database Company 11
SELECT object_name, status
FROM user_objects
WHERE object_type IN (`PROCEDURE', `FUNCTION');
SELECT name, type
FROM user_dependencies
WHERE referenced_name = `PESSOAS';
SQL> start utldtree.sql SQL> EXEC DEPTREE_FILL(`TABLE', `PO8', `PESSOAS'); SELECT *
FROM deptree
ORDER BY seq#;
SELECT *
FROM ideptree;
SQL> ALTER TABLE pessoas
2 ADD comentario VARCHAR2(100);
Sol&es
5. 9ons&lte novamente o nome e o stat&s dos procedimentos e $&nes.
7. !ente e)ec&tar o procedimento 9ADAS!AHP4SSOA. O ;&e acontecee
4stando com o stat&s #=.AL#DQ o servidor recompila o procedimento eQ tendo s&cessoQ altera
se& stat&s novamente para .AL#D e o e)ec&ta.
8. 9ons&lte novamente o nome e o stat&s dos procedimentos e $&nes.
DBC Database Company 1,
SELECT object_name, status
FROM user_objects
WHERE object_type IN (`PROCEDURE', `FUNCTION');
SELECT object_name, status
FROM user_objects
WHERE object_type IN (`PROCEDURE', `FUNCTION');
Sol&es
E$ercFcios *
1. 9rie &ma pacGa"e cDamada 4BPR4/ADO. 4ssa pacGa"e deve poss&ir2
>ma $&no pC*lica cDamada 9O=S>L!AH=#.4LHSALAR#ALQ ;&e rece*e como par@metro
o nCmero do empre"ado Ncol&na 4BP=O da ta*ela 4BPP e retorna em ;&e nEvel salarial ele
est% classi$icado Ncol&na /RAD4 da ta*ela SAL/RAD4P.
>m procedimento pC*lico cDamado A!>AL#hAHSALAR#OQ ;&e rece*e como par@metro o
nCmero do empre"ado Ncol&na 4BP=O da ta*ela 4BPP e o novo sal%rio ;&e esse empre"ado
ter%Q e at&aliFa o campo SAL da ta*ela 4BP com esse valor. Antes da at&aliFaoQ por(mQ deve
ser veri$icado se o novo sal%rio est% dentro de al"&m nEvel salarial cadastrado em SAL/RAD4.
Declare &ma vari%vel "lo*al /H4BP=O para armaFenar &m valor default para os par@metros
PH4BP=O da procedure A!>AL#hAHSALAR#O e da $&no
9O=S>L!AH=#.4LHSALAR#AL da pacGa"e.
>m *loco PL/SQL a ser e)ec&tado &ma Cnica veFQ ;&e inicialiFa o valor da vari%vel
/H4BP=O com o maior c'di"o de empre"ado da ta*ela 4BP.
DBC Database Company 10
PACKAGE empregado IS
g_empno emp.empno%TYPE;
FUNCTION consulta_nivel_salarial
(p_empno IN emp.empno%TYPE DEFAULT
g_empno)
RETURN NUMBER;
PROCEDURE atualiza_salario
(p_new_sal IN emp.sal%TYPE,
p_empno IN emp.empno%TYPE DEFAULT
g_empno);
END;
Sol&es
DBC Database Company 13
PACKAGE BODY empregado IS
FUNCTION consulta_nivel_salarial
(p_empno IN emp.empno%TYPE DEFAULT g_empno)
RETURN NUMBER
IS
v_grade salgrade.grade%TYPE;
BEGIN
SELECT s.grade
INTO v_grade
FROM emp e, salgrade s
WHERE e.empno = p_empno
AND e.sal BETWEEN s.losal AND s.hisal;
RETURN(v_grade);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Empregado no
existe');
END;
PROCEDURE atualiza_salario
(p_new_sal IN emp.sal%TYPE,
p_empno IN emp.empno%TYPE DEFAULT g_empno)
IS
v_dummy NUMBER(1);
BEGIN
SELECT 1
INTO v_dummy
FROM salgrade
WHERE p_new_sal BETWEEN losal AND hisal;
UPDATE emp
SET sal = p_new_sal
WHERE empno = p_empno;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Empregado no
existe');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002, 'Novo salrio fora
de qualquer faixa');
END;
Continua...
Sol&es
0. Altere somente o PacGa"e BodI da pacGa"e 4BPR4/ADO. Bostre o stat&s da PacGa"e
Speci$ication e da PacGa"e BodI ap's a alterao da pacGa"e. O ;&e vocA noto&e
O stat&s da pacGa"e speci$ication no ( in$l&enciado pela alterao no pacGa"e *odI. Se
essa alterao no modi$icar a declarao dos ca*ealDos de procedimentos o& $&nesQ
;&e tam*(m aparecem na pacGa"e speci$icationQ ento o pacGa"e *odI ( recriado com
s&cesso.
DBC Database Company 15
...
BEGIN
SELECT MAX(empno)
INTO g_empno
FROM emp;
END;
SELECT SUBSTR(object_name, 1, 30) object_name, status
FROM user_objects
WHERE object_type IN (`PACKAGE',`PACKAGE BODY');
Sol&es
E$ercFcios 8
1. 9rie &ma tri""er de *anco cDamada .AL#DAHD!H>L!HAL!4RA9AO para a ta*ela
#=S9R#9O4S ;&e compareQ antes de ;&al;&er insero de re"istros o& de alterao do campo
D!H>L!#BAHAL!4RA9AOQ a data da Cltima alterao in$ormada e a data de e$etivao da
inscrio Ncampo D!H464!#.AP. Se a da Cltima alterao $or anterior K data de e$etivaoQ
interrompa o processo com &ma mensa"em de erro.
,. 9rie &ma tri""er de *anco para a ta*ela #=S!R>!OR4S cDamada A>D#!AH9>S!OS
para a&ditar todas as m&danas nos valores-Dora dos instr&tores.
9rie &ma ta*ela de a&ditoria cDamada A>D#!OR#AH9>S!OSQ contendo a se"&inte estr&t&ra2
6aa com ;&e a tri""er insira &m re"istro na ta*ela A>D#!OR#AH9>S!OS para cada re"istro
da ta*ela #=S!R>!OR4S ;&e tiver o valor da Dora alteradoQ "&ardando em
.ALORHA=!4R#OR o valor da Dora antes da at&aliFaoQ e em .ALORHPOS!4R#OR o novo
valor de Dora in$ormado.
DBC Database Company 17
CREATE OR REPLACE TRIGGER valida_dt_ult_alteracao
BEFORE INSERT OR UPDATE OF DT_ULTIMA_ALTERACAO
ON inscricoes
FOR EACH ROW
WHEN (new.dt_ultima_alteracao < new.dt_efetiva)
BEGIN
RAISE_APPLICATION_ERROR(-20004, `Data da ultima
alterao no pode ser anterior data de efetivao');
END;
/
CREATE TABLE auditoria_salario
(data DATE,
usuario VARCHAR2(30),
valor_anterior NUMBER(13,2),
valor_posterior NUMBER(13,2))
/
CREATE OR REPLACE TRIGGER audita_mudancas_custo
AFTER UPDATE OF custo_hora_instrutor
ON instrutores
FOR EACH ROW
BEGIN
INSERT INTO auditoria_salario
(data,
usuario,
valor_anterior,
valor_posterior)
VALUES
(SYSDATE,
USER,
:old.custo_hora_instrutor,
:new.custo_hora_instrutor);
END;
/
Sol&es
E$ercFcios 2
1. 9ria a ta*ela P4SSOALQ &sando os se"&intes atri*&tos e tipos de dados2
@ome da =o,una #i(o de Dado Preciso
9odi"o =&merico 7
>ltimoHnome 9aracter 05
9&rric&lo 9LOB -
6oto BLOB -
,. #nsira &m re"istro na ta*ela P4SSOAL. >se a $&no 4BP!\H9LOBNP para o campo
9LOB e o valor =>LL para o campo BLOB.
DBC Database Company 18
CREATE TABLE pessoal
(codigo NUMBER(6),
ultimo_nome VARCHAR2(35),
curriculo CLOB,
foto BLOB)
/
INSERT INTO pessoal
VALUES (10, `Joao', EMPTY_CLOB(), NULL);
Sol&es
0. At&aliFe o re"istro criado anteriormenteQ preencDendo o campo 9LOB do re"istro &sando
PL/SQL N&se &m *loco an1nimoP e a pacGa"e DBBSHLOB.
DBC Database Company 18
DECLARE
lob_locator CLOB;
texto VARCHAR2(2000);
amount NUMBER;
offset INTEGER;
BEGIN
texto := 'Curriculo de JOAO DA SILVA. Contemplando o
perodo de 01/01/80 a ...';
SELECT curriculo
INTO lob_locator
FROM pessoal
WHERE ultimo_nome = 'Joao'
FOR UPDATE;
offset := 1;
amount := length(texto);
DBMS_LOB.WRITE( lob_locator, amount, offset, texto );
END;
/
Sol&es
E$ercFcios 15
1. 9rie &m tipo o*+eto cDamado !#POH.#D4O para representar &ma $ita de vEdeo disponEvel
em &ma locadora. Os atri*&tos so2
<tri1uto #i(o #aman6o
9odi"o =&m(rico 5
!it&lo 9aracter 3
4stado 9aracter 1
DataHDevol&cao Data -
9ate"oria 9aracter 8
Os m(todos so2 LO9ARH6#LB4Q D4.OL.4RH6#LB4Q 9LASS#6#9ARH6#LB4 e
9O=S>L!AH6#LB4.
O estado de &m vEdeo pode ser cD#SPO=#.4LdQ cLO9ADOd o& cR4S4R.ADOd.
9rie o m(todo LO9ARH6#LB4 para modi$icar o estado de &m vEdeo para cLO9ADOd e
determinar a data de devol&oQ passando como par@metro &ma data de devol&o.
9rie o m(todo D4.OL.4RH6#LB4 para limpar a data de devol&o e modi$icar o estado de
&m vEdeo para cD#SPO=#.4Ld.
9rie o m(todo 9LASS#6#9ARH6#LB4 para alterar o campo 9A!4/OR#A de &m vEdeo.
.alores possEveis para a cate"oria so2 cA.4=!>RAdQ c9OB4D#AdQ cS>SP4=S4d e cDRABAd.
Passe como par@metro a cate"oria a classi$icar.
9rie o m(todo 9O=S>L!AH6#LB4 como &ma $&no ;&e retorna &ma string contendo as
in$ormaes so*re &m vEdeo. Determine os nEveis de p&reFa dessa $&no com &ma cDamada de
R4S!R#9!HR464R4=94S ap's s&a declarao de modo ;&e essa $&no possa ser cDamada a
partir de &m comando SQL S4L49!.
DBC Database Company 1:
Sol&es
4speci$icao do tipo o*+eto.
9orpo do tipo o*+eto.
,. 9rie &ma ta*ela de o*+etos tipo vEdeo e insira al"&ns o*+etosQ como os do e)emplo.
=Hdi0o #Ftu,o Estado Data De+o,uo =ate0oria
DBC Database Company ,
CREATE TYPE TIPO_VIDEO AS OBJECT
(codigo NUMBER(5),
titulo VARCHAR2(40),
estado VARCHAR2(10),
data_devolucao DATE,
categoria VARCHAR2(8),
MEMBER PROCEDURE LOCAR_FILME(pData IN DATE),
MEMBER PROCEDURE DEVOLVER_FILME,
MEMBER PROCEDURE CLASSIFICAR_FILME(pCategoria IN VARCHAR2),
MEMBER FUNCTION CONSULTA_FILME RETURN VARCHAR2);
CREATE OR REPLACE TIPO_TYPE BODY VIDEO AS
MEMBER PROCEDURE LOCAR_FILME(pData IN DATE) IS
BEGIN
Estado := `LOCADO';
Data_Devolucao := pData;
END LOCAR_FILME;
MEMBER PROCEDURE DEVOLVER_FILME IS
BEGIN
Estado := `DISPONIVEL';
Data_Devolucao := NULL;
END DEVOLVER_FILME;
MEMBER PROCEDURE CLASSIFICAR_FILME(pCategoria IN VARCHAR2) IS
BEGIN
Categoria := pCategoria;
END CLASSIFICAR_FILME;
MEMBER FUNCTION CONSULTA_FILME RETURN VARCHAR2 IS
cFrase VARCHAR2(80);
BEGIN
cFrase := codigo||'-`||titulo||'(`||categoria||'): `||estado;
IF estado = `LOCADO' THEN
cFrase := cFrase || ` - locado at `||data_devolucao;
END IF;
RETURN(cFrase);
END CONSULTA_FILME;
END;
Sol&es
11 Poeira em Alto Bar D#SPO=#.4L in&lla 9OB4D#A
,1: A RocDa R4S4R.ADO in&lla A.4=!>RA
155 Barrados no SDoppin" LO9ADO 1,-BAR-, 9OB4D#A
0. 9rie &m procedimento para alocar &m video. O procedimento deve rece*er como
par@metro o c'di"o do video e deve m&dar se& estado para cLO9ADOd apenas se ele estiver
at&almente disponEvel. Se o $ilme no estiver disponEvelQ mostre as in$ormaes so*re o vEdeo
$ornecidas pelo m(todo 9O=S>L!AH.#D4O. >ma locao d&ra &m dia.
DBC Database Company ,1
SQL> CREATE TABLE videos OF tipo_video;
Table created.
SQL> INSERT INTO videos VALUES
2 (tipo_video(101, `Poeira em Alto Mar',
3 `DISPONIVEL', NULL,
`COMEDIA'));
1 row inserted.
SQL> INSERT ...
SQL> COMMIT;
PROCEDURE aloca_filme_disponivel (p_video IN NUMBER) IS
ob_video tipo_video;
BEGIN
SELECT VALUE(v)
INTO ob_video
FROM videos v
WHERE codigo = p_video;
IF ob_video.estado != `DISPONIVEL' THEN
DBMS_OUTPUT.PUT_LINE( ob_video.consulta_filme() );
ELSE
ob_video.locar_filme(SYSDATE+1);
UPDATE videos v
SET v := ob_video
WHERE codigo = p_video;
END IF;
END;