Post on 24-Feb-2018
7/25/2019 MEGA GUIA DE PL SQL
1/73
PL /SQL
SQL es un lenguaje de consulta para los sistemas de bases de datosrelacinales, pero que no posee la potencia de los lenguajes de programacin.
Para abordar el presente tutorial con mnimo de garantas es necesarioconocer previamente SQL.
Podemos acceder a un completo tutorial de SQL desde AQUI.
PL/SQL amplia SQL con los elementos caractersticos de los lenguajes deprogramacin, variables, sentencias de control de flujo, bucles ...
Cuando se desea realiar una aplicacin completa para el manejo de unabase de datos relacional, resulta necesario utiliar alguna !erramienta quesoporte la capacidad de consulta del SQL " la versatilidad de los lenguajes de
programacin tradicionales. PL/SQL es el lenguaje de programacin queproporciona Oraclepara e#tender el SQL est$ndar con otro tipo deinstrucciones.
Que vamos a necesitar?
Para poder seguir este tutorial correctamente necesitaremos tener lossiguientes elementos%
&na instancia de '()CL* +i o superior funcionando correctamente. erramientas cliente de '()CL*, en particular SQL-Plus para poder
ejecutar los ejemplo. aber configurado correctamente una cone#in a '()CL*.
Introduccin
SQL es un lenguaje de consulta para los sistemas de bases de datosrelacinales, pero que no posee la potencia de los lenguajes de programacin.o permite el uso de variables, estructuras de control de flujo, bucles " dem$selementos caractersticos de la programacin. o es de e#traar, SQL es unlenguaje de consulta no un lenguaje de programacin.
Sin embargo, SQL es la !erramienta ideal para trabajar con bases dedatos. Cuando se desea realiar una aplicacin completa para el manejo deuna base de datos relacional, resulta necesario utiliar alguna !erramienta quesoporte la capacidad de consulta del SQL " la versatilidad de los lenguajes deprogramacin tradicionales. PL/SQL es el lenguaje de programacin queproporciona 'racle para e#tender el SQL est$ndar con otro tipo deinstrucciones " elementos propios de los lenguajes de programacin.
http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=8http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=87/25/2019 MEGA GUIA DE PL SQL
2/73
Con PL/SQL vamos a poder programar las unidades de programa de la basede datos '()CL*, est$n son%
Procedimientos almacenados 0unciones 1riggers Scripts
Pero adem$s PL/SQL nos permite realiar programas sobre las siguientes!erramientas de '()CL*%
'racle 0orms 'racle (eports 'racle 2rap!ics 'racle )plication Server
Primeros pasos con PL/SQL
Para programar en PL/SQL es necesario conocer sus fundamentos.
Como introduccin vamos a ver algunos elementos " conceptos b$sicos dellenguaje.
PL/SQL no es C)S*3S*S4145*, es decir, no diferencia ma"6sculas de
min6sculas como otros lenguajes de programacin como C o 7ava.Sinem!argo de!emos recordar "ue O#A$L% es $AS%&S%'SI(I)% en las!*s"uedas de te+to.
&na lnea en PL/SQL contiene grupos de caracteres conocidos como&48)8*S L*94C)S, que pueden ser clasificadas como%
o 8*L4:41)8'(*So 48*1404C)8'(*So L41*()L*So C':*1)(4'So *9P(*S4'*So
8*L4:41)8'(% *s un smbolo simple o compuesto que tiene una funcinespecial en PL/SQL. *stos pueden ser%
o 'peradores )ritm;ticoso 'peradores Lgicoso 'peradores (elacionaleso
48*1404C)8'(% Son empleados para nombrar objetos de programas en
PL/SQL as como a unidades dentro del mismo, estas unidades " objetosinclu"en%
7/25/2019 MEGA GUIA DE PL SQL
3/73
o Constanteso Cursoreso 5ariableso Subprogramaso *#cepcioneso Paquetes
L41*()L%*s un valor de tipo num;rico, car$cter, cadena o lgico norepresentado por un identificador de ellas decimales. *s decir, BE enteros" dos decimales -/
$A# GG " cu"o valor de longitud por default es B
7/25/2019 MEGA GUIA DE PL SQL
4/73
33 C)( @I
posiciones -/
)A#$A#
7/25/2019 MEGA GUIA DE PL SQL
5/73
Sint6+is
dec7p e8
La precisin m$#ima es
de F+ dgitos.
La precisin m$#ima es
de F+ dgitos.
8onde pes laprecisin " ela escala.Por ejemplo9dec dgitos antesdel decimal " un dgitodespu;s del decimal.
decimal7pe8
La precisin m$#ima esde F+ dgitos.
La precisin m$#ima esde F+ dgitos.
8onde pes laprecisin " ela escala.Porejemplo9decimal dgitos antesdel decimal " un dgito
despu;s del decimal.dou!leprecision
:loat
int
integer
numeric7pe8
La precisin m$#ima esde F+ dgitos.
La precisin m$#ima esde F+ dgitos.
8onde pes laprecisin " ela escala.
Porejemplo9numeric=es un n6mero quetiene J dgitos antesdel decimal " > dgitosdespu;s del decimal.
num!er7pe8
La precisin m$#ima esde F+ dgitos.
La precisin m$#ima esde F+ dgitos.
8onde pes laprecisin " ela escala.Porejemplo9number=es un n6mero quetiene J dgitos antesdel decimal " > dgitosdespu;s del decimal.
real
smallint
c;ar7tamaGG b"tes enPLSQL.asta >III b"tes en
'racle +i.
asta F>GG b"tes enPLSQL.asta >III b"tes en
'racle Ki.
8onde tama
7/25/2019 MEGA GUIA DE PL SQL
6/73
varc;ar7tamaGG b"tes enPLSQL.asta EIII b"tes en'racle +i.
asta F>GG b"tes enPLSQL.asta EIII b"tes en'racle Ki.
8onde tama gigab"tes. asta > gigab"tes.Son cadenas de anc!ovariable.
ra=
asta F>GG b"tes enPLSQL.asta >III b"tes en'racle +i.
asta F>GG b"tes enPLSQL.asta >III b"tes en'racle Ki.
Son cadenas binariasde anc!o variable.
long ra= asta > gigab"tes. asta > gigab"tes.Son cadenas binariasde anc!o variable.
date
&na fec!a entre el B de
*nero de EGB> ).C. " elFB de 8iciembre de KKKK8.C.
&na fec!a entre el B de
*nero de EGB> ).C. " elFB de 8iciembre de KKKK8.C.
timestamp7fractionalsecondsprecision8
o soportado por 'racle+i.
:ractional secondsprecisiondebe ser unn6mero entre I " K.
7/25/2019 MEGA GUIA DE PL SQL
7/73
da 7dayprecision8to second7fractional
secondsprecision8
+i.
un n6mero entre I " K.=:ractional secondsprecisiondebe ser un
n6mero entre I " K.
7/25/2019 MEGA GUIA DE PL SQL
8/73
apuntan a un granobjeto LS decaracteres dentro de labase de datos.
Operadores en PL/SQL
La siguiente tabla ilustra los operadores de PL/SQL.
(ipo de operador Operadores
Operador deasignacin
%M
7/25/2019 MEGA GUIA DE PL SQL
9/73
33 4nstrucciones%'0ICD
&n aspecto a tener en cuenta es que la instruccin condicional anidada
es ELSIF" no "ELSEIF".
Sentencia DO(O
PL/SQL dispone de la sentencia 2'1'. La sentencia 2'1' desva el flujode ejecucin a una determinada etiqueta.
*n PL/SQL las etiquetas se indican del siguiente modo% OO etiqueta
*l siguiente ejemplo ilustra el uso de 2'1'.
0%$LA#% flag 'U,-%#D-%DI' flag %MB D IC
7/25/2019 MEGA GUIA DE PL SQL
10/73
*l bucle 3IL% se repite mientras que se cumpla exre!ion.
3IL%
7/25/2019 MEGA GUIA DE PL SQL
11/73
Cada una de las partes anteriores se delimita por una palabra reservada, demodo que un bloque PL/SQL se puede representar como sigue%
@ declare F is F as
/-Parte declarativa-/!egin
/-Parte de ejecucion-/@ e+ception
/-Parte de e#cepciones-/endG
8e las anteriores partes, 6nicamente la seccin de ejecucin es obligatoria,que quedara delimitada entre las cl$usulas -%DI'"%'0. 5eamos un ejemplode bloque PL/SQL mu" gen;rico. Se trata de un bloque annimos, es decir no
lo identifica ning6n nombre. Los bloques annimos identifican su partedeclarativa con la palabra reservada 0%$LA#%.
0%$LA#%/-Parte declarativa-/nombreHvariable 0A(%D
-%DI'/-Parte de ejecucion
- *ste cdigo asigna el valor de la columna TnombreHcolumnaT- a la variable identificada por TnombreHvariableT
-/S%L%$(SUS8)1*I'(OnombreHvariableC#O,8&)LD
%E$%P(IO'/-Parte de e#cepciones-/3%' O(%#S (%'d!msHoutput.putHline7Se ;a producido un error8D
%'0G
) continuacin vamos a ver cada una de estas secciones
Seccin de 0eclaracin de )aria!les
*n esta parte se declaran las variables que va a necesitar nuestro programa.&na variable se declara asignandole un nombre o TidentificadorT seguido deltipo de valor que puede contener. 1ambi;n se declaran cursores, de granutilidad para la consulta de datos, " e#cepciones definidas por el usuario.1ambi;n podemos especificar si se trata de una constante, si puede contenervalor nulo " asignar un valor inicial.
La sinta#is gen;rica para la declaracin de constantes " variables es%
7/25/2019 MEGA GUIA DE PL SQL
12/73
nombreHvariable @$O'S(A'(A #tio$dato%@'O( 'ULLA@%MvalorHinicialA
donde%
tipoHdato% es el tipo de dato que va a poder almacenar la variable, estepuede ser cualquiera de los tipos soport$ndoos por '()CL*, esdecir 'U,-%#, 0A(%, $A#, )A#$A#)A#$A#-OOL%A' ...)dem$s para algunos tipos de datos
7/25/2019 MEGA GUIA DE PL SQL
13/73
la tabla tablaHempleados identificada por vHnombre " no se le asigna ning6n valor -/
vHnombre tablaHempleados.nombre1(2P%D
/-Se declara la variable del tipo registro correspondiente a unsupuesto cursor, llamado micursor, identificada por regHdatos-/ regHdatos micursor1#O3(2P%D
-%DI'/-Parte de ejecucion-/
%E$%P(IO'/-Parte de e#cepciones-/
%'0G
*structura de un subprograma%
$#%A(% P#O$%0U#% simpleHprocedureIS
/- Se declara la variable de tipo 5)(C)(>
7/25/2019 MEGA GUIA DE PL SQL
14/73
Introduccin a cursores PL/SQL
PL/SQL utilia cursores para gestionar las instrucciones S%L%$(. &n cursores un conjunto de registros devuelto por una instruccin SQL. 1;cnicamentelos cursores son fragmentos de memoria que reservados para procesar los
resultados de una consulta S%L%$(.
Podemos distinguir dos tipos de cursores%
$ursores implJcitos. *ste tipo de cursores se utilia paraoperaciones S%L%$( I'(O. Se usan cuando la consulta devuelve un 6nicoregistro.
$ursores e+plJcitos. Son los cursores que son declarados "controlados por el programador. Se utilian cuando la consulta devuelve unconjunto de registros. 'casionalmente tambi;n se utilian en consultas quedevuelven un 6nico registro por raones de eficiencia. Son m$s r$pidos.
&n cursor se define como cualquier otra variable de PL/SQL " debenombrarse de acuerdo a los mismos convenios que cualquier otra variable. Loscursores implcitos no necesitan declaracin
*l siguiente ejemplo declara un cursor e#plicito%
declarecursorcHpaises is
S%L%$(C'HP)4S, 8*SC(4PC4' C#O,P)4S*SD!egin&' Sentencia! del bloque ...'&endD
Para procesar instrucciones S*L*C1 que devuelvan m$s de una fila, sonnecesarios cursores e#plcitos combinados con un estructura de bloque.
&n cursor admite el uso de par$metros. Los par$metros deben declararse
junto con el cursor.
*l siguiente ejemplo muestra la declaracin de un cursor con un par$metro,identificado por pHcontinente.
declarecursorcHpaises
7/25/2019 MEGA GUIA DE PL SQL
15/73
&' Sentencia! del bloque ...'&endD
*l siguiente diagrama representa como se procesa una instruccin SQL a
trav;s de un cursor.
0ases para procesar una instruccin SQL
$ursores ImplJcitos
0eclaracin de cursores implJcitos.
Los cursores implcitos se utilian para realiar consultas S%L%$( quedevuelven un 6nico registro.
8eben tenerse en cuenta los siguientes puntos cuando se utilian cursoresimplcitos%
Con cada cursor implcito debe e#istir la palabra clave I'(O. Las variables que reciben los datos devueltos por el cursor tienen que
contener el mismo tipo de dato que las columnas de la tabla. Los cursores implcitos solo pueden devolver una 6nica fila. *n caso de
que se devuelva m$s de una fila
7/25/2019 MEGA GUIA DE PL SQL
16/73
dbmsHoutput.putHline
7/25/2019 MEGA GUIA DE PL SQL
17/73
1ambi;n debemos declarar los posibles par$metros que requiera el cursor%
$U#SO#nombre_cursor*aram+ tio+, ..., aramN tioN-IS in!truccin$SELEC)
Para abrir el cursor
OP%' nombre_cursor o bien
7/25/2019 MEGA GUIA DE PL SQL
18/73
0%$LA#%$U#SO#cpaisesIS
S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD
registro cpaisesX#O3(2P%D
-%DI' OP%'cpaisesD C%($cpaises I'(OregistroD $LOS%cpaisesD%'0D
*l mismo ejemplo, pero utiliando par$metros%
7/25/2019 MEGA GUIA DE PL SQL
19/73
0%$LA#%$U#SO#cpaises
7/25/2019 MEGA GUIA DE PL SQL
20/73
Atri!utos de cursores
1oman los valores 1(&*, 0)LS* o &LL dependiendo de la situacin%
Atri!uto Antes de a!rir Al a!rir 0urante la recuperacinAl :inali>ar la recuperacin 0espuBs de cerrar
1'O(COU'0 '()3BIIB &LL 0)LS* 1(&* '()3BIIB1COU'0 '()3BIIB &LL 1(&* 0)LS* '()3BIIB
1ISOP%' 0)LS* 1(&* 1(&* 1(&* 0)LS*1#O3$OU'( '()3BIIB I - -- '()3BIIB
- 6mero de registros que !a recuperado !asta el momento -- 6mero de total de registros
,anejo del cursor
Por medio de ciclo L''P podemos iterar a trav;s del cursor. 8ebe tenerse cuidado de agregar una condicin para salir delbucle%
7/25/2019 MEGA GUIA DE PL SQL
21/73
5amos a ver varias formas de iterar a trav;s de un cursor. La primera esutiliando un bucle L''P con una sentencia *941 condicionada%
OP%'nombreHcursorD
LOOP C%($nombreHcursor I'(OlistaHvariablesD %EI(3%'nombreHcursorX'O(COU'0D /- Procesamiento de los registros recuperados -/ %'0 LOOPD $LOS%nombreHcursorD
)plicada a nuestro ejemplo anterior%
0%$LA#%$U#SO#cpaisesIS
S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O, P)4S*SD
coHpais )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
22/73
3IL% nombreHcursorXCOU'0LOOP
/- Procesamiento de los registros recuperados -/ C%($nombreHcursor I'(OlistaHvariablesD %'0 LOOPD
$LOS%nombreHcursorD
Por 6ltimo podemos usar un bucle 0'( L''P. *s la forma m$s corta "a queel cursor es implcitamente se ejecutan las instrucciones 'P*, 0*C1 "CL'S*.
CO#variable I'nombreHcursor LOOP /- Procesamiento de los registros recuperados -/ %'0 LOOPD
-%DI' CO#(*2 I'
7/25/2019 MEGA GUIA DE PL SQL
23/73
1ambi;n debemos declarar los posibles parametros que requiera el cursor%
$U#SO#nombre_cursor*aram+ tio+, ..., aramN tioN-IS in!truccin$SELEC)
Para abrir el cursor
OP%' nombre_cursor o bien
7/25/2019 MEGA GUIA DE PL SQL
24/73
Podemos simplificar el ejemplo utiliando el atributo detipo 1#O3(2P%sobre el cursor.
0%$LA#%$U#SO#cpaisesIS
S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD
registro cpaisesX#O3(2P%D
-%DI' OP%'cpaisesD C%($cpaises I'(OregistroD $LOS%cpaisesD%'0D
*l mismo ejemplo, pero utiliando par$metros%
0%$LA#%$U#SO#cpaises
7/25/2019 MEGA GUIA DE PL SQL
25/73
Atri!uto Antes de a!rir Al a!rir 0urante la recuperacinAl :inali>ar la recuperacin 0espuBs de cerrar
1'O(COU'0 '()3BIIB &LL 0)LS* 1(&* '()3BIIB1COU'0 '()3BIIB &LL 1(&* 0)LS* '()3BIIB1ISOP%' 0)LS* 1(&* 1(&* 1(&* 0)LS*1#O3$OU'( '()3BIIB I - -- '()3BIIB
- 6mero de registros que !a recuperado !asta el momento -- 6mero de total de registros
,anejo del cursor
Por medio de ciclo L''P podemos iterar a trav;s del cursor. 8ebe tenerse cuidado de agregar una condicin para salir delbucle%
5amos a ver varias formas de iterar a trav;s de un cursor. La primera es utiliando un bucle L''P con una sentencia *941condicionada%
OP%'nombreHcursorD
LOOP
C%($nombreHcursor I'(OlistaHvariablesD %EI(3%'nombreHcursorX'O(COU'0D /- Procesamiento de los registros recuperados -/ %'0 LOOPD $LOS%nombreHcursorD
)plicada a nuestro ejemplo anterior%
7/25/2019 MEGA GUIA DE PL SQL
26/73
0%$LA#%$U#SO#cpaisesIS
S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O, P)4S*SD
coHpais )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
27/73
'tra forma es por medio de un bucle 4L* L''P. La instruccin 0*C1aparece dos veces.
OP%'nombreHcursorD
C%($nombreHcursor I'(OlistaHvariablesD 3IL% nombreHcursorXCOU'0
LOOP /- Procesamiento de los registros recuperados -/ C%($nombreHcursor I'(OlistaHvariablesD %'0 LOOPD $LOS%nombreHcursorD
0%$LA#%$U#SO#cpaisesIS
S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD
coHpais )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
28/73
-%DI' CO#(*2 I'
7/25/2019 MEGA GUIA DE PL SQL
29/73
%'0D
Como "a !emos dic!o cuando ocurre un error, se ejecuta el
bloque %E$%P(IO', transfiri;ndose el control a las sentencias del bloque. &nave finaliada la ejecucin del bloque de %E$%P(IO' no se contin6aejecutando el bloque anterior.
Si e#iste un bloque de e#cepcin apropiado para el tipo de e#cepcin seejecuta dic!o bloque. Si no e#iste un bloque de control de e#cepcionesadecuado al tipo de e#cepcin se ejecutar$ el bloque de e#cepcin 3%'O(%#S (%'
7/25/2019 MEGA GUIA DE PL SQL
30/73
A$$%SSHI'(OH'ULL*l programa intent asignar valoresa los atributos de un objeto noinicialiado
3JFI
$OLL%$(IO'HISH'ULL*l programa intent asignar valoresa una tabla anidada a6n no
inicialiada
3JFB
$U#SO#HAL#%A02HOP%'
*l programa intent abrir un cursorque "a se encontraba abierto.(ecuerde que un cursor de ciclo0'( autom$ticamente lo abre " ellono se debe especificar con lasentencia 'P*
3JBB
0UPH)ALHO'HI'0%E
*l programa intent almacenarvalores duplicados en una columnaque se mantiene con restriccin deintegridad de un ndice 6nico
P#OD#A,H%##O# PL/SQL tiene un problema interno 3JIB
#O3(2P%H,IS,A($
Los elementos de una asignacin
7/25/2019 MEGA GUIA DE PL SQL
31/73
en una posicin m$s grande que eln6mero real de elementos de lacoleccin
SU-S$#IP(HOU(SI0%HLI,I(
*l programa est$ referenciando unelemento de un arreglo utiliando
un n6mero fuera del rangopermitido
S2SHI')ALI0H#O3I0
La conversin de una cadena decaracteres !acia un tipo roid fallporque la cadena no representa unn6mero
3BEBI
(I,%OU(HO'H#%SOU#$%Se e#cedi el tiempo m$#imo deespera por un recurso en 'racle
3JB
(OOH,A'2H#O3S&na sentencia S*L*C1 41'
devuelve m$s de una fila
3BE>>
)ALU%H%##O#
'curri un error aritm;tico, deconversin o truncamiento. Porejemplo, sucede cuando se intentacalar un valor mu" grande dentrode una variable m$s pequea
3JI>
K%#OH0I)I0%*l programa intent efectuar unadivisin por cero
3BEG
%+cepciones de:inidas por el usuario
PL/SQL permite al usuario definir sus propias e#cepciones, las que deber$nser declaradas " lanadas e#plcitamente utiliando la sentencia #AIS%.
Las e#cepciones deben ser declaradas en el segmento 0%$LA#%de unbloque, subprograma o paquete. Se declara una e#cepcin como cualquier otravariable, asign$ndole el tipo %E$%P(IO'. Las mismas reglas de alcanceaplican tanto sobre variables como sobre las e#cepciones.
0%$LA#%
33 8eclaraciones :"*#cepcion %E$%P(IO'D-%DI' 33 *jecucion%E$%P(IO' 33 *#cepcion%'0D
#eglas de Alcance
&na e#cepcin es v$lida dentro de su $mbito de alcance, es decir el bloque oprograma donde !a sido declarada. Las e#cepciones predefinidas son siemprev$lidas.
7/25/2019 MEGA GUIA DE PL SQL
32/73
Como las variables, una e#cepcin declarada en un bloque es local a esebloque " global a todos los sub3bloques que comprende.
La sentencia #AIS%
La sentencia #AIS%permite lanar una e#cepcin en forma e#plcita.*s posible utiliar esta sentencia en cualquier lugar que se encuentre dentrodel alcance de la e#cepcin.
0%$LA#%33 8eclaramos una e#cepcion identificada por 5)L'(H*2)145'
5)L'(H*2)145' %E$%P(IO'D
valor 'U,-%#D-%DI' 33 *jecucion
valor %M 3BD
ICvalor O I(%'
#AIS%5)L'(H*2)145'D
%'0 ICG
%E$%P(IO' 33 *#cepcion
3%' )ALO#H'%DA(I)O(%'
dbmsHoutput.putHline
7/25/2019 MEGA GUIA DE PL SQL
33/73
)l manejar una e#cepcin es posible usar las funcionespredefinidas SQL$ode" SQL%##, para aclarar al usuario la situacin deerror acontecida.
SQLcodedevuelve el n6mero del error de 'racle " un I
7/25/2019 MEGA GUIA DE PL SQL
34/73
#AIS%HAPPLI$A(IO'H%##O#
*n ocasiones queremos enviar un mensaje de error personaliado alproducirse una e#cepcin PL/SQL.Para ello es necesario utiliar la instruccion #AIS%HAPPLI$A(IO'H%##O# D
La sinta#is general es la siguiente%
#AIS%HAPPLI$A(IO'H%##O#IIIB " 3>IKKK. mensaje la descripcion del error.
0%$LA#% vHdiv 'U,-%#D-%DI'
S%L%$(B/I I'(OvHdiv C#O,8&)LD%E$%P(IO'
3%'O(%#S(%' #AIS%HAPPLI$A(IO'H%##O#IIIB,Ro se puede dividir por ceroR=D%'0D
Propagacin de e+cepciones en PL/SQL
&na de las caractersticas m$s interesantes de la e#cepciones es lapropagacin de e#cepciones.
Cuando se lana una e#cepcin, el control se transfiere !asta laseccin %E$%P(IO'del bloque donde se !a producido la e#cepcin. *ntoncesse busca un manejador v$lido de la e#cepcin
7/25/2019 MEGA GUIA DE PL SQL
35/73
CU'$(IO'fnHfec!a #%(U#'0A(% IS fec!a 0A(%D -%DI' S%L%$(S2S0A(%I'(Ofec!a
C#O,8&)L 3%#%BM>D #%(U#'fec!aD %E$%P(IO'
3%'K%#OH0I)I0%(%'dbmsHoutput.putHline
7/25/2019 MEGA GUIA DE PL SQL
36/73
Procedimientos almacenados
&n procedimiento es un subprograma que ejecuta una accin especfica "que no devuelve ning6n valor. &n procedimiento tiene un nombre, un conjuntode par$metros
7/25/2019 MEGA GUIA DE PL SQL
37/73
1ambi;n podemos asignar un valor por defecto a los par$metros, utiliandola cl$usula 0%CAUL( o el operador de asignacin aHSaldoIIJIB,neHsaldo M >JII=D
$O,,I(G
%'0D
7/25/2019 MEGA GUIA DE PL SQL
38/73
Cunciones en PL/SQL
&na funcin es un subprograma que devuelve un valor.
La sinta#is para construir funciones es la siguiente%
$#%A(% @'( #%PLA$%CU'$(IO'#n$name%0
7/25/2019 MEGA GUIA DE PL SQL
39/73
&na ve creada " compilada la funcin podemos ejecutarla de la siguienteforma%
0%$LA#%
5alor 'U,-%#D-%DI'
5alor %M:nHO!tenerHPrecio, ..., col @'(0%L%(%FI'S%#(FUP0A(% @OC colB, col>, ..., col...O' #nombre$tabla%@CO# %A$ #O3 @3%' 7
7/25/2019 MEGA GUIA DE PL SQL
40/73
*l uso de '( (*PL)C* permite sobrescribir un trigger e#istente. Si seomite, " el trigger e#iste, se producir$, un error.
Los triggers pueden definirse para las operaciones 4S*(1, &P8)1* o8*L*1*, " pueden ejecutarse antes o despu;s de la operacin. *l
modificador ?*0'(* )01*( indica que el trigger se ejecutar$ antes o despu;sde ejecutarse la sentencia SQL definida por 8*L*1* 4S*(1 &P8)1*. Siincluimos el modificador '0 el trigger solo se ejecutar$ cuando la sentenciaSQL afecte a los campos incluidos en la lista.
*l alcance de los disparadores puede ser la fila o de orden. *l modificador0'( *)C (' indica que el trigger se disparar$ cada ve que se realianoperaciones sobre una fila de la tabla. Si se acompaa del modificador *,se establece una restriccinD el trigger solo actuar$, sobre las filas quesatisfagan la restriccin.
La siguiente tabla resume los contenidos anteriores.
)alor 0escripcinI'S%#( 0%L%(% UP0A(%
8efine qu; tipo de orden 8:L provoca la activacin deldisparador.
-%CO#% AC(%#8efine si el disparador se activa antes o despu;s deque se ejecute la orden.
CO# %A$ #O3
Los disparadores con nivel de fila se activan una vepor cada fila afectada por la orden que provoc eldisparo. Los disparadores con nivel de orden seactivan slo una ve, antes o despu;s de la orden. Losdisparadores con nivel de fila se identifican por lacl$usula 0'( *)C (' en la definicin del
disparador.
La cl$usula * slo es v$lida para los disparadores con nivel de fila.
8entro del $mbito de un trigger disponemos de las variables 'L8 "* . *stas variables se utilian del mismo modo que cualquier otra variablePL/SQL, con la salvedad de que no es necesario declararlas,son detipo1#O3(2P% " contienen una copia del registro antes
7/25/2019 MEGA GUIA DE PL SQL
41/73
*l siguiente ejemplo muestra un trigger que inserta un registro en la tablaP(*C4'SHP('8&C1'S cada ve que insertamos un nuevo registro en latabla P('8&1'S%
$#%A(% O# #%PLA$% (#IDD%#1(HP('8&C1'SHIB AC(%# I'S%#( O'P('8&C1'S
CO# %A$ #O30%$LA#% 33 local variables-%DI' I'S%#( I'(OP(*C4'SHP('8&C1'S
7/25/2019 MEGA GUIA DE PL SQL
42/73
#estricciones de los triggers
*l cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legalen un bloque PL/SQL, es legal en el cuerpo de un disparador, con lassiguientes restricciones%
&n disparador no puede emitir ninguna orden de control detransacciones% $O,,I(, #OLL-A$o SA)%POI'(. *l disparador seactiva como parte de la ejecucin de la orden que provoc el disparo, "forma parte de la misma transaccin que dic!a orden. Cuando la ordenque provoca el disparo es confirmada o cancelada, se confirma ocancela tambi;n el trabajo realiado por el disparador.
Por raones id;nticas, ning6n procedimiento o funcin llamado por eldisparador puede emitir rdenes de control de transacciones.
*l cuerpo del disparador no puede contener ninguna declaracin devariables L'2 o L'2 ().
Utili>acin de 9OL0 9'%3
8entro del $mbito de un trigger disponemos de las variables 'L8 "* . *stas variables se utilian del mismo modo que cualquier otra variable
PL/SQL, con la salvedad de que no es necesario declararlas,son detipo1#O3(2P% " contienen una copia del registro antes
7/25/2019 MEGA GUIA DE PL SQL
43/73
Utili>acin de predicados de los triggers9 I'S%#(I'D UP0A(I'D 0%L%(I'D
8entro de un disparador en el que se disparan distintos tipos de rdenes8:L D returnresultD %'0fnHmultiplicaH#>D-%DI' CO#id# I'B..BI LOOP
dbmsHoutput.putHline
7/25/2019 MEGA GUIA DE PL SQL
44/73
%'0 LOOPD%'0D
otese que se utilia la funcion 1'HC)( para convertir el resultado de lafuncin fnHmultiplicaH#>
7/25/2019 MEGA GUIA DE PL SQL
45/73
%'0O2gNameD
*l cuerpo el la implementacin del paquete. *l cuerpo del paquete debeimplementar lo que se declar inicialmente en la especificacin. *s el donde
debemos escribir el cdigo de los subprogramas. *n el cuerpo de un pac`agepodemos declarar nuevos subprogramas " tipos, pero estos ser$n privadospara el propio pac`age.
La sinta#is general para crear el cuerpo de un paquete es mu" parecida a lade la especificacin, tan solo se aade la palabra clave -O02, " s eimplementa el cdigo de los subprogramas.
$#%A(%@'( #%PLA$%A PA$AD% -O02O2gNameIS
33 8eclaraciones de tipos " registros privados
^@(2P%O)(eName ISO3atat(eDA_
33 8eclaraciones de variables " constantes privadas 33 1ambi;n podemos declarar cursores ^@OCon!tantName $O'S(A'(O3atat(e %M OvalorDA_
^@O4ariableName O3atat(eDA_ 33 4mplementacion de procedimientos " funciones
CU'$(IO'OFunctionName
7/25/2019 MEGA GUIA DE PL SQL
46/73
$#%A(% O# #%PLA$% PA$AD%PDH$O'(A-ILI0A0IS
33 8eclaraciones de tipos " registros p6blicas
(2P%CuentaHcontable IS #%$O#0 < codigoHcuenta )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
47/73
-%DI' OP%'c8atos
7/25/2019 MEGA GUIA DE PL SQL
48/73
=D
*l siguiente ejemplo crea un tipo P)4S, que tiene como campos el cdigo, elnombre " el continente.
(2P%P)4S IS #%$O#0JFI BI >III B>FEJG+KIRD cta8estino %M R>JF> BI >IBI IK+GJEF>BRD UP0A(%C&*1)S S%(S)L8' M S)L8' 3 importe 3%#%C&*1) M cta'rigenD UP0A(%C&*1)S S%(S)L8' M S)L8' N importe 3%#%C&*1) M cta8estinoD I'S%#(I'(O:'54:4*1'S
7/25/2019 MEGA GUIA DE PL SQL
60/73
PL/SQL permite marcar un bloque con P#AD,AAU(O'O,OUSH(#A'SA$(IO' . Con esta directiva marcamos elsubprograma para que se comporte como transaccin diferente a la delproceso principal, llevando el control de $O,,I(o #OLL-A$independiente.
'bs;rvese el siguiente ejemplo. Primero creamos un procedimiento " lomarcamos con P#AD,A AU(O'O,OUSH(#A'SA$(IO'.
$#%A(% O# #%PLA$% P#O$%0U#%2rabarHLog
7/25/2019 MEGA GUIA DE PL SQL
61/73
SQL 0in6mico
Sentencias 0,L con SQL din6mico
PL/SQL ofrece la posibilidad de ejecutar sentencias SQL a partir de cadenas
de caracteres. Para ello debemos emplear la instruccin %E%$U(%I,,%0IA(%.
Podemos obtener informacin acerca de n6mero de filas afectadas por lainstruccin ejecutada por %E%EU(% I,,%0IA(% utiliando SQL1#O3$OU'(.
*l siguiente ejemplo muestra la ejecucin de un comando SQL din$mico.
0%$LA#% ret 'U,-%#D CU'$(IO'fnHe#ecute #%(U#' 'U,-%# IS sqlHstr )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
62/73
%E%$U(% I,,%0IA(%sqlHstr USI'Dnombre, codigoD#%(U#' SQL1#O3$OU'(D
%'0fnHe#ecute D-%DI' ret %M fnHe#ecute
7/25/2019 MEGA GUIA DE PL SQL
63/73
Las varibles !ost tambi;n se pueden utiliar en los cursores.
0%$LA#% (2P%curHt"p IS #%C $U#SO#D
cHcursor $U#H(2PD fila P)4S*S1#O3(2P%D vHquer" )A#$A#JJ=D codigoHpais )A#$A#
7/25/2019 MEGA GUIA DE PL SQL
64/73
')L
7/25/2019 MEGA GUIA DE PL SQL
65/73
S%L%$( (OH0A(%/>IIR, R88/::/UUUUR=C#O,8&)LD
*ste otro ejemplo muestra la conversin con formato de da " !ora.
S%L%$( (OH0A(%/>II >F%JK%JKR, R88/::/UUUU >E%:4%SSR=C#O,8&)LD
(OH$A#
Convierte una e#presin al tipo C)(. *l par$metro opcional formato indicael formato de salida de la e#presin.
(OH$A#
7/25/2019 MEGA GUIA DE PL SQL
66/73
Si el par$metro es un n6mero devuelve la parte entera.
S%L%$((#U'$
7/25/2019 MEGA GUIA DE PL SQL
67/73
'btiene una parte de una e#presin, desde una posicin de inicio !asta unadeterminada longitud.
SU-S(#
7/25/2019 MEGA GUIA DE PL SQL
68/73
S%L%$(#PA0
7/25/2019 MEGA GUIA DE PL SQL
69/73
,O0I/BJC#O, 8&)L
Secuencias
'()CL* proporciona los objetos de secuencia para la generacin decdigos num;ricos autom$ticos.
Las secuencias son una solucin f$cil " elegante al problema de los cdigosautogenerados.
L) sinta#is general es la siguiente%
$#%A(% S%QU%'$%#!ecuence$name%@,I')ALU%Omin$valA@,AE)ALU%#max$val%1@S(A#( 3I(#ini$val%1@I'$#%,%'( -2#inc$val%1@'O$A$% $A$%#cache$val%1@$2$L%A
@O#0%#AD
*l siguiente ejemplo crea una secuencia S=$5>83?C)8S.
$#%A(% S%QU%'$%SQHP('8&C1'S,I')ALU%B,AE)ALU%KKKKKKKKKKKKKKKKKKKKKKKKKKKS(A#( 3I(BI'$#%,%'( -2B
$A$%>ID
Se puede simplificar la orden, tomando los valores por defecto. *l ejemploanterior quedara del siguiente modo%
$#%A(% S%QU%'$%SQHP('8&C1'SD
Para obtener el siguiente valor de una secuencia debemos utiliar lafuncin '%E()AL. '%E()ALse puede utiliar el cualquier sentencia
SQL 0,L
7/25/2019 MEGA GUIA DE PL SQL
70/73
S%L%$( SQHP('8&C1'S.'%E()ALC#O, 8&)LD
Podemos obtener el 6ltimo valor generado por la secuencia con lafuncin $U##)AL. Para poder ejecutar la funcin C&((5)L debemos !aberejecutado previamente la funcin '%E()AL.
S%L%$(SQHP('8&C1'S.$U##)ALC#O, 8&)LD
Para eliminar una secuencia definitivamente de la base de datos debemosutiliar la sentencia 0#OP.
0#OP S%QU%'$%SQHP('8&C1'S D
PL/SQL Rava
'tra de la virtudes de PL/SQL es que permite trabajar conjuntamente con7ava.
PL/SQL es un e#celente lenguaje para la gestin de informacin pero enocasiones, podemos necesitar de un lenguaje de programacin m$s potente.Por ejemplo podramos necesitar consumir un servicio eb, conectar a otroservidor, trabajar con Soc`ets para estos casos podemos trabajarconjuntamente con PL/SQL " 7ava.
Para poder trabajar con 7ava " PL/SQL debemos realiar los siguientespasos%
Crear el programa 7ava " cargarlo en la base de datos. Crear un programa de recubrimiento
7/25/2019 MEGA GUIA DE PL SQL
71/73
Para crear objetos 7ava en la base de datos podemos utiliar la uitlidadLoad7ava de O#A$L%desde lnea de comandos o bien crear objetos RA)ASOU#$%en la propia base de datos.
La sinta#is para la creacin de RA)A SOU#$%en O#A$L%es la siguiente.
$#%A(% @O##%PLA$%A'0 $O,PIL%RA)A SOU#$%'A,%0O@avaSourceNameASpublic class Ocla!!Name^
#Aava code%...
_D
*l siguiente ejemplo crea " compila una clase 7ava 'racle7avaClass en elinterior de RA)A SOU#$%0uentes7ava. Un aspecto mu a tener en cuentaes "ue los mBtodos de la clase java "ue "ueramos invocar desde PL/SQLde!en ser estaticos.
$#%A(%O# #%PLA$% A'0 $O,PIL%RA)A SOU#$%'A,%00uentes7avaASpublicclassOracleRava$lass^ publicstaticStringSaluda
7/25/2019 MEGA GUIA DE PL SQL
72/73
return
7/25/2019 MEGA GUIA DE PL SQL
73/73
ASLA'DUAD% RA)A 'A,%R'racle7avaClass.Saluda