Sei sulla pagina 1di 10

UNITEC BASE DE DATOS II

4 Programacin de Aplicaciones
4.1 PL/SQL
4.1.1 Introdccin
El desarrollo de aplicaciones de base de datos requiere tpicamente construcciones
similares a aquellas que pueden ser encontradas en lenguajes de programacin tales
como C, C++ o Pascal. Estas construcciones son necesarias para implementar
estructuras de datos complejas y algoritmos. Una restriccin mayor del lenguaje de
base de datos SQ, sin embargo, es que muc!as tareas no pueden ser logradas
utili"ando solamente los elementos pro#istos por el lenguaje.
P$SQ %Procedural anguage$SQ& es una e'tensin procedural de (racle)SQ que
o*rece construcciones de lenguaje similares a aquellas de lenguajes de programacin
imperati#os. P$SQ permite a los usuarios y desarrolladores reali"ar aplicaciones
complejas de base de datos que requieren el uso de estructuras de control y elementos
procedurales tales como procedimientos, *unciones y mdulos.
a construccin b+sica en P$SQ es un bloque. Un bloque permite a los dise,adores
combinar instrucciones lgicamente relacionadas %SQ)& en unidades.
En un bloque,
se pueden declarar constantes y #ariables,
las #ariables pueden ser utili"adas para almacenar resultados de consultas.
incluyen instrucciones SQ % no se permite -- &
estructuras de control %bucles&,
estructuras de condicin %si)entonces)sino i*)t!en)else&,
manejo de e'cepciones
y llamadas a otros bloques P$SQ.
(tra caracterstica importante de P$SQ es que o*rece un mecanismo para procesar
resultados de consultas en una *orma orientada a tplas, esto es, una tpla a la #e".
Para esto, se utili"an los cursores.
Un cursor b+sicamente es un puntero a un resultado de consulta y es utili"ado para
leer los #alores de atributos de tplas seleccionadas y ponerlos en #ariables. Un cursor
se utili"a tpicamente en combinacin con una construccin de bucle tal que cada tpla
leda por el cursor puede ser procesada indi#idualmente.
En suma, los *ines mayores de P$SQ son
incrementar la e'presi#idad de SQ,
procesar resultados de consultas de una *orma orientada a tplas,
optimi"ar instrucciones SQ combinadas,
desarrollar programas de aplicacin modulares de base de datos,
reutili"ar cdigo de programa
Pro!. "an Carlos Camac#o $ar%as 1
UNITEC BASE DE DATOS II
4.1.& Estrctra de 'lo(es P)*S+)
P$SQ es un lenguaje estructurado en bloques. Cada bloque construye una unidad de
programa %nombrada&, y los bloques pueden anidarse. os bloques que construyen un
procedimiento, una *uncin o un paquete deben ser nombrados.
Un bloque P$SQ tiene una seccin de declaracin opcional, una parte conteniendo
instrucciones P$SQ, y una parte opcional de manejo de e'cepciones. .s la estructura
de P$SQ se #e como sigue%los corc!etes encierran partes opcionales&/
01Encabe"ado de bloque23
0DEC)A,E
1Constantes2
14ariables2
1Cursores2
1E'cepciones de*inidas por el usuario 23
BE-IN
1instrucciones P$SQ2 5
0E.CEPTION
16anejo de e'cepciones23
END /
El encabe"ado del bloque especi*ica si el bloque P$SQ es un procedimiento, una
*uncin o un paquete. Si no se especi*ica un encabe"ado, el bloque se dice que es un
bloque P$SQ annimo. Cada bloque P$SQ nue#amente construye una instruccin
P$SQ. .s los bloques pueden anidarse como bloques en lenguajes de programacin
con#encionales. El alcance de las #ariables declaradas%por ejemplo, la parte del
programa en la cual uno puede re*erirse a una #ariable& es an+loga al alcance de
#ariables en lenguajes de programacin tales como C o Pascal.
4.1.0 Declaraciones
Constantes, #ariables, cursores, y e'cepciones usadas en un bloque P$SQ deben ser
declaradas en la seccin de declaracin de ese bloque. 4ariables y constantes pueden
ser declaradas como sigue/
1nombre #ariable2 0constant3 1tipo datos2 0not null3 0/7 1#alor235
8ipos #+lidos de datos son tipos SQ y los tipos de datos booleanos. os tipos de datos
booleanos pueden ser slo #erdaderos %tre&, *alsos %!alse& o nulos %nll&. a cl+usula
no nulo %not nll& requiere que la #ariable declarada siempre tenga un #alor distinto
de nulo. 1#alor2 es utili"ada para iniciali"ar una #ariable.
Si no se especi*ica una e'presin, el #alor nulo %nll& es asignado a la #ariable. a
cl+usula constant especi*ica que una #e" un #alor se !a asignado a una #ariable, el
#alor no puede ser modi*icado %as la #ariable se con#ierte en una constante&.
Ejemplo/
declare
!ire9date date5 )) iniciali"acin implcita con nulo %nll&
job9title #arc!ar:%;<& /7 =Salesman=5 )) 4alor >nicial
Pro!. "an Carlos Camac#o $ar%as &
UNITEC BASE DE DATOS II
salary9incr constant number%?,:& /7 @.A5 )) constante
id9emp E6P.EmpnoB8CPE 5 )) tipo dato del atributo
reg9depto -EP8(BD(E8CPE 5 )) tipo dato del renglon
F
begin
F
end5
En lugar de especi*icar un tipo de datos, uno puede re*erirse tambiGn al tipo de una
columna de tabla %llamado declaracin anclada&. Por ejemplo, E1P.Empno2T3PE se
re*iere al tipo de datos de la columna E6PH( en la relacin E6P. En lugar de una
#ariable sola, un registro puede ser declarado que puede guardar una tpla completa
de una tabla dada %o resultado de consulta&. Por ejemplo, el tipo de datos DEPTO
2,O4T3PE especi*ica un registro capa" de almacenar todos los #alores de atributo
de la tabla -EP8(.
8ales registros son utili"ados en combinacin con un cursor. Un campo en un registro
pede ser accedido utili"ando 1nombre del registro2.1nombre de la columna2, por
ejemplo, DEPT.Deptno.
Una declaracin de cursor especi*ica un juego de tplas %como un resultado de
consulta& tal que las tplas pueden ser procesadas en una *orma orientada a tuplas
%p.e., una tpla a la #e"& usando la instruccin !etc#. Una declaracin de cursor tiene
la *orma
cursor 1nombre de cursor2 0%1lista de par+metros2&3 is 1instruccin select25
El nombre de cursor es un identi*icador no declarado, no el nombre de una #ariable
P$SQ. Un par+metro tiene la *orma 1nombre de par+metro2 1tipo de par+metro2,
8ipos posibles de par+metros son c#ar, 5arc#ar&, nm'er, date y 'oolean as como
los subtipos correspondientes tales como integer.
os par+metros son utili"ados para asignar #alores a las #ariables que se dan en la
instruccin select.
Ejemplo/ Queremos obtener los siguientes #alores de atributo de la tabla E6P en
una *orma orientada a tuplas/ el puesto de trabajo y nombre de aquellos
empleados que !an sido contratados despuGs de una *ec!a dada, y
quienes tienen un gerente trabajando en un departamento dado.
cursor employee cur %start9date date, dno number& is
select I(J, EH.6E *rom E6P E K!ere L>DE-.8E 2 start 9date
and e'ists %select 9 *rom E6P
K!ere E.6MD 7 E6PH( and -EP8H( 7 dno&5
Si %algunas& tplas seleccionadas por el cursor ser+n modi*icadas en el bloque P$SQ,
la cl+usula !or pdate678colmna7s9:9; tiene que agregarse al *inal de la
declaracin de cursor. En este caso las tuplas seleccionadas son bloqueadas y no
pueden ser accedidas por otros usuarios !asta que una instruccin commit !aya sido
ejecutada. .ntes de que un cursor declarado pueda ser utili"ado en instrucciones
P$SQ, el cursor debe abrirse, y despuGs de procesar las tuplas seleccionadas, el
cursor debe ser cerrado. -iscutimos el uso de cursores a m+s detalle a continuacin.
as excepciones son utili"adas para procesar errores y ad#ertencias que ocurren
durante la ejecucin de instrucciones P$SQ en una *orma controlada. .lgunas
e'cepciones son de*inidas en *orma interna como NED(9->4>-E.
Pro!. "an Carlos Camac#o $ar%as 0
UNITEC BASE DE DATOS II
El usuario puede especi*icar otras e'cepciones al *inal del bloque P$SQ. E'cepciones
de*inidas por el usuario necesitan ser declaradas utili"ando 8nom're de e<cepcin:
e<ception. -iscutiremos el manejo de e'cepciones a m+s detalle en la Seccin O.@.A
4.1.4 Elementos del )enga=e
En adicin a la declaracin de #ariables, constantes y cursores, P$SQ o*rece #arios
elementos de lenguaje como asignaciones de #ariable, estructuras de control %bucles,
si)entonces)si no&, llamadas a *uncin y a procedimiento, etc. Sin embargo, P$SQ no
permite comandos del lenguaje de de*inicin de datos de SQ tales como la instruccin
create ta'le. Para esto P$SQ o*rece paquetes especiales.
.dem+s, P$SQ utili"a una instruccin select modi*icada que requiere que cada tupla
seleccionada sea asignada a un registro %o una lista de #ariables&.
E'isten di*erentes alternati#as en P$SQ para asignar un #alor a una #ariable. a
*orma m+s simple para asignar un #alor a una #ariable es
declare
contador integer /7 <5
F
begin
contador /7 contador + @5
os #alores que se asignan a una #ariable tambiGn pueden ser obtenidos de la base de
datos utili"ando una instruccin select
select 1columna%s&2
into 1lista de #ariables acorde a la%s& columna%s&2
*rom 1tabla%s&2
K!ere 1condicin25
Es importante asegurarse que la instruccin select regrese una tplaP
-e otra *orma no es posible asignar los #alores de atributo a la lista de #ariables
especi*icada y se da un error de tiempo de ejecucin.
Si la instruccin select regresa m+s de una tpla, se debe utili"ar un cursor.
.dem+s, los tipos de datos de las #ariables especi*icadas deben ca"ar con los #alores
de atributo recuperados. Para la mayora de tipos de datos, P$SQ reali"a una
con#ersin autom+tica de tipos %p.e, de entero %integer& a real%real&&.
En lugar de una lista de #ariables Qnicas, se puede dar un registro despuGs de la
palabra cla#e into. 8ambiGn en este caso, la instruccin select debe regresar al menos
una tuplaP
-EC.DE
seq number 5
JEM>H
select rubros9seq.ne't#al into seq *rom dual 5
Pro!. "an Carlos Camac#o $ar%as 4
UNITEC BASE DE DATOS II
insert into rubros%cla#e, nombre&
#alues%seq, =Utensilio=& 5
EH-5
declare
employee9rec E6PBD(E8CPE5
ma'9sal E6P.S.B8CPE5
begin
select E6PH(, EH.6E, I(J, 6MD, S., C(66,
L>DE-.8E, -EP8H(
into employee9rec
*rom E6P K!ere E6PH( 7 ARS;5
select ma'%S.& into ma'9sal *rom E6P5
F
end5
P$SQ pro#ee bucles >#ile, dos tipos de bucles !or, y bucles continuos. os Qltimos
son utili"ados en combinacin con cursors. 8odos los tipos de bucles son utili"ados para
ejecutar una secuencia de instrucciones mQltiples #eces. a especi*icacin de bucles
ocurre en la misma *orma conocida para lenguajes de programacin imperati#a como C
o Pascal.
Un bucle >#ile tiene el siguiente patrn
011 1nombre de etiqueta2 223
K!ile 1condicin2 loop
1secuencia de instrucciones25
end loop 01nombre de etiqueta235
Un bucle puede ser nombrado. Hombrar un bucle es Qtil cuando los bucles son
anidados y los bucles internos son completados incondicionalmente utili"ando la
instruccin e<it 8la'el name:/. En #ista que el nQmero de iteraciones a tra#Gs de un
bucle >#ile es desconocido !asta que el bucle completa, el nQmero de iteraciones en
un bucle !or puede ser especi*icado utili"ando dos enteros.
011 1nombre de etiqueta2 223
*or 1ndice2 in 0re#erse3 1lmite in*erior2..1lmite superior2 loop
1secuencia de instrucciones2
end loop 01nombre de etiqueta23 5
El contador de bucle 1ndice2 es declarado en *orma implcita. El alcance del contador
de bucle solamente es dentro del bucle !or. >n#alida el alcance de cualquier #ariable
que tenga el mismo nombre a*uera del bucle. -entro del bucle !or, 1ndice2 puede ser
re*erenciado como una constante. 1ndice2 puede aparecer en e'presiones, pero uno
no puede asignar un #alor a 1ndice2. Utili"ando la palabra cla#e re5erse causa que la
iteracin proceda de *orma in#ersa del lmite superior al lmite in*erior.
Procesando crsores?
Pro!. "an Carlos Camac#o $ar%as @
UNITEC BASE DE DATOS II
.ntes de que un cursor pueda ser utili"ado, debe ser abierto utili"ando la instruccin
open
open 1nombre de cursor2 0%1lista de par+metros2&3 5
a instruccin asociada select entonces es procesada y el cursor re*erencia la primer
tpla seleccionada.
as tplas seleccionadas entonces pueden ser procesadas una tpla a la #e"
utili"ando el comando !etc#
*etc! 1nombre de cursor2 into 1lista de #ariables25
El comando !etc# asigna los #alores de atributos seleccionados de la tpla actual a la
lista de #ariables. -espuGs del comando !etc#, el cursor a#an"a a la siguiente tupla en
el juego de resultados.
Cabe notar que las #ariables en la lista deben tener los mismos tipos de datos que los
#alores seleccionados.
-espuGs de que todas las tplas !an sido procesadas, el comando close se utili"a
para des!abilitar el cursor.
close 1nombre de cursor25
El siguiente ejemplo ilustra como se utili"a un cursor junto con un bucle continuo/
declare
cursor emp9cur is select T *rom E6P5
emp9rec E6PBD(E8CPE5
emp9sal E6P.S.B8CPE5
begin
open emp9cur5
loop
*etc! emp9cur into emp9rec5
e'it K!en emp9curBH(8U(UH-5
emp9sal /7 emp9rec.sal5
1secuencia de instrucciones2
end loop5
close emp9cur5
F
end5
Cada bucle puede ser completado incondicionalmente utili"ando la cl+usula e<it/
e'it 01etiqueta de bloque23 0K!en 1condicin23
Utili"ando e<it sin una etiqueta de bloque causa que se complete el bucle que contente
la instruccin e<it. Una condicin puede ser una comparacin simple de #alores. En la
mayora de los casos, sin embargo, la condicin se re*iere a un cursor. En el ejemplo
anterior, 2NOT$OUND es un predicado que se e#alQa a *also si el comando *etc! m+s
reciente !a ledo una tpla. El #alor de 8nom're de crsor:2NOT$OUND es nulo
antes de que la primer tpla sea obtenida. El predicado se e#alQa a #erdadero si la
ejecucin de la instruccin !etc# m+s reciente *all al regresar una tupla, y *also en
caso contrario. BU(UH- es el opuesto lgico de BH(8U(UH-.
Pro!. "an Carlos Camac#o $ar%as A
UNITEC BASE DE DATOS II
Bcles de crsor con la instrccin !or
Pueden utili"arse para simpli*icar el uso de un cursor/
*or 1nombre de registro2 in 1nombre de cursor20%1lista de parametros2&3 loop
1secuencia de instrucciones2
end loop 01nombre de etiqueta235
Caractersticas/
Un registro capa" de almacenar una tupla obtenida por un cursor es declarado
implcitamente.
Un open antes de que el bucle entre.
Deali"a implcitamente una instruccin !etc# para cada iteracin
el bucle termina autom+ticamente sin necesidad de una instruccin e<it.
Un close despuGs de que se !a terminado. Si en una iteracin no se !a obtenido
una tupla,
.Qn es posible especi*icar una consulta en lugar de 1nombre de cursor2 en un bucle
!or/
*or 1nombre de registro2 in %1instruccin select2& loop
1secuencia de instrucciones2
end loop5
Esto es, un cursor no necesita ser especi*icado antes de que entre el bucle, pero es
de*inido en la instruccin select.
Ejemplo/
*or sal9rec in %select S. + C(66 total *rom E6P& loop
F5
end loop5
total es un alias para la e'presin calculada en el comando select. .s, en cada
iteracin slamente una tupla es recuperada. El registro sal9rec, que es de*inido
implcitamente, contiene solamente un #alor que puede accederse utili"ando
sal9rec.total. os alias, por supuesto, no son necesarios si solamente se seleccionan
atributos, esto es, si la instruccin select no contiene operadores aritmGticos o
*unciones agregadas.
Para control condicional, P$SQ, o*rece elementos i!Bt#enBelse con el patrn
i* 1condicin2 t!en 1secuencia de instrucciones2
0elsi* 3 1condicin2 t!en 1 secuencia de instrucciones2
F
0else3 1 secuencia de instrucciones2 end i* 5
>niciando con la primer condicin, si una condicin se e#alQa como #erdadera, su
secuencia de instrucciones correspondiente es ejecutada, de otra *orma el control pasa
a la siguiente condicin. Entonces el comportamiento de este tipo de instrucciones
P$SQ es an+logo a las instrucciones i!Bt#enBelse de lenguajes de programacin
imperati#os.
E'cepto comandos de de*inicin de datos tales como create ta'le, todo tipo de
instrucciones SQ puede ser utili"ado en bloques P$SQ, en particular delete, insert,
Pro!. "an Carlos Camac#o $ar%as C
UNITEC BASE DE DATOS II
pdate, y commit. Cabe notar que en P$SQ solamente instrucciones del tipo select
1columna%s&2 into son permitidos, p.e., #alores de atributos pueden solamente
asignarse a #ariables %a menos que la instruccin select sea utili"ada en una
subconsulta&. El uso de la instruccin select como en SQ lle#a a obtener un mensaje
de error. Si las instrucciones pdate o delete se utili"an en combinacin con un
cursor, estos comandos pueden restringirse a la tupla actualmente obtenida. En estos
casos la cl+usula >#ere crrent o! 8nom're de crsor: se agrega como en el
siguiente ejemplo.
Ejemplo/ El siguiente bloque P$SQ reali"a las siguientes modi*icaciones/ 8odos los
empleados que tengan a =V>HM= como su gerente obtienen un AB de
incremento salarial.
declare
manager E6P.6MDB8CPE5
cursor emp9cur %mgr9no number& is
select S. *rom E6P K!ere 6MD 7 mgr9no
*or update o* S.5
begin
select E6PH( into manager *rom E6P K!ere EH.6E 7 =V>HM=5
*or emp9rec in emp9cur%manager& loop
update E6P set S. 7 emp9rec.sal T @.<A K!ere current o*
emp9cur5
end loop5
commit5
end5
Comentario/ Cabe notar que el registro emp9rec es de*inido implcitamente.
-iscutiremos otra #ersin de este bloque utili"ando par+metros en la Seccin O.@.R.
4.1.@ 1ane=o de E<cepciones
Un bloque P$SQ puede contener instrucciones que especi*iquen rutinas de manejo de
e'cepciones. Cada error o ad#ertencia durante la ejecucin de un bloque P$SQ
genera una e'cepcin. Uno puede distinguir entre dos tipos de e'cepciones/
e'cepciones de*inidas por el sistema
e'cepciones de*inidas por el usuario %las cuales deben ser declaradas por el
usuario en la parte de declaracin del bloque donde la e'cepcin es usada $
implementada&
as e'cepciones de*inidas por el sistema son siempre generadas autom+ticamente
cuandoquiera que los errores o ad#ertencias correspondientes ocurren. E'cepciones
de*inidas por el usuario, en contraste, deben ser generadas e'plcitamente en una
secuencia de comandos utili"ando raise8nom're de la e<cepcin:. -espuGs de la
palabra cla#e e<ception al *inal de un bloque, el manejo de las e'cepciones de*inidas
por usuario debe ser implementado. Una implementacin tiene el siguiente patrn
K!en 1nombre de e'cepcin2 t!en 1secuencia de comandos25
os errores m+s comunes que pueden ocurrir durante la ejecucin de programas
P$SQ son manejados por e'cepciones de*inidas por el sistema. a siguiente tabla
lista algunas de estas e'cepciones con sus nombres y una descripcin corta.
Hombre de e'cepcin HQmero Comentario
Pro!. "an Carlos Camac#o $ar%as D
UNITEC BASE DE DATOS II
CUDS(D9.DE.-C9(PEH (D.)<RA@@ Se !a intentado abrir un cursor ya
abierto
>H4.>-9CUDS(D (D.)<@<<@ (peracin in#+lida de cursor, tal como
intentar obtener registros de un cursor
cerrado
H(9-.8.9U(UH- (D.)<@O<? Una instruccin select E into o !etc#
no retorn ninguna tpla
8((96.HC9D(ES (D.)<@O:: Una instruccin select E into regres
m+s de una tpla
NED(9->4>-E (D.)<@OWR Se !a intentado di#idir un nQmero entre
cero
Ejemplo/
declare
emp9sal E6P.S.B8CPE5
emp9no E6P.E6PH(B8CPE5
too9!ig!9sal e'ception5
begin
select E6PH(, S. into emp9no, emp9sal
*rom E6P K!ere EH.6E 7 =V>HM=5
i* emp sal T @.<A 2 O<<< t!en
raise too9!ig!9sal 5
else
update E6P set SQ F 5
end i* 5
e'ception
K!en H(9-.8.9U(UH- t!en X ) no se seleccion ninguna tupla
rollbacY5
K!en too9!ig!9sal t!en
insert into !ig!9sal9emps #alues%emp9no&5
commit5
end5
-espuGs de la palabra cla#e >#en una lista de nombres de e'cepcin conectados con
or puede especi*icarse. a Qltima cl+usula >#en en la parte de e'cepciones puede
contener el nombre de e'cepcin ot#ers. Esto introduce la rutina de manejo de
e'cepciones por de*ecto, por ejemplo, un roll'acF.
Si un programa P$SQ es ejecutado desde un s#ell P$SQ, las rutinas de manejo de
e'cepciones pueden contener instrucciones que desplieguen mensajes de error o
ad#ertencia en la pantalla. Para esto, el procedimiento raiseGapplicationGerror
puede usarse. Este procedimiento tiene dos par+metros 8nHmero de error: y
8mensa=e de error:. 8nHmero de error: es un nQmero negati#o entre ):<<<< y
):<SSS. 8mensa=e de error: es una cadena con una longitud de !asta :<O;
caracteres. El operador de concatenacin Z[[\ puede utili"arse para concatenar cadenas
separadas en una sola cadena. Para desplegar #ariables numGricas, estas #ariables
deben ser con#ertidas a cadena utili"ando la *uncin toGc#ar. Si el procedimiento
raiseGapplicationGerror es llamado desde un bloque P$SQ, el proceso del bloque
Pro!. "an Carlos Camac#o $ar%as I
UNITEC BASE DE DATOS II
termina y las modi*icaciones a la base de datos se des!acen, esto es, un roll'acF
implcito es reali"ado en adicin a la muestra de los mensajes de error.
Ejemplo/
i* emp sal T @.<A 2 O<<<
t!en raise9application9error%):<<@<, =Salary increase *or employee Kit!
>d =[[ to9c!ar%Emp no& [[ = is too !ig!=&5
Pro!. "an Carlos Camac#o $ar%as 1J

Potrebbero piacerti anche