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