S UBPROGRAMAS
PL/SQL
© César Martínez C.
Profesor Instructor de Base de Datos
Sede Puente Alto
DUOC
I NTRODUCCIÓN
Los subprogramas son otro tipo de bloques PL/SQL
Se diferencian de los bloques anónimos porque llevan
nombre, se almacenan en la base de datos y algunos
pueden usar parámetros
Los subprogramas que estudiaremos son:
Procedimientos Almacenados
Funciones
Triggers
P ROCEDIMIENTOS
A LMACENADOS
Los procedimientos almacenados son utilizados
para que realicen cierta operatoria pero que no
devuelven resultados al que invocó dicho
procedimiento
Sintaxis:
Create [or Replace] Procedure «nombre_proc»
[(lista_parametros)] is
…..
End [«nombre_proc»];
C ONSIDERACIONES PARA
P ROCEDIMIENTOS
A LMACENADOS
Al ocupar «Or Replace», en el caso que el procedimiento
almacenado ya se encuentre en la BD, éste se
reemplazará. En caso contrario, arrojará un error en la
compilación
No es obligatorio agregar el nombre del procedimiento al
finalizar su código
Un procedimiento almacenado posee las mismas
secciones que un bloque anónimo (declaraciones,
ejecución y excepciones). La diferencia es que la
declaración «Create…Is» reemplaza a «Declare»
Para eliminar un procedimiento almacenado se usa:
Drop procedure «nombre_procedimiento»;
E JEMPLO DE P ROCEDIMIENTO
A LMACENADO
Procedimiento
Declarado
E JECUTAR EL
P ROCEDIMIENTO
A LMACENADO
Para ejecutar el procedimiento almacenado por
código, podemos usar un bloque anónimo
PARÁMETROS PARA
P ROCEDIMIENTOS
A LMACENADOS
Los procedimientos almacenados permiten el uso de parámetros
Cada parámetro se separa por una coma (,)
Sintaxis:
«Nombre_param» |«tipo_param»| «tipo_dato»
|«opciones»|
Donde:
Nombre_param: Nombre dado al parámetro
Tipo_param: Define el tipo de parámetro
Tipo_dato: Tipo de dato dado al parámetro
Opciones: Se puede utilizar para dar un valor por defecto
al parámetro
T IPO
DE
PARÁMETROS
Los parámetros pueden ser de entrada (IN), de salida
(OUT), o ambos (IN OUT)
Parámetros IN: Son aquellos de sólo lectura que se
utilizan para ingresar valores al procedimiento. Por
defecto, en el caso que no se especifique el tipo de
parámetro, éste se asume como de entrada
Parámetros OUT: Son aquellos de escritura en donde
el procedimiento le asigna un valor para ser utilizado
posteriormente por el bloque que lo haya invocado
Parámetros IN OUT: Son aquellos que poseen todas
las características de los dos tipos anteriores
E JEMPLO U SO PARÁMETRO
DE E NTRADA
Dado el siguiente procedimiento
Se puede utilizar de la siguiente forma:
E JEMPLO U SO PARÁMETRO
DE S ALIDA
Dado el siguiente procedimiento
Se puede utilizar de la siguiente forma:
A SIGNACIÓN DE VALORES A
LOS PARÁMETROS
Para asignar valores a los parámetros
estudiaremos dos notaciones:
Posicional: Los valores son asignados en el
mismo orden en que los parámetros se
encuentran declarados
Nominal: Los valores son asignados en cualquier
orden explicitando al parámetro al cual se le está
asignando
E JEMPLO A SIGNACIÓN DE
VALORES A PARÁMETROS POR
NOTACIÓN POSICIONAL
Dado el siguiente procedimiento
La asignación de valores es de la siguiente forma:
E JEMPLO A SIGNACIÓN DE
VALORES A PARÁMETROS POR
NOTACIÓN N OMINAL
Dado el siguiente procedimiento
La asignación de valores es de la siguiente forma:
PARÁMETROS F ORMALES Y
A CTUALES
En la declaración de procedimientos que tienen
parámetros, a éstos se les conoce como
parámetros formales o ficticios
La invocación de los procedimientos, consta de
dos partes, el nombre del procedimiento y la lista
de parámetros, los que también se conocen
como parámetros actuales
F UNCIONES
A diferencia de los procedimientos almacenados, las
funciones son utilizadas para que realicen cierta
operatoria y que devuelvan un resultado al que
invocó dicha función
Sintaxis:
Create [or Replace] Function «nombre_función»
[(lista_parametros)] Return «tipo_dato» is
…..
Return |»valor»|;
End [«nombre_función»];
C ONSIDERACIONES PARA
F UNCIONES
Las consideraciones son las mismas que para los
procedimientos almacenados
Las reglas de parámetros de los procedimientos
almacenados también se aplican a las funciones.
La excepción viene dada porque sólo pueden ser
de entrada (IN)
Para eliminar una función se usa:
Drop function «nombre_función»;
E JEMPLO
Función
Declarada
DE
F UNCIÓN
E JECUTAR F UNCIÓN
Para invocar a la función, se puede realizar de distintas formas.
Por ejemplo, se puede asignar el resultado directamente en una
variable o utilizar una sentencia SELECT - INTO
T RIGGER
SOBRE
TABLAS
Los triggers (disparadores) son bloques asociados a
una tabla y que se ejecutan automáticamente cuando
ocurre una operación DML (Insert, Delete, Update)
sobre esa tabla
No es recomendable crear triggers muy complejos o
una cantidad numerosa para una tabla, ya que la
performance puede verse afectada
Un trigger no puede llevar el comando Commit o
Rollback (ni los bloques que dicho trigger invoque)
Los triggers sobre tablas no son los únicos existentes.
También existen sobre vistas, o sobre base de datos o
esquema
S INTÁXIS T RIGGER
CREATE [OR REPLACE] TRIGGER «nombre_trigger»
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
ON «nombre_tabla»
[REFERENCING OLD as «nombre_anterior», NEW as
«nombre_nuevo»]
[FOR EACH ROW [WHEN («condicion»)]]
DECLARE
…….
BEGIN
......
[EXCEPTION]
….
END «nombre_trigger»;
S INTAXIS T RIGGER
Donde:
{BEFORE|AFTER} : Indica si el trigger se ejecuta antes o después de la
sentencia que disparó al trigger
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}: Indica cual (o
cuales) evento está asociado al trigger. Opcionalmente, para el caso de
actualización se puede especificar las columnas cuya modificación dispara al
trigger
[REFERENCING OLD as «nombre_anterior», NEW as «nombre_nuevo»]:
Opcional. Asigna nombre a la forma como se referenciará a los registros
antes o despues de la ejecución del (los) evento asociado
[FOR EACH ROW [WHEN («condicion»)]]: Indica si el trigger se ejecuta a nivel
de fila, es decir, por cada registro afectado por el trigger. Opcionalmente se
puede agregar una condición para filtrar los registros afectados
E JEMPLO
Trigger
Declarado
DE TRIGGER
E JEMPLO T RIGGER
Para que se ejecute el trigger, debemos invocar la sentencia
DML asociada (insert). Consideremos que dicho trigger asigna
un identificador cada vez se ingresa un nuevo registro a la tabla
auto
Fijarse que en el insert
no se asignó valor al
campo «auto_id». Sin
embargo, en la tabla
aparece un valor. Eso
implica que nuestro
trigger ha funcionado
VARIABLES OLD
Y
NEW
Dentro del ámbito de un trigger existen dos variables que
no es necesario declararlas y ambas son de tipo
%ROWTYPE
Dichas variables contienen una copia del registro antes
(OLD) y después (NEW) de la acción de la sentencia DML
asociada (ver ejemplo del trigger anterior)
Para modificar el nombre de dichas variables se utiliza la
clausula «REFERENCING» del trigger
Estas variables son sólo válidas cuando el trigger es a nivel
de fila
VALORES PARA OLD Y NEW
Sentencia
OLD
NEW
Insert
Null
Valores a insertar
Delete
Valores originales
Null
Update
Valores Originales
Valores modificados
P REDICADOS
Dentro de un trigger se pueden utilizar
predicados, que retornan valores booleanos,
para identificar la acción que esta realizando
Inserting: Devuelve verdadero si la instrucción
que disparó el trigger fue un «Insert»
Updating: Devuelve verdadero si la instrucción
que disparó el trigger fue un «Update»
Deleting: Devuelve verdadero si la instrucción
que disparó el trigger fue un «Delete»
E JEMPLO U SO P REDICADO
E LIMINACIÓN Y
D ESACTIVACIÓN
Para eliminar un trigger se utiliza:
Para desactivar un trigger se utiliza
Alter trigger «nombre_trigger» disable;
Para activar un trigger se utiliza
Drop trigger «nombre_trigger»;
Alter trigger «nombre_trigger» enable;
Para activar todos los trigger de una tabla se utiliza
Alter table «nombre_tabla» enable all triggers;
TABLAS M UTANTES
Uno de los errores mas comunes que se producen en
la ejecución de un trigger es el de tabla mutante
Una tabla mutante es aquella que está siendo
modificada por una sentencia SQL (insert, delete,
update)
Lo anterior implica que dicha tabla no puede ser
consultada
La solución general mas recurrente (no siempre se
puede aplicar) es realizar una copia de los registros
que se modificarán por el trigger en una tabla
temporal y luego sobre esta tabla temporal realizar las
acciones requeridas
AYÚDANOS
A
M EJORAR
[email protected]
[email protected]
FIN
© César Martínez C.
Profesor Instructor de Base de Datos
Sede Puente Alto
DUOC