Descargar

Anuncio
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
Descargar