Está en la página 1de 11

Programacin con PL/SQL

Introduccin
SQL es un lenguaje de consulta para los sistemas de bases de datos relacinales, pero que no
posee la potencia de los lenguajes de programacin. No permite el uso de
variables, estructuras de control de flujo, bucles... dem!s elementos caracter"sticos de la
programacin. No es de e#tra$ar, SQL es un lenguaje de consulta, no un lenguaje de
programacin. Sin embargo, SQL es la %erramienta ideal para trabajar con bases de
datos. &uando se desea reali'ar una aplicacin completa para el manejo de una base de datos
relacional, resulta necesario utili'ar alguna %erramienta que soporte la capacidad de consulta
del SQL la versatilidad de los lenguajes de programacin tradicionales. PL/SQL es el
lenguaje de programacin que proporciona (racle para e#tender el SQL est!ndar con otro
tipo de instrucciones elementos propios de los lenguajes de programacin.
&on PL/SQL vamos a poder programar las unidades de programa de la base de datos
()*&L+, est!s son,
Procedimientos almacenados
-unciones
.riggers
Scripts
Pero adem!s PL/SQL nos permite reali'ar programas sobre las siguientes %erramientas de
()*&L+,
(racle -orms
(racle )eports
(racle /rap%ics
(racle *plication Server
Identificadores
0n identificador es un nombre que se le pone a un objeto que interviene en un programa, que
puede ser variable, constante, procedimientos, e#cepciones, cursores... 1ebe tener un m!#imo
de 23 caracteres que empiece siempre por una letra, puede contener letras, n4meros, los
s"mbolos 5, 6, 7, ma4sculas min4sculas indiferentemente. Los identificadores no pueden
ser palabras reservadas 8S+L+&., INS+)., 1+L+.+, 0P1*.+, 1)(P9.
(peradores
8suma9 : 8resta9
8multiplicacin9
/ 8divisin9

o 8e#ponente9
(perador de asignacin ,; 8dos puntos < igual9
(peradores aritm=ticos
(peradores relacionales o
de comparacin
; 8igual a9
>?, @; 8distinto de9
> 8menor que9
? 8maor que9
?; 8maor o igual a9
>; 8menor o igual a9
(perador de
concatenacin
AA
&omentarios /B comentario de dos o m!s l"neas B/
:: comentario de una l"nea
Cariables
Las variables son nombres para procesar los elementos de los datos. 1eclaracin,
Nombre7variable tipo DN(. N0LLE D,; valor A 1+-*0L. valorE
,; 1+-*0L. son lo mismo. Si ponemos N(. N0LL es obligatorio iniciali'ar la
variable.
+jemplos,
num7dep N0FG+)8H9 N(. N0LL ,;H3
num7emple C*)&I*)H8JK9 1+-*0L. LPedroM
.ambi=n se puede definir una variable a partir de un campo mediante los atributos N.OP+
N)(P.OP+, con esto damos el tipo longitud a la variable de otra variable u objeto a
definido.
N.OP+ es la que se utili'a normalmente, N)(P.OP+ es para claves de registro. +l N(.
N0LL el valor inicial no se %eredan, slo el tipo de dato longitud de ese dato.
Por ejemplo,
num7dep emple.dept7noN.OP+
&onstantes DeditarE
Las constantes son como las variables pero no puede modificarse su valor. Se declaran de la
siguiente manera,
nombre7constante &(NS.*N. tipo7de7dato ,; valor
Por ejemplo, el IC* es un valor fijo, para declararlo lo %ar"amos de la siguiente manera,
Imp7iva constant number8H,H9 ,; JH,K
Gloque PL/SQL DeditarE
Gloque es la unidad de estructura b!sica en los programas PL/SQL. Supone una mejora en el
rendimiento, pues se env"an los bloques completos al servidor para ser procesados en lugar de
enviar cada secuencia SQL.
Partes de un bloque,
Qona de declaraciones, 'ona opcional. Se declaran los objetos locales 8variables,
constantes...9.
Qona de instrucciones, 'ona obligatoria.
Qona de tratamiento de e#cepciones, 'ona opcional. Se tratan e#cepciones en el
programa.
-orma de crear un bloque,
D 1+&L*)+ A IS / *S E
>declaraciones?
G+/IN
>instrucciones?
D +R&+P.I(N E
>tratamiento de e#cepciones?
+N1S
/
La barra T/T siempre se pone al final para ejecutar el bloque.
.ipos de bloques
*nnimo 8sin nombre9
Siempre comien'a con 1+&L*)+ o directamente con G+/IN.
+jemplo J,
G+/IN
1GFS7(0.P0..P0.7LIN+ 8LIolaM9S
+N1S
/
1GFS7(0.P0. es un depurador de (racle que sirve para visuali'ar cualquier cosa,
pero antes lo debemos tener activado,
S+. S+)C+)(0.P0. (NS
+jemplo H,
1+&L*)+
v7precio numberS
G+/IN
select pvp into v7precio
from tarticulos
U%ere codigo;J33S
dbms7output.put7line 8v7precio9S
+N1S
/
+jemplo 2,
+l siguiente bloque annimo nos muestra la fec%a actual con el formato VFartes, JW
de mar'o de JXXW, a las J2,3Y,KKZ.
1+&L*)+
fec%a dateS
G+/IN
select ssdate into fec%a from dualS
dbms7output.put7line 8to7c%ar8fec%a,
[daT, TddT de Tmont%T de TT, a las T%%HY,mi,ss[99S
+N1S
/
Subprogramas 8tienen nombre9
Se pueden almacenar en la base de datos.
+#isten dos tipos de subprogramas, Procedimientos 8P)(&+10)+9 -unciones
8-0N&.I(N9
Procedimientos en PLSQL
Los procedimientos tienen la utilidad de fomentar la reutili'acin de programas que se
usan com4nmente. 0na ve' compilado, queda almacenado en la base de datos 8por eso
es tambi=n llamado [Procedimietno almacenado[9 puede ser utili'ado por m4ltiples
aplicaciones.
La sinta#is es la siguiente
&)+*.+ D() )+PL*&+E P)(&+10)+ nombre7procedimiento
Dnombre7parametro modo tipodatos7parametro E
IS A *S
bloque de cdigo
1onde TmodoT puede contener los valores IN, (0., IN (0.. Por defecto tiene el
valor IN si no se pone nada. IN indica que el par!metro es de entrada no se podr!
modificar. (0. indica que el par!metro es de salida con lo que el procedimiento
devolver! un valor en =l. IN (0. indica que el par!metro es de entrada/salida. &on lo
que al llamar al procedimiento se le dar! un valor que luego podr! ser modificado por
el procedimiento devolver este nuevo valor.
Ttipodatos7parametro indica el tipo de datos que tendr! el par!metro seg4n lo
indicado en .ipos de datos (racle/PLSQL
Para borrar un procedimiento almacenado de la base de datos
1)(P P)(&+10)+ nombre7procedimiento
Para utili'ar un procedimiento almacenado de la base de datos
Simplemente se lo llama desde un bloque annimo 8desde la l"nea de comandos9,
previamente %abiendo iniciali'ado el/los parametro/s 8en caso que e#istan9.
1+&L*)+
nombre7parametro tipodatos7parametroS
G+/IN
nombre7parametro tipodatos7parametro ,; valor7de7iniciali'acionS
nombre7procedimiento 8nombre7parametro ;? nombre7parametro9S
+N1S
/
-unciones en PLSQL
0na funcin es un bloque de cdigo PL/SQL que tiene las mismas caracter"sticas que un
procedimiento almacenado. La diferencia estriba que una funcin devuelve un valor al
retornar. *l devolver un valor puede ser llamada como parte de una e#presin.
La sinta#is ser"a
&)+*.+ D() )+PL*&+E -0N&.I(N nombre7funcin
Dnombre7par!metro modo tipodatos7parametro E
)+.0)N tipodatos7retorno IS A *S
bloque de cdigo
1onde TmodoT puede contener los valores IN, (0., IN (0.. Por defecto tiene el
valor IN si no se pone nada. IN indica que el par!metro es de entrada no se podr!
modificar. (0. indica que el par!metro es de salida con lo que el procedimiento
devolver! un valor en =l. IN (0. indica que el par!metro es de entrada/salida. &on lo
que al llamar al procedimiento se le dar! un valor que luego podr! ser modificado por
el procedimiento devolver este nuevo valor. Sin embargo, en este caso solo tendr"a
sentido 8por el concepto de funcin en s" mismo9 declarar par!metros del tipo IN
devolver el valor como retorno de la funcin.
Ttipodatos7parametroT Ttipodatos7retornoT indican el tipo de datos que tendr! el
par!metro el valor de retorno de la funcin respectivamente seg4n lo indicado en
.ipos de datos (racle/PLSQL
Para borrar una funcin de la base de datos
1)(P -0N&.I(N nombre7funcin
Los procedimientos funciones se pueden agrupar en unas estructuras llamadas Paquetes.
.riggers
0n trigger o disparador se ejecuta ante un determinado evento de manera autom!tica.
/eneralmente se utili'an para garanti'ar que una determinada accin siempre se
reali'a despu=s de reali'ar una tarea determinada. Se debe tener cuidado con este tipo
de estructuras puesto que un uso e#cesivo puede dar lugar a dependencias dif"ciles de
mantener. *dem!s se deben tener mu claros las restricciones de integridad para
evitar problemas.
La sinta#is ser"a
* nivel de sentencia,
&)+*.+ D() )+PL*&+E .)I//+) nombre7trigger
momento7ejecucin evento DeventoE (N nombre7tabla
bloque PLSQLS
* nivel de registro,
&)+*.+ D() )+PL*&+E .)I//+) nombre7trigger
momento7ejecucin evento DeventoE (N nombre7tabla
D)+-+)+N&IN/ (L1 *S old A N+P *S neUE
-() +*&I )(P
DPI+N condicinE
bloque PLSQLS
1onde Tmomento7ejecucinT indica cuando se ejecuta el trigger autom!ticamente.
Puede contener los valores G+-()+ *-.+).
TeventoT indica la operacin que provoca la ejecucin de este bloque. Puede contener
los valores INS+)., 0P1*.+ 1+L+.+.
ToldT indica el nombre que se le da al registro con los valores antiguos que se ten"an
antes de la ejecucin de la operacin que activ el trigger. Fientras que TneUT indica
el valor que tiene actualmente despu=s de dic%a operacin.
&on la cl!usula TPI+NT se puede indicar una restriccin que %aga que el trigger se
ejecute o no. Por ejemplo se puede indicar que el trigger se ejecute solo si el campo
TcampoJT de la tabla tiene un valor maor que K3.
La cl!usula T-() +*&I )(PT indica que el trigger es a nivel de registro.
Para eliminar un trigger,
1)(P .)I//+) nombre7trigger
Gloques de instrucciones PL/SQL
* continuacin se muestra como es la estructura general de los bloques de instrucciones de
PL/SQL que se usar!n mas adelante en la creacin de procedimientos, funciones triggers.
PL/SQL 8Procedural Language/SQL9 es una e#tensin de SQL, que agrega ciertas
construcciones propias de lenguajes procedimentales, obteniendose como resultado un
lenguaje estructural mas poderoso que SQL. La unidad de programacin utili'ada por
PL/SQL es el bloque. .odos los programas de PL/SQL est!n conformados por bloques.
.ipicamente, cada bloque lleva a cabo una accin lgica en el programa. 0n bloque tendr!
siempre la siguiente estructura,
1+&L*)+
//Seccin declarativa, variables, tipos, subprogramas
//de uso local
G+/IN
//Seccin ejecutable, las instrucciones procedimentales, de SQL
//aparecen aqu". +s la unica seccin obligatoria en el bloque.
+R&+P.I(N
//Seccin de manejo de e#cepciones. Las rutinas de manejo de errores
//aparecen aqui
+N1S
Solo se requiere que apare'ca la seccin ejecutable. Lo demas es opcional. Las unicas
instrucciones SQL permitidas en un bloque PL/SQL son INS+)., 0P1*.+, 1+L+.+
S+L+&., ademas de algunas instrucciones para manipulacin de datos, e instrucciones para
control de transacciones. (tras instrucciones de SQL como 1)(P, &)+*.+ o *L.+) no son
permitidas. Se permite el uso de comentarios estilo & 8/B . . .B/9. PL/SQL no es case sensitive
por lo que no %a distincin entre nombres con mausculas minusculas.
+n la seccin de declaraciones, se indican las variables que ser!n usadas dentro del bloque
sus tipos. Por ejemplo,
1+&L*)+
mGeer C*)&I*)8H39S
price N0FG+)8\,H9S
+n algunos casos, es posible que se desee que el tipo de una variable coincida con el tipo usado
para una columna de una tabla determinada, en esos casos se puede usar la construccin,
1+&L*)+
mGeer Geers.nameN.OP+S
&on lo cual se logra que la variable mGeer tenga el mismo tipo que la columna name de la
tabla Geers.
.ambien es posible iniciali'ar las variables, mediante el operador ,;. *demas, mediante el uso
del mismo operador es posible %acer asignaciones en el cuerpo del programa. Por ejemplo,
1+&L*)+
price N0FG+) ,; 233S
G+/IN
price ,; price < JK3S
+N1S
run
La ejecucin de este bloque no tendr! ningun efecto, a que no se est!n %aciendo cambios
sobre la base de datos.
*dem!s es posible usar sentencias condicionales ciclos dentro de los bloques de PL/SQL.
0na sentencia condicional tipica es de la forma,
I- 8condicion9
.I+N 8lista de acciones9
+LS+ 8lista de acciones9
+N1 I-S
Si se desea, se puede %acer el uso de varios casos de condicin, mediante el uso de,
I- . . . .I+N . . .
+LSI- . . . .I+N . . .
+LSI- . . . .I+N . . .
+LS+ . . .
+N1 I-S
+n ambos casos, la clausula +LS+ es opcional.
Si se desea crear un la'o, se puede usar la instruccin,
L((P
lista7de7instrucciones
+N1 L((PS
*l menos alguna de las instrucciones debe ser,
+RI. PI+N condicionS
1e esta manera, el la'o terminar! cuando la condicin sea verdadera. *dem!s es posible
utili'ar la instruccin,
PIIL+ 8condicion9 L((P
lista7de7instrucciones
+N1 L((PS
1e esta forma, el ciclo solo se inicia si la condicion es verdadera en principio. +s posible que el
programa nunca entre en el ciclo. 0sando la instruccin L((P se garanti'aba que siempre se
ejecutar"a el cuerpo del ciclo al menos una ve'. Por 4ltimo, es posible usar ciclos que se
ejecuten un numero predeterminado de veces, mediante el uso de la instruccin,
-() i IN a..b L((P
lista7de7instrucciones
+N1 L((PS+n este caso i es una variable de uso local, por lo que no es necesario que sea
declarada, puede ser usada dentro del la'o, mientras que a b son constantes.
Procedimientos almacenados
0n procedimiento almacenado es un conjunto de instrucciones en PL/SQL, que pueden ser
llamado usando el nombre que se le %aa asignadoLa sinta#is para crear un procedimiento es
la siguiente, &)+*.+ D() )+PL*&+E P)(&+10)+ name D8param DINA(0.AIN (0.AE
datatpe9 . . .E
DISA*SE pl/sql7subprogram+l uso de () )+PL*&+ permite sobreescribir un procedimiento
e#istente. Si se omite, el procedimiento a e#iste, se producir! un error. Los modificadores
IN, (0., IN (0. indican si el parametro es de entrada, salida o ambos.
* continuacin se presenta un ejemplo de creacin de un procedimiento,
SQL? &)+*.+ P)(&+10)+ credit 8acc7no IN N0FG+), amount IN N0FG+)9
J? *S G+/IN
H? 0P1*.+ accounts
2? S+. balance ; balance < amount
Y? PI+)+ account7id ; acc7noS
K? +N1S
+ste procedimiento actuali'ar! la8s9 tupla8s9 con numero de cuenta igual al par!metro acc7no
con un incremento de amount en el balance de dic%a cuenta.
Si se desea eliminar 8borrar9 un procedimiento almacenado, se usa la instruccin,
SQL? 1)(P P)(&+10)+ nameS
Pac]ages en PL/SQL
0n paquete es una estructura que agrupa objetos de PL/SQL
compilados8procedures, funciones, variables, tipos ...9 en la base de datos. +sto nos
permite agrupar la funcionalidad de los procesos en programas.
Lo primero que debemos tener en cuenta es que los paquetes est!n formados por
dos partes, la especificacin el cuerpo. La especificacin del un paquete su cuerpo
se crean por separado.
La especificacin es la interfa' con las aplicaciones. +n ella es posible declarar los
tipos, variables, constantes, e#cepciones, cursores subprogramas disponibles para su
uso posterior desde fuera del paquete. +n la especificacin del paquete slo se
declaran los objetos 8procedures, funciones, variables ...9, no se implementa el cdigo.
Los objetos declarados en la especificacin del paquete son accesibles desde fuera del
paquete por otro script de PL/SQL o programa. Iaciendo una analog"a con el mundo
de &, la especificacin es como el arc%ivo de cabecera de un programa en &.
Para crear la especificacin de un paquete la sinta#is general es la siguiente,
&)+*.+ D() )+PL*&+E P*&^*/+ >pkgName?
IS

:: 1eclaraciones de tipos registros p4blicas
_D.OP+ >TypeName? IS >Datatype?SE`

:: 1eclaraciones de variables constantes publicas
:: .ambi=n podemos declarar cursores
_D>ConstantName? &(NS.*N. >Datatype? ,; >valor?SE`
_D>VariableName? >Datatype?SE`
:: 1eclaraciones de procedimientos funciones p4blicas
_D-0N&.I(N >FunctionName?8>Parameter? >Datatype?,...9
)+.0)N >Datatype?SE`
_DP)(&+10)+ >ProcedureName?8>Parameter? >Datatype?, ...9SE`
+N1 >pkgName?S
+l cuerpo el laimplementacin del paquete. +l cuerpo del paquete debe
implementar lo que se declar inicialmente en la especificacin. +s el donde debemos
escribir el cdigo de los subprogramas. +n el cuerpo de un pac]age podemos declarar
nuevos subprogramas tipos, pero estos seran privados para el propio pac]age.
La sinta#is general para crear el cuerpo de un paquete es mu parecida a la de la
especificacin, tan solo se a$ade la palabra clave G(1O, se implementa el cdigo de
los subprogramas.
&)+*.+ D() )+PL*&+E P*&^*/+ G(1O >pkgName?
IS

:: 1eclaraciones de tipos registros privados
_D.OP+ >TypeName? IS >Datatype?SE`

:: 1eclaraciones de variables constantes privadas
:: .ambi=n podemos declarar cursores
_D>ConstantName? &(NS.*N. >Datatype? ,; >valor?SE`
_D>VariableName? >Datatype?SE`
:: Implementacion de procedimientos funciones
-0N&.I(N >FunctionName?8>Parameter? >Datatype?,...9
)+.0)N >1atatpe?
IS
:: Cariables locales de la funcion
G+/IN
:: Implementeacion de la funcion
return8>)esult?9S
D+R&+P.I(NE
:: &ontrol de e#cepciones
+N1S

P)(&+10)+ >ProcedureName?8>Parameter? >Datatype?, ...9
IS
:: Cariables locales de la funcion
G+/IN
:: Implementacion de procedimiento
D+R&+P.I(NE
:: &ontrol de e#cepciones
+N1S
+N1 >pkgName?S
+l siguiente ejemplo crea un paquete llamado PKG_CONTA!"!DAD.
Para crear la especificacin del paquete,
&)+*.+ () )+PL*&+ P*&^*/+ P^/7&(N.*GILI1*1
IS

:: 1eclaraciones de tipos registros p4blicas
.OP+ &uenta7contable IS )+&()1
8
codigo7cuenta C*)&I*)H8\9,
naturale'a C*)&I*)H8H9 ,
actividad C*)&I*)H8Y9 ,
debe7%aber C*)&I*)H8J9
9S

:: 1eclaraciones de variables constantes publicas
1+G+ &(NS.*N. C*)&I*)H8J9 ,; [1[S
I*G+) &(NS.*N. C*)&I*)H8J9 ,; [1[S
+))()7&(N.*GILIQ*) +R&+P.I(NS
:: 1eclaraciones de procedimientos funciones p4blicas
P)(&+10)+ &ontabili'ar 8mes C*)&I*)H9 S
-0N&.I(N fn7(btener7Saldo8codigo7cuenta C*)&I*)H9 )+.0)N N0FG+)S
+N1 P^/7&(N.*GILI1*1S
*qu" slo %emos declarado las variables constantes, prototipado las funciones
procedimientos p4blicos . +s en el cuerpo del paquete cuando escribimos el cdigo de
los subprogramas Contabili#ar $n_Obtener_%aldo.
&)+*.+ P*&^*/+ G(1O P^/7&(N.*GILI1*1 IS
-0N&.I(N fn7(btener7Saldo8codigo7cuenta C*)&I*)H9
)+.0)N N0FG+)
IS
saldo N0FG+)S
G+/IN
S+L+&. S*L1( IN.( saldo
-)(F S*L1(S
PI+)+ &(7&0+N.* ; codigo7cuentaS
return 8saldo9S
+N1S

P)(&+10)+ &ontabili'ar8mes C*)&I*)H9
IS
&0)S() c1atos8vmes C*)&I*)H9
IS
S+L+&. B
-)(F -*&.0)*&I(N
PI+)+ -R7-*&.0)*&I(N ; vmes
*N1 P+N1I+N.+7&(N.*GILIQ*) ; [S[S

fila c1atosN)(P.OP+S

G+/IN
(P+N c1atos8mes9S
L((P -+.&I c1atos IN.( filaS
+RI. PI+N c1atosNN(.-(0N1S
/B Procesamiento de los registros recuperados B/
+N1 L((PS
&L(S+ c1atosS

+R&+P.I(N
PI+N (.I+)S .I+N
)*IS+ +))()7&(N.*GILIQ*)S
+N1 &ontabili'arS
+N1 P^/7&(N.*GILI1*1S
+s posible modificar el cuerpo de un paquete sin necesidad de alterar por ello la
especificacin del mismo.
Los paquetes pueden llegar a ser programas mu complejos suelen almacenar
gran parte de la lgica de negocio.

También podría gustarte