Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Manual oracle plsql_intermedio_2012

720 Aufrufe

Veröffentlicht am

  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Manual oracle plsql_intermedio_2012

  1. 1. División de Educación Continua – FCA – UNAM http.//dec.fca.unam.mx2012Universidad Nacional Autónoma de MéxicoFacultad de Contaduría y AdministraciónDivisión de Educación ContinuaOracle PL/SQL Intermedio[Oracle PL/SQL Intermedio]
  2. 2. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 2 de 48ContenidoContenido................................................................................................................................... 2Lista de procedimientos.............................................................................................................. 5Lista de figuras........................................................................................................................... 5Lista de tablas............................................................................................................................ 6Lista de ejemplos ....................................................................................................................... 6Objetivo...................................................................................................................................... 81. Introducción a las Unidades de Programa ........................................................................ 9Antecedentes ......................................................................................................................... 91.1. Definición................................................................................................................. 101.2. Tipos ....................................................................................................................... 101.2.1. Procedimientos........................................................................................................ 101.2.2. Funciones................................................................................................................ 101.2.3. Paquetes................................................................................................................. 101.2.4. Triggers................................................................................................................... 111.3. Ventajas .................................................................................................................. 111.3.1. Modularidad............................................................................................................. 111.3.2. Diseño sencillo de aplicaciones............................................................................... 111.3.3. Flexibilidad en el mantenimiento.............................................................................. 111.3.4. Agrupamiento en paquetes...................................................................................... 111.3.5. Reutilización............................................................................................................ 111.3.6. Mejor rendimiento.................................................................................................... 112. Crear procedimientos almacenados y funciones............................................................. 12
  3. 3. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 3 de 482.1. Procedimientos almacenados y funciones............................................................... 122.1.1. Secciones de un procedimiento o función................................................................ 122.1.1.1. Encabezado.......................................................................................................... 122.1.1.2. Sección declarativa............................................................................................... 122.1.1.3. Sección ejecutable................................................................................................ 122.1.1.4. Sección de manejo de excepciones...................................................................... 132.2. Crear y ejecutar procedimientos almacenados ........................................................ 132.2.1. Crear y ejecutar funciones....................................................................................... 152.2.2. Modos de parámetros.............................................................................................. 172.2.3. Tipos de parámetros................................................................................................ 172.2.4. Valores predeterminados para parámetros IN ......................................................... 182.2.5. Notación de parámetros por posición, por nombre y mixta ...................................... 193. Mantenimiento de Procedimientos Almacenados y Funciones ....................................... 203.1. Recompilar .............................................................................................................. 203.2. Eliminar ................................................................................................................... 213.3. Diccionario de datos................................................................................................ 214. Crear y mantener paquetes ............................................................................................ 224.1. Paquetes................................................................................................................. 224.1.1. Secciones de un paquete ........................................................................................ 234.1.1.1. Especificación....................................................................................................... 234.1.1.2. Cuerpo.................................................................................................................. 234.2. Crear paquetes........................................................................................................ 234.3. Mantener Paquetes. ................................................................................................ 264.3.1. Eliminar paquetes.................................................................................................... 274.3.2. Recompilar paquetes............................................................................................... 27
  4. 4. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 4 de 485. Triggers de bases de datos ............................................................................................ 285.1. Triggers de bases de datos ..................................................................................... 285.1.1. Introducción............................................................................................................. 285.1.2. Tareas que puede realizar un trigger....................................................................... 285.1.3. Triggers DML........................................................................................................... 295.1.4. Predicados condicionales para sentencias DML...................................................... 295.1.5. Seudoregistros OLD y NEW....................................................................................... 305.1.6. Resumen de tipos de triggers.................................................................................. 315.2. Crear triggers de bases de datos............................................................................. 315.3. Mantener triggers de bases de datos....................................................................... 345.3.1. Activar, desactivar y compilar triggers ..................................................................... 345.3.2. Consultas para obtener información sobre triggers.................................................. 35Fuentes de Información............................................................................................................ 36Bibliografía ........................................................................................................................... 36Referencias Web..................................................................... ¡Error! Marcador no definido.Anexo A. Procedimientos útiles para trabajar con Oracle Database XE ................................... 37Anexo B. Instrucciones para crear tablas de ejemplo ............................................................... 46Contacto................................................................................................................................... 48
  5. 5. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 5 de 48Lista de procedimientosProcedimiento 1. Crear espacio de trabajo y entrar al entorno de programación en SQL......... 37Procedimiento 2. Entrar al entorno de programación en SQL................................................... 41Lista de figurasFigura 1. Ejemplo de código de un programa de aplicación...................................................... 10
  6. 6. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 6 de 48Lista de tablasTabla 1. Vistas del sistema relacionadas con procedimientos y funciones ............................... 21Tabla 2. Momentos de ejecución de un trigger ......................................................................... 29Tabla 3. Predicados condicionales para determinar sentencia DML......................................... 29Tabla 4. Valores de los seudoregistros OLD y NEW ................................................................... 30Tabla 5. Resumen de tipos de triggers ..................................................................................... 31Lista de ejemplosEjemplo 1 Crear primer procedimiento para formar email......................................................... 13Ejemplo 2. Instrucciones para ejecutar un procedimiento......................................................... 14Ejemplo 3 Crear primera función para calcular cuadrado de un número................................... 16Ejemplo 4. Instrucciones para ejecutar una función.................................................................. 16Ejemplo 5. Tipo de parámetro con atributo %TYPE ................................................................... 17Ejemplo 6. Tipo de parámetro con atributo %ROWTYPE............................................................. 18Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPE............................. 18Ejemplo 8. Parámetros IN con valores predeterminados .......................................................... 19Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixta.................................. 19Ejemplo 10. Recompilar un procedimiento ............................................................................... 20Ejemplo 11. Eliminar un procedimiento y una función............................................................... 21Ejemplo 12. Consultas para obtener información sobre procedimientos y funciones ................ 22Ejemplo 13. Instrucciones para crear un paquete (especificación y cuerpo)............................. 23Ejemplo 14. Crear el primer paquete para administrar empleados ........................................... 24Ejemplo 15. Consulta para obtener información sobre paquetes.............................................. 25
  7. 7. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 7 de 48Ejemplo 16. Instrucciones para ejecutar funciones de un paquete ........................................... 26Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete................................... 26Ejemplo 18. Instrucciones para eliminar paquetes.................................................................... 27Ejemplo 19. Instrucciones para recompilar un paquete ............................................................ 27Ejemplo 20. Ejemplo de trigger con predicados condicionales ................................................. 32Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales ............... 32Ejemplo 22. Ejemplo de trigger para llevar bitácora de movimientos ........................................ 33Ejemplo 23. Activar, desactivar y compilar triggers................................................................... 34Ejemplo 24. Consultas para obtener información sobre triggers............................................... 35
  8. 8. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 8 de 48ObjetivoAl finalizar el curso, el participante será capaz de:1. Entender la estrategia de creación de unidades de programa dentro deuna base de datos.2. Crear y mantener unidades de programa dentro de una base de datos.3. Encapsular varias unidades de programa en un paquete.4. Construir y mantener triggers de bases de datos.
  9. 9. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 9 de 481. Introducción a las Unidades de ProgramaAntecedentesExisten al menos tres técnicas para interactuar con una base de datos desde los programas deaplicación (Elmasri, 2007, pp. 252 y ss.). La más utilizada es la incrustación de comandos SQL dentrode los lenguajes de programación de propósito general. Es decir, dentro de las líneas de código dellenguaje de programación se incluyen (incrustan) líneas de código del lenguaje SQL. Esta técnica esconocida como SQL embebido (embedded SQL) o SQL incrustado.La segunda técnica consiste en utilizar bibliotecas, conocidas como APIs (ApplicationProgramming Interfaces), de funciones de bases de datos. La más conocida es la biblioteca ODBC.Estas bibliotecas incluyen funciones para conectar, consultar y actualizar la base de datos.Finalmente, la tercera técnica hace uso de un lenguaje de programación de bases de datos. Enesta técnica hablamos de añadir estructuras de un lenguaje de programación de propósito general,como serían ciclos y condicionales, al lenguaje SQL, lo que da como resultado un lenguaje de basesde datos.Este curso está diseñado para conocer en buena medida la tercera de las tres técnicasmencionadas. Para tal fin haremos uso del lenguaje de programación de bases de datos PL/SQL1deOracle. Las ventajas que tiene la tercera de las técnicas con respecto a las demás serán presentadasmás adelante, especialmente en la sección 1.3.Por ahora observe y analice el siguiente ejemplo de código de un programa de aplicaciónhecho en Java. ¿Qué técnicas, de las mencionadas anteriormente, son utilizadas en el ejemplo?1Recordemos que PL/SQL es un lenguaje procedural extendido a partir del lenguaje SQL. Fuedesarrollado por Oracle para permitir portabilidad y procesamiento de transacciones. Más información enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25519/overview.htm#CEGGFECE.
  10. 10. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 10 de 48Figura 1. Ejemplo de código de un programa de aplicación1.1. DefiniciónDefiniremos una unidad de programa como un contenedor de código, es decir, objetos queguardan bloques de código PL/SQL que se encuentra almacenado en nuestra base de datos. Estasunidades de programa deben tener asociado un nombre y pueden ser ejecutada las veces que seanecesario. Además, nos permiten descomponer problemas complejos en unidades de programaciónmás simples que podemos reutilizar en varias aplicaciones2.Por otra parte, es posible incluir comandos SQL para manipulación de datos (DML) y paradefinición de datos (DDL) dentro de estas unidades de programa.1.2. TiposEn este curso nos abocaremos a cuatro tipos de unidades de programa. En seguida lasenumeramos y damos una breve descripción de cada una.1.2.1. ProcedimientosSon unidades de programa que permiten ejecutar una o varias acciones.1.2.2. FuncionesSon unidades de programa que realizan un cálculo y regresan un valor.1.2.3. PaquetesSon unidades de programa que contienen procedimientos y funciones, los cuales sonejecutados como una unidad. Podemos pensar en paquetes como aplicaciones completas.2Si desea ampliar su información sobre este tema, puede visitar el sitiohttp://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId0.
  11. 11. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 11 de 481.2.4. TriggersSon unidades de programa que se ejecutan automáticamente cuando se da un evento en labase de datos. Los triggers son ejecutados generalmente cuando se modifican los datos de una tabla1.3. VentajasUsar unidades de programa nos permite reutilizar el mismo código en varias aplicaciones orepetir su ejecución dentro de la misma aplicación. Además, nos brinda las siguientes ventajas.1.3.1. ModularidadLas unidades de programa nos permiten dividir un programa en módulos bien definidos.1.3.2. Diseño sencillo de aplicacionesAl diseñar una aplicación es posible posponer la implementación detallada de las unidades deprograma hasta que el programa principal esté definido totalmente. Después de que el programaprincipal esté definido totalmente se pueden implementar una por una las unidades de programa con elfin de hacer pruebas individuales para cada unidad.1.3.3. Flexibilidad en el mantenimientoEs posible modificar una unidad de programa sin modificar los programas que la mandanejecutar.1.3.4. Agrupamiento en paquetesLas unidades de programas pueden agruparse en paquetes, lo que mejora diversos aspectosde la implementación (se verán en la sección 4)1.3.5. ReutilizaciónVarias aplicaciones pueden utilizar la misma unidad de programa o el mismo paquete.1.3.6. Mejor rendimientoCada unidad de programa es compilada y almacenada en forma ejecutable. Esto permite quesea ejecutada varias veces de forma más ágil, ya que estas unidades de programa son ejecutadas enel servidor de bases de datos. Sólo basta una simple llamada desde una aplicación para realizarnumerosos procesamientos de datos.
  12. 12. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 12 de 48También, usar unidades de programa reduce el tráfico en la red y mejora los tiempos derespuesta. Además, las unidades de programa son compartidas entre varios usuarios, lo que reducerequerimientos de memoria y de ejecución.2. Crear procedimientos almacenados y funciones2.1. Procedimientos almacenados y funcionesComo vimos, los procedimientos almacenados y funciones son bloques de código PL/SQL quese encuentran almacenados en nuestra base de datos3. También son llamados subprogramas yambos son conocidos en la tecnología de bases de datos con el nombre genérico de procedimientosalmacenados.2.1.1. Secciones de un procedimiento o funciónEn términos generales todo procedimiento o función incluye cuatro secciones quedescribiremos a continuación.2.1.1.1. EncabezadoEspecifica el nombre y los parámetros del procedimiento o función. Los parámetros sonopcionales, esto es, el procedimiento o función puede tener o no parámetros de acuerdo al objetivopara el que fueron creados.2.1.1.2. Sección declarativaEsta sección es opcional. En ella se declaran tipos, cursores, constantes, variables,excepciones y subprogramas a nivel local. Todos los anteriores dejan de existir cuando elprocedimiento o función terminan de ejecutarse.2.1.1.3. Sección ejecutableEsta sección es obligatoria. Contiene instrucciones para asignar valores, controlar la ejecuciónde las instrucciones y manipular datos.3Si desea ver documentación en línea sobre este tema visite el sitiohttp://docs.oracle.com/cd/E11882_01/appdev.112/e25519/subprograms.htm#LNPLS008.
  13. 13. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 13 de 482.1.1.4. Sección de manejo de excepcionesEsta sección es opcional. Contiene instrucciones para manejar posibles errores de ejecución.2.2. Crear y ejecutar procedimientos almacenadosComo habíamos dejado establecido, los procedimientos almacenados permiten ejecutar una ovarias acciones. Éstos son creados con el comando CREATE PROCEDURE.Para ejecutar un procedimiento es necesario utilizar su nombre y definir valores para cada unode sus parámetros, por ejemplo aumenta_salario(12, 5000);En la instrucción anterior, los valores 12 y 5000 son parámetros del procedimiento, éstospodrían corresponder al identificador del empleado y al aumento en salario.Veamos ahora un primer ejemplo de cómo crear y ejecutar un procedimiento. Ingrese alentorno Application Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese ala sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código delEjemplo 1. Para crear el procedimiento marque las instrucciones y ejecútelas con el comandoEXECUTE.Ejemplo 1 Crear primer procedimiento para formar email-- Encabezado: nombre y parámetrosCREATE OR REPLACE PROCEDURE crear_email (nombre1 VARCHAR2,nombre2 VARCHAR2,empresa VARCHAR2)IS-- Sección declarativaemail VARCHAR2(40);mensaje_error VARCHAR2(30) := Email demasiado largo.;BEGIN -- Sección ejecutableemail := nombre1 || . || nombre2 || @ || empresa;DBMS_OUTPUT.PUT_LINE (Email: || email);EXCEPTION -- Sección para manejo de excepcionesWHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE(mensaje_error);END;/El código anterior concatena los valores de las variables nombre1, nombre2 y empresa paracrear una cuenta de correo electrónico. La cuenta de correo es almacenada en la variable email ydesplegada con el paquete DBMS_OUTPUT, que sirve para desplegar mensajes o monitorear la
  14. 14. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 14 de 48ejecución de las unidades de programas4. De hecho, se utiliza el procedimiento PUT_LINE(), quepermite desplegar una línea.También se ejemplifica el manejo de excepciones. Si el email concatenado supera los 20caracteres de la variable email, se produce un error. En ese momento el procedimiento detiene suejecución y pasa a ejecutar la sección de manejo de excepciones. En esta sección se imprime,mediante el paquete DBMS_OUTPUT y el procedimiento PUT_LINE(), un mensaje de error.Para ejecutar el procedimiento de Oracle podemos utilizar cualquiera de los grupos deinstrucciones del Ejemplo 2.Ejemplo 2. Instrucciones para ejecutar un procedimiento(1) BEGINcrear_email(Juan, Ramos, miempresa);END;/(2) EXECUTE crear_email(Juan, Ramos, miempresa);(3) DECLAREnombre VARCHAR2(20);apellido VARCHAR2(20);empresa VARCHAR2(20);BEGINnombre := Juan;apellido := Ramos;empresa := miempresa;crear_email(nombre, apellido, empresa);END;/(4) BEGINcrear_email(JuanFrancisco, RamosGutierrez, miempresacomercial);END;/4Más información sobre este paquete enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0. En SQL* Plus es necesarioactivar una variable de entorno para ver las impresiones de este paquete, el comando que debe ejecutarse esSET SERVEROUTPUT ON.
  15. 15. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 15 de 48El primer grupo de instrucciones (1) crea un bloque de programación para ejecutar elprocedimiento almacenado. Dentro de ese bloque se únicamente se llama al procedimiento utilizandosu nombre y pasando valor a sus parámetros.En el segundo caso (2) se utiliza el comando EXECUTE para ejecutar el procedimiento.Observe que no es necesario declarar un bloque de programación. Además, el punto y coma del finales opcional. Esta manera de ejecutar un procedimiento funciona en SQL*Plus, pero no puedefuncionar en el entorno gráfico.El tercer grupo de instrucciones (3) es un ejemplo en donde se declaran primero tres variables(DECLARE). Después en el bloque de programación (BEGIN) se asigna valor a estas variables.Finalmente se ejecuta el procedimiento utilizando las variables en lugar de valores.La cuarta instrucción (4) ejecuta el procedimiento con cadenas de caracteres muy largas. Estose hace con el fin de probar si el procedimiento maneja adecuadamente el error cuando el correoelectrónico rebasa el tamaño de la variable email VARCHAR2(40). Como puede ver, después deejecutar esta instrucción, Oracle responde con el mensaje de error Email demasiado largo.2.2.1. Crear y ejecutar funcionesComo dijimos arriba, las funciones realizan un cálculo y regresan un valor. Son creadas con elcomando CREATE FUNCTION.Para ejecutar una función es necesario crear una expresión donde asignemos a una variable elresultado de su ejecución, para ello debemos utilizar el nombre de la función y definir los valores paracada uno de sus parámetros, por ejemplo salario_actual := obtener_salario(12);En el ejemplo anterior, el valor 12 es el parámetro de la función obtener_salario(), esevalor correspondería al identificador del empleado, el cual nos permitiría obtener su salario yalmacenarlo en la variable salario_actual.Las funciones, a diferencia de los procedimientos, deben incluir la cláusula RETURN en lasección de encabezado para indicar el tipo de dato de retorno. Además, cualquier secuencia deprogramación dentro de la sección ejecutable debe terminar en la instrucción RETURN.Veamos ahora un primer ejemplo de cómo crear y ejecutar una función. Ingrese al entornoApplication Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese a la
  16. 16. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 16 de 48sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código delEjemplo 3. Para crear la función marque las instrucciones y ejecútelas con el comando EXECUTE.Ejemplo 3 Crear primera función para calcular cuadrado de un número-- Encabezado: nombre y parámetrosCREATE OR REPLACE FUNCTION cuadrado (base NUMBER)RETURN NUMBER -- Cláusula RETURNAS-- Sección declarativacuadrado_base NUMBER;BEGIN -- Sección ejecutablecuadrado_base := base * base;RETURN cuadrado_base; -- Instrucción RETURNEND;/El código anterior calcula el cuadrado del número introducido mediante el único parámetro de lafunción. Observe que es necesario usar la cláusula RETURN para establecer que la función regresaráun valor de tipo de dato NUMBER. Además, al interior de la sección ejecutable aparece la instrucciónRETURN para regresar el valor calculado.Para ejecutar una función de Oracle podemos utilizar cualquiera de los grupos de instruccionesdel Ejemplo 4.Ejemplo 4. Instrucciones para ejecutar una función1) BEGINDBMS_OUTPUT.PUT_LINE(cuadrado(100));END;/2) SELECT cuadrado(100) as cuadrado FROM dual;El primer grupo de instrucciones crea un bloque de programación para ejecutar la función.Dentro de ese bloque se utiliza el paquete DBMS_OUTPUT, que sirve para desplegar mensajes omonitorear la ejecución de las unidades de programas5. En especial se utiliza el procedimientoPUT_LINE(), que permite desplegar una línea.5Más información sobre este paquete enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0.
  17. 17. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 17 de 48En el segundo caso se utiliza el comando SELECT del lenguaje SQL para ejecutar la función.Observe que se hace uso de la tabla DUAL6. Esta tabla es creada automáticamente desde lainstalación de Oracle y permite calcular expresiones mediante la cláusula SELECT.2.2.2. Modos de parámetrosEl modo de un parámetro indica su comportamiento. Los modos posibles son IN, OUT e INOUT. El modo IN es el modo por defecto, indica que el parámetro pasa un valor al procedimiento ofunción. El modo OUT indica que el parámetro recibirá un valor dentro del procedimiento o función.Finalmente, el modo IN OUT indica que el parámetro pasa un valor y después recibe otro valor dentrodel procedimiento o función.Las buenas prácticas de programación recomiendan que en el caso de las funciones se eviteutilizar parámetros OUT o IN OUT, ya que la función está pensada para regresar un valor y no tienepor qué modificar los valores de los parámetros. De hecho, en Oracle si una función utiliza parámetrosIN o IN OUT los resultados pueden ser inesperados.2.2.3. Tipos de parámetrosLos parámetros de un procedimiento o función deben ser asociados a un tipo de datos. Existendos posibilidades para hacer esto. Por una parte podemos usar tipos no restringidos como NUMBER oVARCHAR2. Estos tipos no pueden declararse con un tamaño asociado, es decir, está prohibidodeclarar NUMBER(3) o VARCHAR2(40). Por otra podemos emplear tipos de datos restringidosusando los atributos %TYPE o %ROWTYPE.Declarar un parámetro con %TYPE asegura que el parámetro sea del mismo tipo que la columnaasociada al atributo %TYPE. En el Ejemplo 5 la declaración del procedimiento asigna al parámetronumero_depto el mismo tipo de datos de la columna numDepto de la tabla Empleados.Ejemplo 5. Tipo de parámetro con atributo %TYPECREATE OR REPLACE PROCEDURE aumenta_salario (numero_depto Empleados.numDepto%TYPE…6Más información sobre esta tabla enhttp://docs.oracle.com/cd/E11882_01/server.112/e26088/queries009.htm#SQLRF20036.
  18. 18. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 18 de 48Es recomendable utilizar el atributo %TYPE ya que si el tipo de datos de la columna cambia, notenemos que hacer cambios en nuestros procedimientos o funciones.El atributo %ROWTYPE crea un registro que contiene todas las columnas de la tablaespecificada. Como puede verse en el Ejemplo 6, el parámetro empleado_info es creado como unregistro con todas las columnas de la tabla Empleado.Ejemplo 6. Tipo de parámetro con atributo %ROWTYPECREATE OR REPLACE PROCEDURE aumenta_salario (empleado_info Empleados%ROWTYPE…Como comentario final de esta sección, podemos decir que las funciones pueden regresar unvalor declarado con el atributo %ROWTYPE. Veamos un ejemplo que utiliza estos tipos de datosrestringidos.Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPECREATE OR REPLACE PROCEDURE datos_empleado (id_empleado IN Empleados.idEmpleado%TYPE)ISdatos_empleado Empleados%ROWTYPE;BEGINSELECT * INTO datos_empleadoFROM EmpleadosWHERE idEmpleado = id_empleado;DBMS_OUTPUT.PUT(ID: || datos_empleado.idEmpleado);DBMS_OUTPUT.NEW_LINE;DBMS_OUTPUT.PUT(NOMBRES: || datos_empleado.nombres);DBMS_OUTPUT.NEW_LINE;DBMS_OUTPUT.PUT(APELLIDOS: || datos_empleado.apellidos);DBMS_OUTPUT.NEW_LINE;DBMS_OUTPUT.PUT(CORREO ELECTRÓNICO: || datos_empleado.correoE);DBMS_OUTPUT.NEW_LINE;END;/-- Para ejecutar el procedimientoBEGINdatos_empleado (1);END;/2.2.4. Valores predeterminados para parámetros INEs posible declarar un parámetro de modo IN con un valor predeterminado (por defecto). Unparámetro con este valor se convierte en un parámetro opcional. Esto es, si en la llamada del
  19. 19. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 19 de 48procedimiento o función se omite este parámetro, se toma el valor predeterminado. De lo anterior sedesprende que un parámetro sin valor predeterminado es un parámetro obligatorio.En el Ejemplo 8 se puede ver cómo se declaran dos parámetros opcionales: cantidad ybono, cada uno con su valor predeterminado (1000 y 500). En la llamada al procedimiento podemosomitir los valores tanto de uno, como del otro.Ejemplo 8. Parámetros IN con valores predeterminadosCREATE OR REPLACE PROCEDURE aumenta_salario_bono (id_empleado IN Empleados.idEmpleado%TYPE,cantidad IN Empleados.salario%TYPE := 1000,bono IN Empleados.salario%TYPE := 500) ISBEGINUPDATE EmpleadosSET salario = salario + cantidad + bonoWHERE idEmpleado = id_empleado;END;/-- Para ejecutar el procedimientoBEGINaumenta_salario (9); -- igual a aumenta_salario_bono(9, 1000, 500)aumenta_salario (10, 2000);-- igual a aumenta_salario_bono(10, 2000, 500)END;/-- Para consultar cambios realizadosSELECT * FROM Empleados WHERE idEmpleado IN (9, 10);2.2.5. Notación de parámetros por posición, por nombre y mixtaPodemos utilizar tres notaciones para especificar parámetros en la llamada a un procedimientoo función. La primera es por posición, que nos obliga a poner los parámetros en el mismo orden en elque fueron declarados. La segunda es por nombre, en este caso utilizamos en nombre del parámetro ylo asociamos a su valor con la siguiente sintaxis parámetro => valor. La tercera es mixta en elsentido de que permite iniciar con notación por posición y después utilizar notación pornombre.Las notaciones por nombre y mixta son empleadas cuando tenemos parámetrosopcionales. Veamos el Ejemplo 9.Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixtaCREATE OR REPLACE PROCEDURE aumenta_salario (
  20. 20. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 20 de 48id_empleado IN Empleados.idEmpleado%TYPE,cantidad IN Empleados.salario%TYPE := 1000) ISBEGINUPDATE EmpleadosSET salario = salario + cantidadWHERE idEmpleado = id_empleado;END;/BEGINaumenta_salario (5, 2000); -- por posiciónaumenta_salario (id_empleado => 6, cantidad => 2000); -- por nombreaumenta_salario (cantidad => 2000, id_empleado => 7); -- por nombreaumenta_salario (8, cantidad => 2000); -- mixtaEND;/-- Para consultar cambios realizadosSELECT * FROM Empleados WHERE idEmpleado IN (5, 6, 7, 8);3. Mantenimiento de Procedimientos Almacenados y Funciones3.1. RecompilarPara recompilar un procedimiento o función debemos utilizar los comandos ALTERPROCEDURE o ALTER FUNTION respectivamente. Es recomendable hacerlo después de modificartablas, vistas o cualquier objeto asociado a nuestro procedimiento o función. Recompilar previeneerrores de ejecución y disminuye el tiempo que toma ejecutar la unidad de programa. El muestra cómorecompilar el procedimiento aumenta_salario.Ejemplo 10. Recompilar un procedimientoALTER PROCEDURE aumenta_salario COMPILE;Es importante recordar que recompilar no significa cambiar la declaración o definición delprocedimiento o función. Para modificar estas unidades de programa es necesario eliminarlas yvolverlas a crear o bien utilizar la instrucción CREATE OR REPLACE. La cláusula OR REPLACEprimero borra el procedimiento o función (en caso de que exista) y luego lo vuelve a crear.
  21. 21. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 21 de 483.2. EliminarPara eliminar un procedimiento o función utilizamos las instrucciones SQL DROP PROCEDUREy DROP FUNCTION. Los siguientes son dos ejemplos de cómo eliminar un procedimiento y unafunción.Ejemplo 11. Eliminar un procedimiento y una funciónDROP PROCEDURE aumenta_salario;DROP FUNCTION cuadrado;3.3. Diccionario de datosOracle incluye diversas vistas en el diccionario de datos que nos dan información sobrenuestros procedimientos o funciones7. En la Tabla 1 se mencionan las principales.Tabla 1. Vistas del sistema relacionadas con procedimientos y funcionesVista del sistema DescripciónSYS.DBA_SOURCEDescribe el texto de todos los procedimientos y funciones de la basede datos.SYS.USER_SOURCEDescribe el texto de los procedimientos y funciones que pertenecen alusuario conectado actualmente.SYS.DBA_ARGUMENTSLista los argumentos de todos los procedimientos y funciones de labase de datos.SYS.USER_ARGUMENTSLista los argumentos de los procedimientos y funciones quepertenecen al usuario conectado actualmente.SYS.DBA_PROCEDURESDescribe todos los procedimientos y funciones PL/SQL de la base dedatos.SYS.USER_PROCEDURESDescribe todos los procedimientos y funciones PL/SQL quepertenecen al usuario conectado actualmente.7Para ver más información sobre las vistas y tablas del sistema visite el sitiohttp://docs.oracle.com/cd/E11882_01/timesten.112/e21644/systemtables.htm#TTSYS346.
  22. 22. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 22 de 48El Ejemplo 12 presenta cuatro consultas basadas en las vistas del sistema que mencionamosatrás. La primera (1) y segunda (2) sirven para listar todos nuestros procedimientos y funciones. Latercera (3) muestra los argumentos de cada uno. La cuarta (4) despliega el código del procedimientolínea por línea.Ejemplo 12. Consultas para obtener información sobre procedimientos y funciones(1) SELECT DISTINCT name, type FROM USER_SOURCE WHERE TYPE IN(PROCEDURE, FUNCTION) ORDER BY 2;(2) SELECT object_name, object_type FROM USER_PROCEDURESORDER BY 1;(3) SELECT object_name, argument_name, position, data_typeFROM USER_ARGUMENTS ORDER BY 1, 3;(4) SELECT line, text FROM USER_SOURCE WHERE name =AUMENTA_SALARIO ORDER BY 1;4. Crear y mantener paquetes4.1. PaquetesDefiniremos un paquete como una colección de objetos de programación (procedimientos,funciones, variables, constantes, excepciones) relacionados y almacenados como una unidad dentrode la base de datos8. Los paquetes brindan las siguientes ventajas.Permiten mejor organización de una aplicación (¿cuáles eran los procedimientos paraadministrar empleados?).Mejoran el manejo de privilegios.Es posible modificar el paquete sin recompilar los objetos que contiene (procedimientos yfunciones).Oracle puede tener múltiple acceso a objetos de programación en memoria al mismotiempo.8Más información sobre este tema enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId2 y enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS009.
  23. 23. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 23 de 48Pueden contener variables globales disponibles para las funciones y procedimientosalmacenados en el paquete.Un paquete puede contener varios procedimientos o funciones con el mismo nombre(sobrecarga), con sólo cambiar el número de argumentos o el tipo de datos.4.1.1. Secciones de un paqueteUn paquete tiene dos secciones. Cada una permite declarar o definir distintos objetos.4.1.1.1. EspecificaciónEn esta sección se declaran tipos, variables, constantes, funciones y procedimientos públicos,es decir, que son visibles al exterior del paquete.4.1.1.2. CuerpoEn esta sección se definen los objetos declarados en la especificación y los que serán privados,es decir, los que no serán visibles fuera del paquete.4.2. Crear paquetesEn esta sección revisaremos cómo crear paquetes y ejecutar objetos dentro de ellos. Cadasección de un paquete es creada con una instrucción diferente. Para la especificación utilizamos elcomando CREATE PACKAGE. Para el cuerpo del paquete usamos CREATE PACKAGE BODY. Esrecomendable usar la cláusula OR REPLACE para realizar modificaciones a nuestros paquetes. ElEjemplo 13 muestra las instrucciones completas para crear un paquete.Ejemplo 13. Instrucciones para crear un paquete (especificación y cuerpo)CREATE OR REPLACE PACKAGE nombre_paquete AS ...CREATE OR REPLACE PACKAGE BODY nombre_paquete AS ...Cuando se crea el cuerpo del paquete es necesario asegurarse de que cada procedimiento ofunción tenga los mismos parámetros que la especificación en cuanto al nombre, tipo y modo. En elcaso de las funciones también es necesario que el tipo de datos de retorno coincida en ambassecciones. Obviamente, el nombre del paquete debe ser el mismo tanto en la especificación como enel cuerpo.El Ejemplo 14 muestra cómo crear un paquete con dos procedimientos y una función. Primerose crea la especificación y después el cuerpo.
  24. 24. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 24 de 48Ejemplo 14. Crear el primer paquete para administrar empleados-- Especificación del paquete.CREATE or REPLACE PACKAGE administracion_empleadosISFUNCTION alta (nombres VARCHAR2,apellidos VARCHAR2,correoE VARCHAR2,salario NUMBER,iddepto NUMBER) RETURN NUMBER;PROCEDURE baja (empleado_id IN NUMBER);PROCEDURE aumenta_salario (empleado_id IN NUMBER,cantidad IN NUMBER);END administracion_empleados;/-- Cuerpo del paquete.CREATE OR REPLACE PACKAGE BODY administracion_empleadosISFUNCTION alta (nombres VARCHAR2,apellidos VARCHAR2,correoE VARCHAR2,salario NUMBER,iddepto NUMBER) RETURN NUMBERISnuevo_id NUMBER;BEGINnuevo_id := empleado_seq.NEXTVAL;INSERT INTO Empleados (idEmpleado,nombres,apellidos,correoE,salario,idDepto)VALUES (nuevo_id,nombres,apellidos,correoE,
  25. 25. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 25 de 48salario,iddepto);RETURN (nuevo_id);END alta;PROCEDURE baja (empleado_id IN NUMBER)ISBEGINDELETE FROM EmpleadosWHERE idEmpleado= empleado_id;IF SQL%NOTFOUND THENraise_application_error(-20011,El número de empleado no existe: || TO_CHAR(empleado_id));END IF;END baja;PROCEDURE aumenta_salario (empleado_id IN NUMBER,cantidad IN NUMBER)ISBEGINUPDATE EmpleadosSET salario = salario + cantidadWHERE idEmpleado = empleado_id;IF SQL%NOTFOUND THENraise_application_error(-20011, El número de empleado no existe: || TO_CHAR(empleado_id));END IF;END aumenta_salario;END administracion_empleados;/Para ver los paquetes que hemos creado y los subprogramas asociados podemos utilizar laconsulta del Ejemplo 15.Ejemplo 15. Consulta para obtener información sobre paquetesSELECT object_name, procedure_name FROM user_procedures WHERE object_type =PACKAGE;
  26. 26. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 26 de 48Finalmente, para ejecutar los procedimientos o funciones incluidos dentro de los paquetesutilizamos la notación nombre_paquete.nombre_procedimiento onombre_paquete.nombre_funcion. En el Ejemplo 16 y Ejemplo 17 podemos ver cómo hacerlo.Ejemplo 16. Instrucciones para ejecutar funciones de un paquete(1) DECLAREnuevo_empleado NUMBER(6);BEGINnuevo_empleado := administracion_empleados.alta(Roberto,Solís,roberto.solis@empresa.com,2500,20);DBMS_OUTPUT.PUT_LINE(El ID del nuevo empleado es: ||TO_CHAR(nuevo_empleado));END;/-- Para consultar cambios realizadosSELECT * FROM Empleados;Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete(1) BEGINadministracion_empleados.baja(11);END;/-- Para consultar cambios realizadosSELECT * FROM Empleados;(2) BEGINadministracion_empleados.aumenta_salario(1, 1000);END;/-- Para consultar cambios realizadosSELECT * FROM Empleados;4.3. Mantener Paquetes.En esta sección describiremos las instrucciones para eliminar y recompilar paquetes.
  27. 27. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 27 de 484.3.1. Eliminar paquetesPara eliminar un paquete utilizamos la instrucción DROP PACKAGE. Esta instrucción eliminatanto la especificación del paquete como su cuerpo. Si lo que queremos es eliminar un procedimiento ofunción dentro de un paquete, debemos volver a crear el paquete sin ese procedimiento o función.Es posible eliminar sólo el cuerpo de un paquete. Pare ello debemos agregar la cláusula BODY.Si esta cláusula no aparece, se entiende que se desea eliminar tanto el cuerpo como la especificación.Eliminar sólo el cuerpo permite que todos los objetos que hacen referencia al paquete permanezcanvalidos e inalterables. El Ejemplo 18 muestra cómo eliminar el cuerpo del paqueteadministracion_empleados, además muestra cómo eliminar todo el paquete.Ejemplo 18. Instrucciones para eliminar paquetesDROP PACKAGE BODY administracion_empleados;DROP PACKAGE administracion_empleados;4.3.2. Recompilar paquetesPodemos recompilar la especificación, el cuerpo o todo un paquete con el comando ALTERPACKAGE. Este tipo de recompilación se conoce como recompílación explícita y es buena idea ya quedisminuye la probabilidad de errores de ejecución y aumenta el rendimiento de la base de datos. Coneste comando son recompilados todos los procedimientos y funciones del paquete. El comando ALTERPACKAGE no cambiar la definición de un paquete, si queremos cambiarla debemos eliminarlo yvolverlo a crear. Entonces, para compilar un paquete utilizamos la instrucción ALTER PACKAGEnombre_paquete COMPILE [SPECIFICATION | BODY | PACKAGE]. El muestra cómo compilarel cuerpo del paquete administracion_empleados así como todo el paquete completo.Ejemplo 19. Instrucciones para recompilar un paqueteALTER PACKAGE administracion_empleados COMPILE;ALTER PACKAGE administracion_empleados COMPILE BODY;
  28. 28. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 28 de 485. Triggers de bases de datos5.1. Triggers de bases de datos5.1.1. IntroducciónUn trigger es una unidad de programa almacenada en la base de datos que se ejecutaautomáticamente cuando ocurre un evento9. Esto implica que no es posible mandar ejecutar un triggerde manera explícita, como se hace con los procedimientos y las funciones, sólo la base de datospuede hacerlo. Lo que sí es posible es habilitar o deshabilitar un trigger.Para crear un trigger se utiliza el comando CREATE TRIGGER. Es necesario indicar el eventoque desencadena el trigger y el objeto sobre el que actúa este evento, generalmente una tabla.También es posible indicar si el trigger se ejecuta antes o después de que el evento suceda y si eltrigger se ejecuta por cada renglón que afecta el evento.Si el trigger se crea para una tabla o vista, entonces el evento es una sentencia DML10(INSERT, DELETE, UPDATE) y se conoce como trigger DML. Por otro lado, si el trigger se crea paraun esquema o para la base de datos, entonces el evento puede ser una sentencia DDL11(CREATE,DROP) o una operación sobre la base de datos (LOGON), en este caso el trigger es llamado trigger desistema.5.1.2. Tareas que puede realizar un triggerUn trigger brinda funcionalidad a la base de datos. Permite realizar labores rutinarias y deadministración. Algunas de las principales tareas que puede realizar son:Llevar una bitácora de eventos.Recopilar estadísticas de acceso a tablas.Asegurar la integridad referencial entre tablas almacenadas en distintos nodos de una basede datos distribuida.9Más información sobre triggers de bases de datos enhttp://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS020.10DML, del inglés Data Manipulation Language.11DDL, del inglés Data Definition Language.
  29. 29. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 29 de 48Prevenir modificaciones a los datos en horarios fuera de lo normal.Prevenir transacciones inválidas.Obligar a que se cumplan reglas de negocio que no pueden asegurarse con restriccionesde integridad (constraints).5.1.3. Triggers DMLUn trigger DML es creado para una tabla o vista y se ejecuta automáticamente cuando se da unevento de INSERT, DELETE o UPDATE. Este tipo de trigger puede ejecutarse en cuatro momentos quese muestran en la Tabla 2.Tabla 2. Momentos de ejecución de un triggerNombre Momento de ejecuciónBEFORE trigger a nivel de sentencia Antes de que el evento sea ejecutadoAFTER trigger a nivel de sentencia Después de que el evento sea ejecutadoBEFORE trigger a nivel de renglón Antes de cada renglón que afecta el evento.AFTER trigger a nivel de renglón Después de cada renglón que afecta el evento.Un trigger DML ejecutado por una sentencia UPDATE puede llevar una lista de columnas, demanera tal que el trigger sólo se ejecutará si alguna de esas columnas es modificada.5.1.4. Predicados condicionales para sentencias DMLLos trigger DML pueden declararse para ser ejecutados por una sentencia DML o por varias deellas, incluso por las tres. Dada esta situación, resulta conveniente conocer qué sentenciadesencadenó la ejecución del trigger. Esto se puede saber gracias a cuatro predicados condicionalesque almacenan el valor de TRUE de acuerdo a la sentencia que desencadenó el trigger (véase Tabla3).Tabla 3. Predicados condicionales para determinar sentencia DMLPredicado condicional Almacena TRUE cuando
  30. 30. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 30 de 48INSERTING Un INSERT desencadenó el trigger.UPDATING Un UPDATE desencadenó el trigger.UPDATING(columna) Un UPDATE en la columna especificada desencadenó el trigger.DELETING Un DELETE en la columna especificada desencadenó el trigger.5.1.5. Seudoregistros OLD y NEWSi un trigger se ejecuta para cada renglón que afecta la sentencia DML, el trigger tiene accesoa los datos del renglón que está siendo afectado. Dicho acceso se logra mediante los seudoregistrosOLD y NEW. La manera de hacer referencia a un valor de estos seudoregistros es mediante lainstrucción :seudoregistro.nombre_campo, por ejemplo, :NEW.idEmpleado. Los valores quetoman estos seudoregistros dependen de la sentencia que desencadenó el trigger y son mostrados enla Tabla 4.Tabla 4. Valores de los seudoregistros OLD y NEWSentencia Valor de OLD.nombre_campo Valor de NEW.nombre_campoINSERT NULL Valores posteriores al INSERTUPDATE Valores previos al UPDATE Valores posteriores al UPDATEDELETE Valores previos al DELETE NULLPara hacer buen uso de los seudoregistros debemos cuidar las siguientes restricciones.No es posible usar el seudoregistro sin nombre de columna, por ejemplo, esta instrucciónestá prohibida :NEW := NULL.Un seudoregistro no puede pasar como parámetro.Un trigger no puede cambiar los valores del seudoregistro OLD.Un DELETE trigger no puede cambiar los valores del seudoregistro NEW.
  31. 31. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 31 de 48Un AFTER trigger no puede cambiar los valores del seudoregistro NEW, ya que la sentenciaDML se ejecuta antes del trigger.Un BEFORE trigger puede cambiar los valores del seudoregistro NEW antes de que lasentencia INSERT o UPDATE los cambien en la tabla.5.1.6. Resumen de tipos de triggersEn la Tabla 5 se ofrece un resumen de los tipos de triggers posibles de acuerdo a lascaracterísticas discutidas. Sirva esta tabla como referencia para discusiones posteriores. Recuerdeque es posible la combinación de categorías.Tabla 5. Resumen de tipos de triggersCategoría Descripción Tipos de triggersSentencia Evento DML que desencadena el trigger INSERT triggerDELETE triggerUPDATE triggerMomento Antes o después del evento que desencadena eltriggerBEFORE triggerAFTER triggerNivel Nivel de afectación del evento DML. Indica si eltrigger se ejecuta por la sentencia o por cada renglónafectado.Trigger a nivel de renglónTrigger a nivel de sentenciaObjetoasociadoObjeto al que afecta el evento, pueden ser tablas yvistas, o esquemas y base de datos.Trigger DMLTrigger de sistema5.2. Crear triggers de bases de datosEn esta sección se darán ejemplos de cómo crear triggers con las características expuestas enlos apartados anteriores.El muestra las instrucciones para crear un trigger que utiliza los predicados condicionales paraindicar, mediante la impresión de un letrero, qué evento lo desencadenó.
  32. 32. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 32 de 48Ejemplo 20. Ejemplo de trigger con predicados condicionalesCREATE OR REPLACE TRIGGER trg_predicadosBEFOREINSERT ORUPDATE OF salario, idDepto ORDELETEON EmpleadosBEGINCASEWHEN INSERTING THENDBMS_OUTPUT.PUT_LINE(Trigger desencadenado por INSERT);WHEN UPDATING(salario) THENDBMS_OUTPUT.PUT_LINE(Trigger desencadenado por UPDATE de salario);WHEN UPDATING(idDepto) THENDBMS_OUTPUT.PUT_LINE(Trigger desencadenado por UPDATE de idDepto);WHEN DELETING THENDBMS_OUTPUT.PUT_LINE(Trigger desencadenado por DELETE);END CASE;END;/Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales(1) -- Desencadenar trigger por INSERTDECLAREnuevo_empleado NUMBER(6);BEGINnuevo_empleado := administracion_empleados.alta(Andrea,Preciado,andre.preciado@empresa.com,19000,30);DBMS_OUTPUT.PUT_LINE(El ID del nuevo empleado es: ||TO_CHAR(nuevo_empleado));END;/(2) -- Desencadenar trigger por DELETEBEGINadministracion_empleados.baja(12);END;/(3) -- Desencadenar trigger por UPDATE de salarioBEGINadministracion_empleados.aumenta_salario(1, 1000);END;/-- Desencadenar trigger por UPDATE de idDepto
  33. 33. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 33 de 48UPDATE empleados SET idDepto=20 WHERE idEmpleado=1;Ejemplo 22. Ejemplo de trigger para llevar bitácora de movimientos—- Crear tabla bitácora—- DROP TABLE bitac_salarios;CREATE TABLE bitac_salarios (idEmpleado NUMBER,fecha_mov TIMESTAMP,salario_nuevo NUMBER,salario_anterior NUMBER);-- Crear trigger para llevar bitácora de movimientosCREATE OR REPLACE TRIGGER tri_bitacora_salarioAFTER UPDATE OF salario ON EmpleadosFOR EACH ROWBEGININSERT INTO bitac_salarios (idEmpleado, fecha_mov, salario_nuevo,salario_anterior)VALUES (:NEW.idEmpleado, SYSDATE, :NEW.salario, :OLD.salario);END;/—- Desencadenar trigger modificando salarioBEGINadministracion_empleados.aumenta_salario(1, 1000);END;/—- Revisar registro de movimientos en bitácoraSELECT * FROM bitac_salarios;—- Desencadenar trigger modificando salario para varios registrosUPDATE EmpleadosSET salario = salario + 1000WHERE idDepto = 20;—- Revisar registro de movimientos en bitácoraSELECT * FROM bitac_salarios;
  34. 34. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 34 de 485.3. Mantener triggers de bases de datosEn esta sección revisaremos algunas opciones para el mantenimiento de triggers.Específicamente, aquellos comandos para activar, desactivar, compilar y eliminar triggers. Además,ponemos algunas consultas al diccionario de datos que son útiles para obtener información sobrenuestros triggers.5.3.1. Activar, desactivar y compilar triggersEl comando ALTER TRIGGER permite activar, desactivar y compilar triggers12. No sirve paramodificar la definición de un trigger, para ello es necesario eliminarlo y volverlo a crear, o utilizar lainstrucción CREATE OR REPLACE TRIGGER.La instrucción general es ALTER TRIGGER nombre_trigger [ENABLE | DISABLE |COMPILE ]. El Ejemplo 23 muestra algunas instrucciones asociadas a este comando.Ejemplo 23. Activar, desactivar y compilar triggers-- Desactivar un triggerALTER TRIGGER trg_predicados DISABLE;-- Ejecutar DML sobre tabla para verificar si se dispara el trigger.BEGINadministracion_empleados.aumenta_salario(1, 1000);END;/-- Activar un triggerALTER TRIGGER trg_predicados ENABLE;-- Ejecutar DML sobre tabla para verificar si se dispara el trigger.BEGINadministracion_empleados.aumenta_salario(1, 1000);END;/-- Compilar un triggerALTER TRIGGER trg_predicados COMPILE;Las principales razones por las que un trigger es desactivado son:Cargar datos en una tabla de manera rápida, evitando que se desencadenen los triggersasociados.12Para desactivar todos los triggers de una tabla utilice el comando ALTER TABLE nombre_tabla [ENABLE | DISABLE ] ALL TRIGGERS.
  35. 35. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 35 de 48Volver a cargar los datos en una tabla.5.3.2. Consultas para obtener información sobre triggersEn el Ejemplo 24 podemos encontrar dos consultas que nos muestran información sobrenuestros triggers. La primera muestra algunas características de un trigger específico, para ello haceuso de la vista de sistema USER_TRIGGERS. La segunda muestra las primeras líneas del cuerpo deltrigger, haciendo uso de la misma vista de sistema13.Ejemplo 24. Consultas para obtener información sobre triggers-- Características de un trigger.SELECT Trigger_type, Triggering_event, Table_name, StatusFROM USER_TRIGGERSWHERE Trigger_name = TRG_PREDICADOS;-- Muestra las primeras líneas del cuerpo del triggerSELECT Trigger_bodyFROM USER_TRIGGERSWHERE Trigger_name = TRG_PREDICADOS;13Para ver el cuerpo completo del trigger puede ejecutar la instrucción "SET LONG 10000".
  36. 36. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 36 de 48Fuentes de InformaciónBibliografíaElmasri, R. y Navathe, S. (2007). Fundamentos de sistemas de bases de datos. Madrid:Pearson Educación.
  37. 37. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 37 de 48Anexo A. Procedimientos útiles para trabajar con Oracle DatabaseXEEn este anexo podrá encontrar varios procedimientos útiles para el trabajo de programación enOracle Database XE. Estos procedimientos se incluyen en este material a manera de apoyo.Procedimiento 1. Crear espacio de trabajo y entrar al entorno de programación en SQL1. Desde el botón Iniciar seleccione la opción Get Started del grupo Oracle Database 11gExpress Edition. Esta opción abrirá su navegador predeterminado y le dará acceso alentorno de trabajo de Oracle.2. En el entorno de trabajo de Oracle seleccione la opción Application Express.
  38. 38. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 38 de 483. Lo anterior dará como resultado una página de acceso. Ingrese en la caja de textoUsername el nombre de usuario SYS y en la caja de texto Password la palabra curso.Luego presione el botón Login. Lo anterior le dará acceso al sistema como el usuario deadministración SYS.4. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio detrabajo. Asegúrese de poner los siguientes datos. Luego presione el botón CreateWorkspace.a. Database User: Create Newb. Database Username: CURSODECc. Application Express Username: cursodecd. Password: curso100%e. Confirm Password: curso100%
  39. 39. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 39 de 485. Oracle le confirmará la creación exitosa de su espacio de trabajo y le brindará la opción deingresar con el usuario que creó. Haga clic en To begin, click here to login, para ingresar ala página de acceso de su espacio de trabajo.6. En la página de acceso de su espacio de trabajo llene las cajas de texto con la informaciónque proporcionó en el paso 4 y presione el botón Login.
  40. 40. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 40 de 487. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQLseleccione la opción SQL Commands del menú SQL Workshop.8. El paso anterior abre la página de programación en SQL, en donde realizaremos todos losejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucciónSELECT * FROM demo_customers; luego márquela y presione el botón Run. Comoresultado deberán desplegarse varios registros en la parte inferior de la página, como se veen la siguiente figura. Si puede ver estos registros está listo para comenzar a programar enSQL.
  41. 41. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 41 de 48Procedimiento 2. Entrar al entorno de programación en SQLEste procedimiento se realiza siempre y cuando ya haya creado su espacio de trabajo. Sino ha creado su espacio de trabajo, realice el Procedimiento 1.1. Desde el botón Iniciar seleccione la opción Get Started del grupo Oracle Database 11gExpress Edition. Esta opción abrirá su navegador predeterminado y le dará acceso alentorno de trabajo de Oracle.
  42. 42. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 42 de 482. En el entorno de trabajo de Oracle seleccione la opción Application Express.3. Lo anterior dará como resultado una página de acceso. Ingrese en la caja de textoUsername el nombre de usuario SYS y en la caja de texto Password la palabra curso.Luego presione el botón Login. Lo anterior le dará acceso al sistema como el usuario deadministración SYS.
  43. 43. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 43 de 484. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio detrabajo (si no ha creado su espacio de trabajo realice el Procedimiento 1). Dado que ustedya ha creado su espacio de trabajo, debe seleccionar la opción Already have an account?Login Here, que se encuentra del lado derecho de la página (sección Getting Started). Estole permitirá ingresar a la página de acceso de su espacio de trabajo.5. En la página de acceso de su espacio de trabajo llene las cajas de texto con la siguienteinformación. Luego presione el botón Login.a. Workspace: CURSODECb. Username: cursodecc. Password: curso100%
  44. 44. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 44 de 486. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQLseleccione la opción SQL Commands del menú SQL Workshop.7. El paso anterior abre la página de programación en SQL, en donde realizaremos todos losejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucciónSELECT * FROM demo_customers; luego márquela y presione el botón Run. Comoresultado deberán desplegarse varios registros en la parte inferior de la página, como se veen la siguiente figura. Si puede ver estos registros está listo para comenzar a programar enSQL.
  45. 45. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 45 de 48
  46. 46. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 46 de 48Anexo B. Instrucciones para crear tablas de ejemplo—- DROP SEQUENCE empleado_seq;CREATE SEQUENCE empleado_seqSTART WITH 1INCREMENT BY 1;—- DROP TABLE Empleados;CREATE TABLE Empleados (idEmpleado NUMERIC PRIMARY KEY,nombres VARCHAR2(40),apellidos VARCHAR2(40),correoE VARCHAR(40),salario NUMERIC,idDepto NUMERIC);-- DELETE FROM Empleados;INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Marlene, Acosta, macosta@empresa.com, 7000, 10);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Carolina, Buelna, cbuelna@empresa.com , 6800,10);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Eva, Montes, emontes@empresa.com , 8000, 10);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Laura, Trejo, ltrejo@empresa.com , 15000, 20);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Miguel, Romero, mromero@empresa.com , 18500,20);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Norma, Zola, nzola@empresa.com , 19000, 20);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Patricia, Chávez, pchavez@empresa.com , 10000,30);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Sonia, Humm, shumm@empresa.com , 25000, 30);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Victor, Ibarra, vibarra@empresa.com , 9500, 30);INSERT INTO EmpleadosVALUES(empleado_seq.NEXTVAL, Mónica, Gómez, mgomez@empresa.com , 12000, 30);—- SELECT * FROM Empleados;-- La siguiente imagen muestra el resultado esperado.
  47. 47. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 47 de 48
  48. 48. Oracle PL/SQL IntermedioDivisión de Educación ContinuaLiverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322Página: http://dec.fca.unam.mxPágina 48 de 48ContactoPara cualquier duda o aclaración puede contactarnos en:01-800-8-DEC-FCA01-800-8-332-322Teléfonos(55) 5514 4948, (55) 5514 4794Conmutador(55) 5533 1617 al 19Jefe de la DivisiónMtro. Eric M. Rivera Riveraerivera@dec.fca.unam.mxSubjefa de la DivisiónMtra. Adriana Arias Cedilloaarias@dec.fca.unam.mxCoordinador AdministrativoLic. Héctor Mauricio Moguel Martínezhmoguel@dec.fca.unam.mxCoordinador AcadémicoLic. Gabriel Guevara Gutiérrezgguevara@dec.fca.unam.mx

×