SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
División de Educación Continua – FCA – UNAM http.//dec.fca.unam.mx
2012
Universidad Nacional Autónoma de México
Facultad de Contaduría y Administración
División de Educación Continua
Oracle PL/SQL Intermedio
[Oracle PL/SQL Intermedio]
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 2 de 48
Contenido
Contenido................................................................................................................................... 2
Lista de procedimientos.............................................................................................................. 5
Lista de figuras........................................................................................................................... 5
Lista de tablas............................................................................................................................ 6
Lista de ejemplos ....................................................................................................................... 6
Objetivo...................................................................................................................................... 8
1. Introducción a las Unidades de Programa ........................................................................ 9
Antecedentes ......................................................................................................................... 9
1.1. Definición................................................................................................................. 10
1.2. Tipos ....................................................................................................................... 10
1.2.1. Procedimientos........................................................................................................ 10
1.2.2. Funciones................................................................................................................ 10
1.2.3. Paquetes................................................................................................................. 10
1.2.4. Triggers................................................................................................................... 11
1.3. Ventajas .................................................................................................................. 11
1.3.1. Modularidad............................................................................................................. 11
1.3.2. Diseño sencillo de aplicaciones............................................................................... 11
1.3.3. Flexibilidad en el mantenimiento.............................................................................. 11
1.3.4. Agrupamiento en paquetes...................................................................................... 11
1.3.5. Reutilización............................................................................................................ 11
1.3.6. Mejor rendimiento.................................................................................................... 11
2. Crear procedimientos almacenados y funciones............................................................. 12
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 3 de 48
2.1. Procedimientos almacenados y funciones............................................................... 12
2.1.1. Secciones de un procedimiento o función................................................................ 12
2.1.1.1. Encabezado.......................................................................................................... 12
2.1.1.2. Sección declarativa............................................................................................... 12
2.1.1.3. Sección ejecutable................................................................................................ 12
2.1.1.4. Sección de manejo de excepciones...................................................................... 13
2.2. Crear y ejecutar procedimientos almacenados ........................................................ 13
2.2.1. Crear y ejecutar funciones....................................................................................... 15
2.2.2. Modos de parámetros.............................................................................................. 17
2.2.3. Tipos de parámetros................................................................................................ 17
2.2.4. Valores predeterminados para parámetros IN ......................................................... 18
2.2.5. Notación de parámetros por posición, por nombre y mixta ...................................... 19
3. Mantenimiento de Procedimientos Almacenados y Funciones ....................................... 20
3.1. Recompilar .............................................................................................................. 20
3.2. Eliminar ................................................................................................................... 21
3.3. Diccionario de datos................................................................................................ 21
4. Crear y mantener paquetes ............................................................................................ 22
4.1. Paquetes................................................................................................................. 22
4.1.1. Secciones de un paquete ........................................................................................ 23
4.1.1.1. Especificación....................................................................................................... 23
4.1.1.2. Cuerpo.................................................................................................................. 23
4.2. Crear paquetes........................................................................................................ 23
4.3. Mantener Paquetes. ................................................................................................ 26
4.3.1. Eliminar paquetes.................................................................................................... 27
4.3.2. Recompilar paquetes............................................................................................... 27
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 4 de 48
5. Triggers de bases de datos ............................................................................................ 28
5.1. Triggers de bases de datos ..................................................................................... 28
5.1.1. Introducción............................................................................................................. 28
5.1.2. Tareas que puede realizar un trigger....................................................................... 28
5.1.3. Triggers DML........................................................................................................... 29
5.1.4. Predicados condicionales para sentencias DML...................................................... 29
5.1.5. Seudoregistros OLD y NEW....................................................................................... 30
5.1.6. Resumen de tipos de triggers.................................................................................. 31
5.2. Crear triggers de bases de datos............................................................................. 31
5.3. Mantener triggers de bases de datos....................................................................... 34
5.3.1. Activar, desactivar y compilar triggers ..................................................................... 34
5.3.2. Consultas para obtener información sobre triggers.................................................. 35
Fuentes de Información............................................................................................................ 36
Bibliografía ........................................................................................................................... 36
Referencias Web..................................................................... ¡Error! Marcador no definido.
Anexo A. Procedimientos útiles para trabajar con Oracle Database XE ................................... 37
Anexo B. Instrucciones para crear tablas de ejemplo ............................................................... 46
Contacto................................................................................................................................... 48
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 5 de 48
Lista de procedimientos
Procedimiento 1. Crear espacio de trabajo y entrar al entorno de programación en SQL......... 37
Procedimiento 2. Entrar al entorno de programación en SQL................................................... 41
Lista de figuras
Figura 1. Ejemplo de código de un programa de aplicación...................................................... 10
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 6 de 48
Lista de tablas
Tabla 1. Vistas del sistema relacionadas con procedimientos y funciones ............................... 21
Tabla 2. Momentos de ejecución de un trigger ......................................................................... 29
Tabla 3. Predicados condicionales para determinar sentencia DML......................................... 29
Tabla 4. Valores de los seudoregistros OLD y NEW ................................................................... 30
Tabla 5. Resumen de tipos de triggers ..................................................................................... 31
Lista de ejemplos
Ejemplo 1 Crear primer procedimiento para formar email......................................................... 13
Ejemplo 2. Instrucciones para ejecutar un procedimiento......................................................... 14
Ejemplo 3 Crear primera función para calcular cuadrado de un número................................... 16
Ejemplo 4. Instrucciones para ejecutar una función.................................................................. 16
Ejemplo 5. Tipo de parámetro con atributo %TYPE ................................................................... 17
Ejemplo 6. Tipo de parámetro con atributo %ROWTYPE............................................................. 18
Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPE............................. 18
Ejemplo 8. Parámetros IN con valores predeterminados .......................................................... 19
Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixta.................................. 19
Ejemplo 10. Recompilar un procedimiento ............................................................................... 20
Ejemplo 11. Eliminar un procedimiento y una función............................................................... 21
Ejemplo 12. Consultas para obtener información sobre procedimientos y funciones ................ 22
Ejemplo 13. Instrucciones para crear un paquete (especificación y cuerpo)............................. 23
Ejemplo 14. Crear el primer paquete para administrar empleados ........................................... 24
Ejemplo 15. Consulta para obtener información sobre paquetes.............................................. 25
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 7 de 48
Ejemplo 16. Instrucciones para ejecutar funciones de un paquete ........................................... 26
Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete................................... 26
Ejemplo 18. Instrucciones para eliminar paquetes.................................................................... 27
Ejemplo 19. Instrucciones para recompilar un paquete ............................................................ 27
Ejemplo 20. Ejemplo de trigger con predicados condicionales ................................................. 32
Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales ............... 32
Ejemplo 22. Ejemplo de trigger para llevar bitácora de movimientos ........................................ 33
Ejemplo 23. Activar, desactivar y compilar triggers................................................................... 34
Ejemplo 24. Consultas para obtener información sobre triggers............................................... 35
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 8 de 48
Objetivo
Al finalizar el curso, el participante será capaz de:
1. Entender la estrategia de creación de unidades de programa dentro de
una 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.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 9 de 48
1. Introducción a las Unidades de Programa
Antecedentes
Existen al menos tres técnicas para interactuar con una base de datos desde los programas de
aplicación (Elmasri, 2007, pp. 252 y ss.). La más utilizada es la incrustación de comandos SQL dentro
de los lenguajes de programación de propósito general. Es decir, dentro de las líneas de código del
lenguaje de programación se incluyen (incrustan) líneas de código del lenguaje SQL. Esta técnica es
conocida como SQL embebido (embedded SQL) o SQL incrustado.
La segunda técnica consiste en utilizar bibliotecas, conocidas como APIs (Application
Programming 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. En
esta 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 bases
de datos.
Este curso está diseñado para conocer en buena medida la tercera de las tres técnicas
mencionadas. Para tal fin haremos uso del lenguaje de programación de bases de datos PL/SQL1
de
Oracle. Las ventajas que tiene la tercera de las técnicas con respecto a las demás serán presentadas
má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ón
hecho en Java. ¿Qué técnicas, de las mencionadas anteriormente, son utilizadas en el ejemplo?
1
Recordemos que PL/SQL es un lenguaje procedural extendido a partir del lenguaje SQL. Fue
desarrollado por Oracle para permitir portabilidad y procesamiento de transacciones. Más información en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/overview.htm#CEGGFECE.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 10 de 48
Figura 1. Ejemplo de código de un programa de aplicación
1.1. Definición
Definiremos una unidad de programa como un contenedor de código, es decir, objetos que
guardan bloques de código PL/SQL que se encuentra almacenado en nuestra base de datos. Estas
unidades de programa deben tener asociado un nombre y pueden ser ejecutada las veces que sea
necesario. Además, nos permiten descomponer problemas complejos en unidades de programación
más simples que podemos reutilizar en varias aplicaciones2
.
Por otra parte, es posible incluir comandos SQL para manipulación de datos (DML) y para
definición de datos (DDL) dentro de estas unidades de programa.
1.2. Tipos
En este curso nos abocaremos a cuatro tipos de unidades de programa. En seguida las
enumeramos y damos una breve descripción de cada una.
1.2.1. Procedimientos
Son unidades de programa que permiten ejecutar una o varias acciones.
1.2.2. Funciones
Son unidades de programa que realizan un cálculo y regresan un valor.
1.2.3. Paquetes
Son unidades de programa que contienen procedimientos y funciones, los cuales son
ejecutados como una unidad. Podemos pensar en paquetes como aplicaciones completas.
2
Si desea ampliar su información sobre este tema, puede visitar el sitio
http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId0.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 11 de 48
1.2.4. Triggers
Son unidades de programa que se ejecutan automáticamente cuando se da un evento en la
base de datos. Los triggers son ejecutados generalmente cuando se modifican los datos de una tabla
1.3. Ventajas
Usar unidades de programa nos permite reutilizar el mismo código en varias aplicaciones o
repetir su ejecución dentro de la misma aplicación. Además, nos brinda las siguientes ventajas.
1.3.1. Modularidad
Las unidades de programa nos permiten dividir un programa en módulos bien definidos.
1.3.2. Diseño sencillo de aplicaciones
Al diseñar una aplicación es posible posponer la implementación detallada de las unidades de
programa hasta que el programa principal esté definido totalmente. Después de que el programa
principal esté definido totalmente se pueden implementar una por una las unidades de programa con el
fin de hacer pruebas individuales para cada unidad.
1.3.3. Flexibilidad en el mantenimiento
Es posible modificar una unidad de programa sin modificar los programas que la mandan
ejecutar.
1.3.4. Agrupamiento en paquetes
Las unidades de programas pueden agruparse en paquetes, lo que mejora diversos aspectos
de la implementación (se verán en la sección 4)
1.3.5. Reutilización
Varias aplicaciones pueden utilizar la misma unidad de programa o el mismo paquete.
1.3.6. Mejor rendimiento
Cada unidad de programa es compilada y almacenada en forma ejecutable. Esto permite que
sea ejecutada varias veces de forma más ágil, ya que estas unidades de programa son ejecutadas en
el servidor de bases de datos. Sólo basta una simple llamada desde una aplicación para realizar
numerosos procesamientos de datos.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 12 de 48
También, usar unidades de programa reduce el tráfico en la red y mejora los tiempos de
respuesta. Además, las unidades de programa son compartidas entre varios usuarios, lo que reduce
requerimientos de memoria y de ejecución.
2. Crear procedimientos almacenados y funciones
2.1. Procedimientos almacenados y funciones
Como vimos, los procedimientos almacenados y funciones son bloques de código PL/SQL que
se encuentran almacenados en nuestra base de datos3
. También son llamados subprogramas y
ambos son conocidos en la tecnología de bases de datos con el nombre genérico de procedimientos
almacenados.
2.1.1. Secciones de un procedimiento o función
En términos generales todo procedimiento o función incluye cuatro secciones que
describiremos a continuación.
2.1.1.1. Encabezado
Especifica el nombre y los parámetros del procedimiento o función. Los parámetros son
opcionales, esto es, el procedimiento o función puede tener o no parámetros de acuerdo al objetivo
para el que fueron creados.
2.1.1.2. Sección declarativa
Esta 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 el
procedimiento o función terminan de ejecutarse.
2.1.1.3. Sección ejecutable
Esta sección es obligatoria. Contiene instrucciones para asignar valores, controlar la ejecución
de las instrucciones y manipular datos.
3
Si desea ver documentación en línea sobre este tema visite el sitio
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/subprograms.htm#LNPLS008.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 13 de 48
2.1.1.4. Sección de manejo de excepciones
Esta sección es opcional. Contiene instrucciones para manejar posibles errores de ejecución.
2.2. Crear y ejecutar procedimientos almacenados
Como habíamos dejado establecido, los procedimientos almacenados permiten ejecutar una o
varias acciones. Éstos son creados con el comando CREATE PROCEDURE.
Para ejecutar un procedimiento es necesario utilizar su nombre y definir valores para cada uno
de sus parámetros, por ejemplo aumenta_salario(12, 5000);
En la instrucción anterior, los valores 12 y 5000 son parámetros del procedimiento, éstos
podrí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 al
entorno Application Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese a
la sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código del
Ejemplo 1. Para crear el procedimiento marque las instrucciones y ejecútelas con el comando
EXECUTE.
Ejemplo 1 Crear primer procedimiento para formar email
-- Encabezado: nombre y parámetros
CREATE OR REPLACE PROCEDURE crear_email (
nombre1 VARCHAR2,
nombre2 VARCHAR2,
empresa VARCHAR2
)
IS
-- Sección declarativa
email VARCHAR2(40);
mensaje_error VARCHAR2(30) := 'Email demasiado largo.';
BEGIN -- Sección ejecutable
email := nombre1 || '.' || nombre2 || '@' || empresa;
DBMS_OUTPUT.PUT_LINE ('Email: ' || email);
EXCEPTION -- Sección para manejo de excepciones
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE(mensaje_error);
END;
/
El código anterior concatena los valores de las variables nombre1, nombre2 y empresa para
crear una cuenta de correo electrónico. La cuenta de correo es almacenada en la variable email y
desplegada con el paquete DBMS_OUTPUT, que sirve para desplegar mensajes o monitorear la
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 14 de 48
ejecución de las unidades de programas4
. De hecho, se utiliza el procedimiento PUT_LINE(), que
permite desplegar una línea.
También se ejemplifica el manejo de excepciones. Si el email concatenado supera los 20
caracteres de la variable email, se produce un error. En ese momento el procedimiento detiene su
ejecució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 de
instrucciones del Ejemplo 2.
Ejemplo 2. Instrucciones para ejecutar un procedimiento
(1) BEGIN
crear_email('Juan', 'Ramos', 'miempresa');
END;
/
(2) EXECUTE crear_email('Juan', 'Ramos', 'miempresa');
(3) DECLARE
nombre VARCHAR2(20);
apellido VARCHAR2(20);
empresa VARCHAR2(20);
BEGIN
nombre := 'Juan';
apellido := 'Ramos';
empresa := 'miempresa';
crear_email(nombre, apellido, empresa);
END;
/
(4) BEGIN
crear_email('JuanFrancisco', 'RamosGutierrez', 'miempresacomercial');
END;
/
4
Más información sobre este paquete en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0. En SQL* Plus es necesario
activar una variable de entorno para ver las impresiones de este paquete, el comando que debe ejecutarse es
SET SERVEROUTPUT ON.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 15 de 48
El primer grupo de instrucciones (1) crea un bloque de programación para ejecutar el
procedimiento almacenado. Dentro de ese bloque se únicamente se llama al procedimiento utilizando
su 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 final
es opcional. Esta manera de ejecutar un procedimiento funciona en SQL*Plus, pero no puede
funcionar 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. Esto
se hace con el fin de probar si el procedimiento maneja adecuadamente el error cuando el correo
electrónico rebasa el tamaño de la variable email VARCHAR2(40). Como puede ver, después de
ejecutar esta instrucción, Oracle responde con el mensaje de error Email demasiado largo.
2.2.1. Crear y ejecutar funciones
Como dijimos arriba, las funciones realizan un cálculo y regresan un valor. Son creadas con el
comando CREATE FUNCTION.
Para ejecutar una función es necesario crear una expresión donde asignemos a una variable el
resultado de su ejecución, para ello debemos utilizar el nombre de la función y definir los valores para
cada 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(), ese
valor correspondería al identificador del empleado, el cual nos permitiría obtener su salario y
almacenarlo en la variable salario_actual.
Las funciones, a diferencia de los procedimientos, deben incluir la cláusula RETURN en la
sección de encabezado para indicar el tipo de dato de retorno. Además, cualquier secuencia de
programació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 entorno
Application Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese a la
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 16 de 48
sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código del
Ejemplo 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ámetros
CREATE OR REPLACE FUNCTION cuadrado (base NUMBER)
RETURN NUMBER -- Cláusula RETURN
AS
-- Sección declarativa
cuadrado_base NUMBER;
BEGIN -- Sección ejecutable
cuadrado_base := base * base;
RETURN cuadrado_base; -- Instrucción RETURN
END;
/
El código anterior calcula el cuadrado del número introducido mediante el único parámetro de la
funció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ón
RETURN para regresar el valor calculado.
Para ejecutar una función de Oracle podemos utilizar cualquiera de los grupos de instrucciones
del Ejemplo 4.
Ejemplo 4. Instrucciones para ejecutar una función
1) BEGIN
DBMS_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 o
monitorear la ejecución de las unidades de programas5
. En especial se utiliza el procedimiento
PUT_LINE(), que permite desplegar una línea.
5
Más información sobre este paquete en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 17 de 48
En 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 la
instalación de Oracle y permite calcular expresiones mediante la cláusula SELECT.
2.2.2. Modos de parámetros
El modo de un parámetro indica su comportamiento. Los modos posibles son IN, OUT e IN
OUT. El modo IN es el modo por defecto, indica que el parámetro pasa un valor al procedimiento o
funció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 dentro
del procedimiento o función.
Las buenas prácticas de programación recomiendan que en el caso de las funciones se evite
utilizar parámetros OUT o IN OUT, ya que la función está pensada para regresar un valor y no tiene
por qué modificar los valores de los parámetros. De hecho, en Oracle si una función utiliza parámetros
IN o IN OUT los resultados pueden ser inesperados.
2.2.3. Tipos de parámetros
Los parámetros de un procedimiento o función deben ser asociados a un tipo de datos. Existen
dos posibilidades para hacer esto. Por una parte podemos usar tipos no restringidos como NUMBER o
VARCHAR2. Estos tipos no pueden declararse con un tamaño asociado, es decir, está prohibido
declarar NUMBER(3) o VARCHAR2(40). Por otra podemos emplear tipos de datos restringidos
usando los atributos %TYPE o %ROWTYPE.
Declarar un parámetro con %TYPE asegura que el parámetro sea del mismo tipo que la columna
asociada al atributo %TYPE. En el Ejemplo 5 la declaración del procedimiento asigna al parámetro
numero_depto el mismo tipo de datos de la columna numDepto de la tabla Empleados.
Ejemplo 5. Tipo de parámetro con atributo %TYPE
CREATE OR REPLACE PROCEDURE aumenta_salario (
numero_depto Empleados.numDepto%TYPE
…
6
Más información sobre esta tabla en
http://docs.oracle.com/cd/E11882_01/server.112/e26088/queries009.htm#SQLRF20036.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 18 de 48
Es recomendable utilizar el atributo %TYPE ya que si el tipo de datos de la columna cambia, no
tenemos que hacer cambios en nuestros procedimientos o funciones.
El atributo %ROWTYPE crea un registro que contiene todas las columnas de la tabla
especificada. Como puede verse en el Ejemplo 6, el parámetro empleado_info es creado como un
registro con todas las columnas de la tabla Empleado.
Ejemplo 6. Tipo de parámetro con atributo %ROWTYPE
CREATE OR REPLACE PROCEDURE aumenta_salario (
empleado_info Empleados%ROWTYPE
…
Como comentario final de esta sección, podemos decir que las funciones pueden regresar un
valor declarado con el atributo %ROWTYPE. Veamos un ejemplo que utiliza estos tipos de datos
restringidos.
Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPE
CREATE OR REPLACE PROCEDURE datos_empleado (
id_empleado IN Empleados.idEmpleado%TYPE
)
IS
datos_empleado Empleados%ROWTYPE;
BEGIN
SELECT * INTO datos_empleado
FROM Empleados
WHERE 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 procedimiento
BEGIN
datos_empleado (1);
END;
/
2.2.4. Valores predeterminados para parámetros IN
Es posible declarar un parámetro de modo IN con un valor predeterminado (por defecto). Un
parámetro con este valor se convierte en un parámetro opcional. Esto es, si en la llamada del
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 19 de 48
procedimiento o función se omite este parámetro, se toma el valor predeterminado. De lo anterior se
desprende 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 y
bono, cada uno con su valor predeterminado (1000 y 500). En la llamada al procedimiento podemos
omitir los valores tanto de uno, como del otro.
Ejemplo 8. Parámetros IN con valores predeterminados
CREATE OR REPLACE PROCEDURE aumenta_salario_bono (
id_empleado IN Empleados.idEmpleado%TYPE,
cantidad IN Empleados.salario%TYPE := 1000,
bono IN Empleados.salario%TYPE := 500
) IS
BEGIN
UPDATE Empleados
SET salario = salario + cantidad + bono
WHERE idEmpleado = id_empleado;
END;
/
-- Para ejecutar el procedimiento
BEGIN
aumenta_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 realizados
SELECT * FROM Empleados WHERE idEmpleado IN (9, 10);
2.2.5. Notación de parámetros por posición, por nombre y mixta
Podemos utilizar tres notaciones para especificar parámetros en la llamada a un procedimiento
o función. La primera es por posición, que nos obliga a poner los parámetros en el mismo orden en el
que fueron declarados. La segunda es por nombre, en este caso utilizamos en nombre del parámetro y
lo asociamos a su valor con la siguiente sintaxis parámetro => valor. La tercera es mixta en el
sentido de que permite iniciar con notación por posición y después utilizar notación por
nombre.
Las notaciones por nombre y mixta son empleadas cuando tenemos parámetros
opcionales. Veamos el Ejemplo 9.
Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixta
CREATE OR REPLACE PROCEDURE aumenta_salario (
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 20 de 48
id_empleado IN Empleados.idEmpleado%TYPE,
cantidad IN Empleados.salario%TYPE := 1000
) IS
BEGIN
UPDATE Empleados
SET salario = salario + cantidad
WHERE idEmpleado = id_empleado;
END;
/
BEGIN
aumenta_salario (5, 2000); -- por posición
aumenta_salario (id_empleado => 6, cantidad => 2000); -- por nombre
aumenta_salario (cantidad => 2000, id_empleado => 7); -- por nombre
aumenta_salario (8, cantidad => 2000); -- mixta
END;
/
-- Para consultar cambios realizados
SELECT * FROM Empleados WHERE idEmpleado IN (5, 6, 7, 8);
3. Mantenimiento de Procedimientos Almacenados y Funciones
3.1. Recompilar
Para recompilar un procedimiento o función debemos utilizar los comandos ALTER
PROCEDURE o ALTER FUNTION respectivamente. Es recomendable hacerlo después de modificar
tablas, vistas o cualquier objeto asociado a nuestro procedimiento o función. Recompilar previene
errores de ejecución y disminuye el tiempo que toma ejecutar la unidad de programa. El muestra cómo
recompilar el procedimiento aumenta_salario.
Ejemplo 10. Recompilar un procedimiento
ALTER PROCEDURE aumenta_salario COMPILE;
Es importante recordar que recompilar no significa cambiar la declaración o definición del
procedimiento o función. Para modificar estas unidades de programa es necesario eliminarlas y
volverlas a crear o bien utilizar la instrucción CREATE OR REPLACE. La cláusula OR REPLACE
primero borra el procedimiento o función (en caso de que exista) y luego lo vuelve a crear.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 21 de 48
3.2. Eliminar
Para eliminar un procedimiento o función utilizamos las instrucciones SQL DROP PROCEDURE
y DROP FUNCTION. Los siguientes son dos ejemplos de cómo eliminar un procedimiento y una
función.
Ejemplo 11. Eliminar un procedimiento y una función
DROP PROCEDURE aumenta_salario;
DROP FUNCTION cuadrado;
3.3. Diccionario de datos
Oracle incluye diversas vistas en el diccionario de datos que nos dan información sobre
nuestros procedimientos o funciones7
. En la Tabla 1 se mencionan las principales.
Tabla 1. Vistas del sistema relacionadas con procedimientos y funciones
Vista del sistema Descripción
SYS.DBA_SOURCE
Describe el texto de todos los procedimientos y funciones de la base
de datos.
SYS.USER_SOURCE
Describe el texto de los procedimientos y funciones que pertenecen al
usuario conectado actualmente.
SYS.DBA_ARGUMENTS
Lista los argumentos de todos los procedimientos y funciones de la
base de datos.
SYS.USER_ARGUMENTS
Lista los argumentos de los procedimientos y funciones que
pertenecen al usuario conectado actualmente.
SYS.DBA_PROCEDURES
Describe todos los procedimientos y funciones PL/SQL de la base de
datos.
SYS.USER_PROCEDURES
Describe todos los procedimientos y funciones PL/SQL que
pertenecen al usuario conectado actualmente.
7
Para ver más información sobre las vistas y tablas del sistema visite el sitio
http://docs.oracle.com/cd/E11882_01/timesten.112/e21644/systemtables.htm#TTSYS346.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 22 de 48
El Ejemplo 12 presenta cuatro consultas basadas en las vistas del sistema que mencionamos
atrás. La primera (1) y segunda (2) sirven para listar todos nuestros procedimientos y funciones. La
tercera (3) muestra los argumentos de cada uno. La cuarta (4) despliega el código del procedimiento
lí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_PROCEDURES
ORDER BY 1;
(3) SELECT object_name, argument_name, position, data_type
FROM USER_ARGUMENTS ORDER BY 1, 3;
(4) SELECT line, text FROM USER_SOURCE WHERE name =
'AUMENTA_SALARIO' ORDER BY 1;
4. Crear y mantener paquetes
4.1. Paquetes
Definiremos un paquete como una colección de objetos de programación (procedimientos,
funciones, variables, constantes, excepciones) relacionados y almacenados como una unidad dentro
de la base de datos8
. Los paquetes brindan las siguientes ventajas.
Permiten mejor organización de una aplicación (¿cuáles eran los procedimientos para
administrar empleados?).
Mejoran el manejo de privilegios.
Es posible modificar el paquete sin recompilar los objetos que contiene (procedimientos y
funciones).
Oracle puede tener múltiple acceso a objetos de programación en memoria al mismo
tiempo.
8
Más información sobre este tema en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId2 y en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS009.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 23 de 48
Pueden contener variables globales disponibles para las funciones y procedimientos
almacenados 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 paquete
Un paquete tiene dos secciones. Cada una permite declarar o definir distintos objetos.
4.1.1.1. Especificación
En 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. Cuerpo
En 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 paquetes
En esta sección revisaremos cómo crear paquetes y ejecutar objetos dentro de ellos. Cada
sección de un paquete es creada con una instrucción diferente. Para la especificación utilizamos el
comando CREATE PACKAGE. Para el cuerpo del paquete usamos CREATE PACKAGE BODY. Es
recomendable usar la cláusula OR REPLACE para realizar modificaciones a nuestros paquetes. El
Ejemplo 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 o
función tenga los mismos parámetros que la especificación en cuanto al nombre, tipo y modo. En el
caso de las funciones también es necesario que el tipo de datos de retorno coincida en ambas
secciones. Obviamente, el nombre del paquete debe ser el mismo tanto en la especificación como en
el cuerpo.
El Ejemplo 14 muestra cómo crear un paquete con dos procedimientos y una función. Primero
se crea la especificación y después el cuerpo.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 24 de 48
Ejemplo 14. Crear el primer paquete para administrar empleados
-- Especificación del paquete.
CREATE or REPLACE PACKAGE administracion_empleados
IS
FUNCTION 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_empleados
IS
FUNCTION alta (
nombres VARCHAR2,
apellidos VARCHAR2,
correoE VARCHAR2,
salario NUMBER,
iddepto NUMBER
) RETURN NUMBER
IS
nuevo_id NUMBER;
BEGIN
nuevo_id := empleado_seq.NEXTVAL;
INSERT INTO Empleados (
idEmpleado,
nombres,
apellidos,
correoE,
salario,
idDepto
)
VALUES (
nuevo_id,
nombres,
apellidos,
correoE,
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 25 de 48
salario,
iddepto
);
RETURN (nuevo_id);
END alta;
PROCEDURE baja (
empleado_id IN NUMBER
)
IS
BEGIN
DELETE FROM Empleados
WHERE idEmpleado= empleado_id;
IF SQL%NOTFOUND THEN
raise_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
)
IS
BEGIN
UPDATE Empleados
SET salario = salario + cantidad
WHERE idEmpleado = empleado_id;
IF SQL%NOTFOUND THEN
raise_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 la
consulta del Ejemplo 15.
Ejemplo 15. Consulta para obtener información sobre paquetes
SELECT object_name, procedure_name FROM user_procedures WHERE object_type =
'PACKAGE';
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 26 de 48
Finalmente, para ejecutar los procedimientos o funciones incluidos dentro de los paquetes
utilizamos la notación nombre_paquete.nombre_procedimiento o
nombre_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) DECLARE
nuevo_empleado NUMBER(6);
BEGIN
nuevo_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 realizados
SELECT * FROM Empleados;
Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete
(1) BEGIN
administracion_empleados.baja(11);
END;
/
-- Para consultar cambios realizados
SELECT * FROM Empleados;
(2) BEGIN
administracion_empleados.aumenta_salario(1, 1000);
END;
/
-- Para consultar cambios realizados
SELECT * FROM Empleados;
4.3. Mantener Paquetes.
En esta sección describiremos las instrucciones para eliminar y recompilar paquetes.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 27 de 48
4.3.1. Eliminar paquetes
Para eliminar un paquete utilizamos la instrucción DROP PACKAGE. Esta instrucción elimina
tanto la especificación del paquete como su cuerpo. Si lo que queremos es eliminar un procedimiento o
funció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 permanezcan
validos e inalterables. El Ejemplo 18 muestra cómo eliminar el cuerpo del paquete
administracion_empleados, además muestra cómo eliminar todo el paquete.
Ejemplo 18. Instrucciones para eliminar paquetes
DROP PACKAGE BODY administracion_empleados;
DROP PACKAGE administracion_empleados;
4.3.2. Recompilar paquetes
Podemos recompilar la especificación, el cuerpo o todo un paquete con el comando ALTER
PACKAGE. Este tipo de recompilación se conoce como recompílación explícita y es buena idea ya que
disminuye la probabilidad de errores de ejecución y aumenta el rendimiento de la base de datos. Con
este comando son recompilados todos los procedimientos y funciones del paquete. El comando ALTER
PACKAGE no cambiar la definición de un paquete, si queremos cambiarla debemos eliminarlo y
volverlo a crear. Entonces, para compilar un paquete utilizamos la instrucción ALTER PACKAGE
nombre_paquete COMPILE [SPECIFICATION | BODY | PACKAGE]. El muestra cómo compilar
el cuerpo del paquete administracion_empleados así como todo el paquete completo.
Ejemplo 19. Instrucciones para recompilar un paquete
ALTER PACKAGE administracion_empleados COMPILE;
ALTER PACKAGE administracion_empleados COMPILE BODY;
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 28 de 48
5. Triggers de bases de datos
5.1. Triggers de bases de datos
5.1.1. Introducción
Un trigger es una unidad de programa almacenada en la base de datos que se ejecuta
automáticamente cuando ocurre un evento9
. Esto implica que no es posible mandar ejecutar un trigger
de manera explícita, como se hace con los procedimientos y las funciones, sólo la base de datos
puede 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 evento
que 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 el
trigger 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 para
un 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 de
sistema.
5.1.2. Tareas que puede realizar un trigger
Un trigger brinda funcionalidad a la base de datos. Permite realizar labores rutinarias y de
administració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 base
de datos distribuida.
9
Más información sobre triggers de bases de datos en
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS020.
10
DML, del inglés Data Manipulation Language.
11
DDL, del inglés Data Definition Language.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 29 de 48
Prevenir 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 restricciones
de integridad (constraints).
5.1.3. Triggers DML
Un trigger DML es creado para una tabla o vista y se ejecuta automáticamente cuando se da un
evento de INSERT, DELETE o UPDATE. Este tipo de trigger puede ejecutarse en cuatro momentos que
se muestran en la Tabla 2.
Tabla 2. Momentos de ejecución de un trigger
Nombre Momento de ejecución
BEFORE trigger a nivel de sentencia Antes de que el evento sea ejecutado
AFTER trigger a nivel de sentencia Después de que el evento sea ejecutado
BEFORE 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, de
manera tal que el trigger sólo se ejecutará si alguna de esas columnas es modificada.
5.1.4. Predicados condicionales para sentencias DML
Los trigger DML pueden declararse para ser ejecutados por una sentencia DML o por varias de
ellas, incluso por las tres. Dada esta situación, resulta conveniente conocer qué sentencia
desencadenó la ejecución del trigger. Esto se puede saber gracias a cuatro predicados condicionales
que almacenan el valor de TRUE de acuerdo a la sentencia que desencadenó el trigger (véase Tabla
3).
Tabla 3. Predicados condicionales para determinar sentencia DML
Predicado condicional Almacena TRUE cuando
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 30 de 48
INSERTING 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 NEW
Si un trigger se ejecuta para cada renglón que afecta la sentencia DML, el trigger tiene acceso
a los datos del renglón que está siendo afectado. Dicho acceso se logra mediante los seudoregistros
OLD y NEW. La manera de hacer referencia a un valor de estos seudoregistros es mediante la
instrucción :seudoregistro.nombre_campo, por ejemplo, :NEW.idEmpleado. Los valores que
toman estos seudoregistros dependen de la sentencia que desencadenó el trigger y son mostrados en
la Tabla 4.
Tabla 4. Valores de los seudoregistros OLD y NEW
Sentencia Valor de OLD.nombre_campo Valor de NEW.nombre_campo
INSERT NULL Valores posteriores al INSERT
UPDATE Valores previos al UPDATE Valores posteriores al UPDATE
DELETE Valores previos al DELETE NULL
Para 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ón
está 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.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 31 de 48
Un AFTER trigger no puede cambiar los valores del seudoregistro NEW, ya que la sentencia
DML se ejecuta antes del trigger.
Un BEFORE trigger puede cambiar los valores del seudoregistro NEW antes de que la
sentencia INSERT o UPDATE los cambien en la tabla.
5.1.6. Resumen de tipos de triggers
En la Tabla 5 se ofrece un resumen de los tipos de triggers posibles de acuerdo a las
características discutidas. Sirva esta tabla como referencia para discusiones posteriores. Recuerde
que es posible la combinación de categorías.
Tabla 5. Resumen de tipos de triggers
Categoría Descripción Tipos de triggers
Sentencia Evento DML que desencadena el trigger INSERT trigger
DELETE trigger
UPDATE trigger
Momento Antes o después del evento que desencadena el
trigger
BEFORE trigger
AFTER trigger
Nivel Nivel de afectación del evento DML. Indica si el
trigger se ejecuta por la sentencia o por cada renglón
afectado.
Trigger a nivel de renglón
Trigger a nivel de sentencia
Objeto
asociado
Objeto al que afecta el evento, pueden ser tablas y
vistas, o esquemas y base de datos.
Trigger DML
Trigger de sistema
5.2. Crear triggers de bases de datos
En esta sección se darán ejemplos de cómo crear triggers con las características expuestas en
los apartados anteriores.
El muestra las instrucciones para crear un trigger que utiliza los predicados condicionales para
indicar, mediante la impresión de un letrero, qué evento lo desencadenó.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 32 de 48
Ejemplo 20. Ejemplo de trigger con predicados condicionales
CREATE OR REPLACE TRIGGER trg_predicados
BEFORE
INSERT OR
UPDATE OF salario, idDepto OR
DELETE
ON Empleados
BEGIN
CASE
WHEN INSERTING THEN
DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por INSERT');
WHEN UPDATING('salario') THEN
DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por UPDATE de salario');
WHEN UPDATING('idDepto') THEN
DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por UPDATE de idDepto');
WHEN DELETING THEN
DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por DELETE');
END CASE;
END;
/
Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales
(1) -- Desencadenar trigger por INSERT
DECLARE
nuevo_empleado NUMBER(6);
BEGIN
nuevo_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 DELETE
BEGIN
administracion_empleados.baja(12);
END;
/
(3) -- Desencadenar trigger por UPDATE de salario
BEGIN
administracion_empleados.aumenta_salario(1, 1000);
END;
/
-- Desencadenar trigger por UPDATE de idDepto
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 33 de 48
UPDATE 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 movimientos
CREATE OR REPLACE TRIGGER tri_bitacora_salario
AFTER UPDATE OF salario ON Empleados
FOR EACH ROW
BEGIN
INSERT INTO bitac_salarios (idEmpleado, fecha_mov, salario_nuevo,
salario_anterior)
VALUES (:NEW.idEmpleado, SYSDATE, :NEW.salario, :OLD.salario);
END;
/
—- Desencadenar trigger modificando salario
BEGIN
administracion_empleados.aumenta_salario(1, 1000);
END;
/
—- Revisar registro de movimientos en bitácora
SELECT * FROM bitac_salarios;
—- Desencadenar trigger modificando salario para varios registros
UPDATE Empleados
SET salario = salario + 1000
WHERE idDepto = 20;
—- Revisar registro de movimientos en bitácora
SELECT * FROM bitac_salarios;
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 34 de 48
5.3. Mantener triggers de bases de datos
En 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 sobre
nuestros triggers.
5.3.1. Activar, desactivar y compilar triggers
El comando ALTER TRIGGER permite activar, desactivar y compilar triggers12
. No sirve para
modificar la definición de un trigger, para ello es necesario eliminarlo y volverlo a crear, o utilizar la
instrucció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 trigger
ALTER TRIGGER trg_predicados DISABLE;
-- Ejecutar DML sobre tabla para verificar si se dispara el trigger.
BEGIN
administracion_empleados.aumenta_salario(1, 1000);
END;
/
-- Activar un trigger
ALTER TRIGGER trg_predicados ENABLE;
-- Ejecutar DML sobre tabla para verificar si se dispara el trigger.
BEGIN
administracion_empleados.aumenta_salario(1, 1000);
END;
/
-- Compilar un trigger
ALTER 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 triggers
asociados.
12
Para desactivar todos los triggers de una tabla utilice el comando ALTER TABLE nombre_tabla [
ENABLE | DISABLE ] ALL TRIGGERS.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 35 de 48
Volver a cargar los datos en una tabla.
5.3.2. Consultas para obtener información sobre triggers
En el Ejemplo 24 podemos encontrar dos consultas que nos muestran información sobre
nuestros triggers. La primera muestra algunas características de un trigger específico, para ello hace
uso de la vista de sistema USER_TRIGGERS. La segunda muestra las primeras líneas del cuerpo del
trigger, 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, Status
FROM USER_TRIGGERS
WHERE Trigger_name = 'TRG_PREDICADOS';
-- Muestra las primeras líneas del cuerpo del trigger
SELECT Trigger_body
FROM USER_TRIGGERS
WHERE Trigger_name = 'TRG_PREDICADOS';
13
Para ver el cuerpo completo del trigger puede ejecutar la instrucción "SET LONG 10000".
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 36 de 48
Fuentes de Información
Bibliografía
Elmasri, R. y Navathe, S. (2007). Fundamentos de sistemas de bases de datos. Madrid:
Pearson Educación.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 37 de 48
Anexo A. Procedimientos útiles para trabajar con Oracle Database
XE
En este anexo podrá encontrar varios procedimientos útiles para el trabajo de programación en
Oracle 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 SQL
1. Desde el botón Iniciar seleccione la opción Get Started del grupo Oracle Database 11g
Express Edition. Esta opción abrirá su navegador predeterminado y le dará acceso al
entorno de trabajo de Oracle.
2. En el entorno de trabajo de Oracle seleccione la opción Application Express.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 38 de 48
3. Lo anterior dará como resultado una página de acceso. Ingrese en la caja de texto
Username 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 de
administración SYS.
4. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio de
trabajo. Asegúrese de poner los siguientes datos. Luego presione el botón Create
Workspace.
a. Database User: Create New
b. Database Username: CURSODEC
c. Application Express Username: cursodec
d. Password: curso100%
e. Confirm Password: curso100%
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 39 de 48
5. Oracle le confirmará la creación exitosa de su espacio de trabajo y le brindará la opción de
ingresar con el usuario que creó. Haga clic en To begin, click here to login, para ingresar a
la 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ón
que proporcionó en el paso 4 y presione el botón Login.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 40 de 48
7. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQL
seleccione 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 los
ejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucción
SELECT * FROM demo_customers; luego márquela y presione el botón Run. Como
resultado deberán desplegarse varios registros en la parte inferior de la página, como se ve
en la siguiente figura. Si puede ver estos registros está listo para comenzar a programar en
SQL.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 41 de 48
Procedimiento 2. Entrar al entorno de programación en SQL
Este procedimiento se realiza siempre y cuando ya haya creado su espacio de trabajo. Si
no 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 11g
Express Edition. Esta opción abrirá su navegador predeterminado y le dará acceso al
entorno de trabajo de Oracle.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 42 de 48
2. 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 texto
Username 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 de
administración SYS.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 43 de 48
4. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio de
trabajo (si no ha creado su espacio de trabajo realice el Procedimiento 1). Dado que usted
ya 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). Esto
le 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 siguiente
información. Luego presione el botón Login.
a. Workspace: CURSODEC
b. Username: cursodec
c. Password: curso100%
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 44 de 48
6. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQL
seleccione 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 los
ejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucción
SELECT * FROM demo_customers; luego márquela y presione el botón Run. Como
resultado deberán desplegarse varios registros en la parte inferior de la página, como se ve
en la siguiente figura. Si puede ver estos registros está listo para comenzar a programar en
SQL.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 45 de 48
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 46 de 48
Anexo B. Instrucciones para crear tablas de ejemplo
—- DROP SEQUENCE empleado_seq;
CREATE SEQUENCE empleado_seq
START WITH 1
INCREMENT 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 Empleados
VALUES(empleado_seq.NEXTVAL, 'Marlene', 'Acosta', 'macosta@empresa.com', 7000, 10);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Carolina', 'Buelna', 'cbuelna@empresa.com ', 6800,
10);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Eva', 'Montes', 'emontes@empresa.com ', 8000, 10);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Laura', 'Trejo', 'ltrejo@empresa.com ', 15000, 20);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Miguel', 'Romero', 'mromero@empresa.com ', 18500,
20);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Norma', 'Zola', 'nzola@empresa.com ', 19000, 20);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Patricia', 'Chávez', 'pchavez@empresa.com ', 10000,
30);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Sonia', 'Humm', 'shumm@empresa.com ', 25000, 30);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Victor', 'Ibarra', 'vibarra@empresa.com ', 9500, 30);
INSERT INTO Empleados
VALUES(empleado_seq.NEXTVAL, 'Mónica', 'Gómez', 'mgomez@empresa.com ', 12000, 30);
—- SELECT * FROM Empleados;
-- La siguiente imagen muestra el resultado esperado.
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 47 de 48
Oracle PL/SQL Intermedio
División de Educación Continua
Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322
Página: http://dec.fca.unam.mx
Página 48 de 48
Contacto
Para cualquier duda o aclaración puede contactarnos en:
01-800-8-DEC-FCA
01-800-8-332-322
Teléfonos
(55) 5514 4948, (55) 5514 4794
Conmutador
(55) 5533 1617 al 19
Jefe de la División
Mtro. Eric M. Rivera Rivera
erivera@dec.fca.unam.mx
Subjefa de la División
Mtra. Adriana Arias Cedillo
aarias@dec.fca.unam.mx
Coordinador Administrativo
Lic. Héctor Mauricio Moguel Martínez
hmoguel@dec.fca.unam.mx
Coordinador Académico
Lic. Gabriel Guevara Gutiérrez
gguevara@dec.fca.unam.mx

Weitere ähnliche Inhalte

Was ist angesagt?

Excel avanzado. Cuaderno de Ejercicios y Practicas
Excel avanzado. Cuaderno de Ejercicios y PracticasExcel avanzado. Cuaderno de Ejercicios y Practicas
Excel avanzado. Cuaderno de Ejercicios y PracticasConalep Puebla III
 
Programacion
ProgramacionProgramacion
Programaciongeopaloma
 
Manual de Convivencia Colegio Divino Salvador
Manual de Convivencia Colegio Divino SalvadorManual de Convivencia Colegio Divino Salvador
Manual de Convivencia Colegio Divino Salvadorjimmy.leal
 
El ciclo de oraciones de Ifá
El ciclo de oraciones de IfáEl ciclo de oraciones de Ifá
El ciclo de oraciones de IfáMarte Edgar
 
Guia usuario abnaq.
Guia usuario abnaq.Guia usuario abnaq.
Guia usuario abnaq.axel_rafael
 
Portafolio computacion basica 2 carla chuchuca
Portafolio computacion basica 2   carla chuchucaPortafolio computacion basica 2   carla chuchuca
Portafolio computacion basica 2 carla chuchucaCarla Jimènez
 
Síndromes genéticos asociados a los cromosomas
Síndromes genéticos asociados a los cromosomasSíndromes genéticos asociados a los cromosomas
Síndromes genéticos asociados a los cromosomasLin Toalombo
 

Was ist angesagt? (15)

Excel avanzado. Cuaderno de Ejercicios y Practicas
Excel avanzado. Cuaderno de Ejercicios y PracticasExcel avanzado. Cuaderno de Ejercicios y Practicas
Excel avanzado. Cuaderno de Ejercicios y Practicas
 
Programacion
ProgramacionProgramacion
Programacion
 
Manual de Convivencia Colegio Divino Salvador
Manual de Convivencia Colegio Divino SalvadorManual de Convivencia Colegio Divino Salvador
Manual de Convivencia Colegio Divino Salvador
 
TUTORIAL COMPUTACION BASICA II
TUTORIAL COMPUTACION BASICA IITUTORIAL COMPUTACION BASICA II
TUTORIAL COMPUTACION BASICA II
 
El ciclo de oraciones de Ifá
El ciclo de oraciones de IfáEl ciclo de oraciones de Ifá
El ciclo de oraciones de Ifá
 
Guia usuario abnaq.
Guia usuario abnaq.Guia usuario abnaq.
Guia usuario abnaq.
 
Profecciones
ProfeccionesProfecciones
Profecciones
 
Portafolio computacion basica 2 carla chuchuca
Portafolio computacion basica 2   carla chuchucaPortafolio computacion basica 2   carla chuchuca
Portafolio computacion basica 2 carla chuchuca
 
Manual excel intermedio v1.0
Manual excel intermedio v1.0Manual excel intermedio v1.0
Manual excel intermedio v1.0
 
Modulo 1
Modulo 1Modulo 1
Modulo 1
 
Mi mejor pc
Mi mejor pc Mi mejor pc
Mi mejor pc
 
Modulo 3
Modulo 3Modulo 3
Modulo 3
 
Síndromes genéticos asociados a los cromosomas
Síndromes genéticos asociados a los cromosomasSíndromes genéticos asociados a los cromosomas
Síndromes genéticos asociados a los cromosomas
 
Modulo 2
Modulo 2Modulo 2
Modulo 2
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 

Andere mochten auch

Equipo # 5 el acuerdo nacional basada para la modernizacion de
Equipo # 5 el acuerdo nacional basada para la modernizacion deEquipo # 5 el acuerdo nacional basada para la modernizacion de
Equipo # 5 el acuerdo nacional basada para la modernizacion deelviravitorin
 
Planeación tomado en cuenta la accesibilidad
Planeación tomado en cuenta la accesibilidadPlaneación tomado en cuenta la accesibilidad
Planeación tomado en cuenta la accesibilidadAlejandra Reynoso
 
Ley 1273 del 2009 ley de delitos informáticos
Ley 1273 del 2009 ley de delitos informáticosLey 1273 del 2009 ley de delitos informáticos
Ley 1273 del 2009 ley de delitos informáticosmoli1999
 
Unidad 7 elaboracion de manuales de organizacion original
Unidad 7 elaboracion de manuales de organizacion originalUnidad 7 elaboracion de manuales de organizacion original
Unidad 7 elaboracion de manuales de organizacion originalAlejandro Gordillo Hernandez
 
Fondo de Inclusión Social Energético (FISE) Electro Tocache
Fondo de Inclusión Social Energético (FISE) Electro TocacheFondo de Inclusión Social Energético (FISE) Electro Tocache
Fondo de Inclusión Social Energético (FISE) Electro TocacheJoseOlivera2014
 
Presentacionenpowerpoint 100204081935-phpapp02
Presentacionenpowerpoint 100204081935-phpapp02Presentacionenpowerpoint 100204081935-phpapp02
Presentacionenpowerpoint 100204081935-phpapp02Nick Salazar
 
Exámen práctico informática
Exámen práctico informáticaExámen práctico informática
Exámen práctico informáticaelBolacas
 
Estrategias esenciales
Estrategias esenciales Estrategias esenciales
Estrategias esenciales Leide Aviles
 
Bachillerato general digital diana laura
Bachillerato general digital diana lauraBachillerato general digital diana laura
Bachillerato general digital diana laurapinheda
 
Por qué debes escogernos para vender tu propiedad
Por qué debes escogernos para vender tu propiedadPor qué debes escogernos para vender tu propiedad
Por qué debes escogernos para vender tu propiedadInmobiliaria San Fernando
 
"Elogi del viure", y el equipo Restaurant Casa Calvet
"Elogi del viure", y el equipo Restaurant Casa Calvet"Elogi del viure", y el equipo Restaurant Casa Calvet
"Elogi del viure", y el equipo Restaurant Casa CalvetRestaurant Casa Calvet
 
Exposicion 1 rafael
Exposicion 1 rafaelExposicion 1 rafael
Exposicion 1 rafaeljulioc77
 

Andere mochten auch (20)

Presentación1
Presentación1Presentación1
Presentación1
 
Urban360 en tsn14
Urban360 en tsn14Urban360 en tsn14
Urban360 en tsn14
 
Toma fotográfica
Toma fotográficaToma fotográfica
Toma fotográfica
 
Equipo # 5 el acuerdo nacional basada para la modernizacion de
Equipo # 5 el acuerdo nacional basada para la modernizacion deEquipo # 5 el acuerdo nacional basada para la modernizacion de
Equipo # 5 el acuerdo nacional basada para la modernizacion de
 
Planeación tomado en cuenta la accesibilidad
Planeación tomado en cuenta la accesibilidadPlaneación tomado en cuenta la accesibilidad
Planeación tomado en cuenta la accesibilidad
 
Ley 1273 del 2009 ley de delitos informáticos
Ley 1273 del 2009 ley de delitos informáticosLey 1273 del 2009 ley de delitos informáticos
Ley 1273 del 2009 ley de delitos informáticos
 
Comenzar
ComenzarComenzar
Comenzar
 
Unidad 7 elaboracion de manuales de organizacion original
Unidad 7 elaboracion de manuales de organizacion originalUnidad 7 elaboracion de manuales de organizacion original
Unidad 7 elaboracion de manuales de organizacion original
 
Un poeta
Un poeta Un poeta
Un poeta
 
Fondo de Inclusión Social Energético (FISE) Electro Tocache
Fondo de Inclusión Social Energético (FISE) Electro TocacheFondo de Inclusión Social Energético (FISE) Electro Tocache
Fondo de Inclusión Social Energético (FISE) Electro Tocache
 
Presentacionenpowerpoint 100204081935-phpapp02
Presentacionenpowerpoint 100204081935-phpapp02Presentacionenpowerpoint 100204081935-phpapp02
Presentacionenpowerpoint 100204081935-phpapp02
 
Exámen práctico informática
Exámen práctico informáticaExámen práctico informática
Exámen práctico informática
 
Estrategias esenciales
Estrategias esenciales Estrategias esenciales
Estrategias esenciales
 
Bachillerato general digital diana laura
Bachillerato general digital diana lauraBachillerato general digital diana laura
Bachillerato general digital diana laura
 
Presentación1
Presentación1Presentación1
Presentación1
 
Virus informaticos
Virus informaticosVirus informaticos
Virus informaticos
 
Por qué debes escogernos para vender tu propiedad
Por qué debes escogernos para vender tu propiedadPor qué debes escogernos para vender tu propiedad
Por qué debes escogernos para vender tu propiedad
 
"Elogi del viure", y el equipo Restaurant Casa Calvet
"Elogi del viure", y el equipo Restaurant Casa Calvet"Elogi del viure", y el equipo Restaurant Casa Calvet
"Elogi del viure", y el equipo Restaurant Casa Calvet
 
Exposicion 1 rafael
Exposicion 1 rafaelExposicion 1 rafael
Exposicion 1 rafael
 
Segunda investigasion
Segunda investigasionSegunda investigasion
Segunda investigasion
 

Ähnlich wie Manual oracle plsql_intermedio_2012

Curso java avanzado
Curso java avanzadoCurso java avanzado
Curso java avanzadoLener Romero
 
Tutorial de computación básica II
Tutorial de computación básica IITutorial de computación básica II
Tutorial de computación básica IIdenisse sancho
 
Universidad tecnológica boliviana
Universidad tecnológica bolivianaUniversidad tecnológica boliviana
Universidad tecnológica bolivianamickytron241088
 
Informe Final de la Primera Práctica Pre Profesional I
Informe Final de la Primera Práctica Pre Profesional IInforme Final de la Primera Práctica Pre Profesional I
Informe Final de la Primera Práctica Pre Profesional IMarlon Terán
 
Modulo i introduccion las herramientas tecnologicas
Modulo i introduccion las herramientas tecnologicasModulo i introduccion las herramientas tecnologicas
Modulo i introduccion las herramientas tecnologicasDireccindeVinculacin
 
Manual logistica del comercio internacional
Manual logistica del comercio internacionalManual logistica del comercio internacional
Manual logistica del comercio internacionalbernardoalatorre
 
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...Cristhian ortiz casas
 
Estrategia de negocios final 22.07
Estrategia de negocios  final 22.07Estrategia de negocios  final 22.07
Estrategia de negocios final 22.07javier raime
 
Manual pu 2012 v30082012 neodata
Manual pu 2012  v30082012 neodataManual pu 2012  v30082012 neodata
Manual pu 2012 v30082012 neodataepasion10
 
Manual aula front_es
Manual aula front_esManual aula front_es
Manual aula front_esangeloolcese
 
Teacher manual spanish
Teacher manual spanishTeacher manual spanish
Teacher manual spanishAmorim Albert
 
Apuntes sobre PowerPoint 2007
Apuntes sobre PowerPoint 2007Apuntes sobre PowerPoint 2007
Apuntes sobre PowerPoint 2007tallerdenovatos
 
Fwpa doc-desarrollo
Fwpa doc-desarrolloFwpa doc-desarrollo
Fwpa doc-desarrollociriako
 
Postgres tutorial
Postgres tutorialPostgres tutorial
Postgres tutorialt763rm3n
 

Ähnlich wie Manual oracle plsql_intermedio_2012 (20)

Curso java y j2 EE
Curso java y j2 EECurso java y j2 EE
Curso java y j2 EE
 
Curso java avanzado
Curso java avanzadoCurso java avanzado
Curso java avanzado
 
Tutorial de computación básica II
Tutorial de computación básica IITutorial de computación básica II
Tutorial de computación básica II
 
Universidad tecnológica boliviana
Universidad tecnológica bolivianaUniversidad tecnológica boliviana
Universidad tecnológica boliviana
 
Informe Final de la Primera Práctica Pre Profesional I
Informe Final de la Primera Práctica Pre Profesional IInforme Final de la Primera Práctica Pre Profesional I
Informe Final de la Primera Práctica Pre Profesional I
 
Modulo i introduccion las herramientas tecnologicas
Modulo i introduccion las herramientas tecnologicasModulo i introduccion las herramientas tecnologicas
Modulo i introduccion las herramientas tecnologicas
 
Manual logistica del comercio internacional
Manual logistica del comercio internacionalManual logistica del comercio internacional
Manual logistica del comercio internacional
 
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...
Casos Prácticos - Administración y Marketing “Universidad Continental” (Versi...
 
Estrategia de negocios final 22.07
Estrategia de negocios  final 22.07Estrategia de negocios  final 22.07
Estrategia de negocios final 22.07
 
Sistemas y tecnologias de la informacion (Proyecto)
Sistemas y tecnologias de la informacion (Proyecto)Sistemas y tecnologias de la informacion (Proyecto)
Sistemas y tecnologias de la informacion (Proyecto)
 
Manual pu 2012 v30082012 neodata
Manual pu 2012  v30082012 neodataManual pu 2012  v30082012 neodata
Manual pu 2012 v30082012 neodata
 
Manual aula front_es
Manual aula front_esManual aula front_es
Manual aula front_es
 
Teacher manual spanish
Teacher manual spanishTeacher manual spanish
Teacher manual spanish
 
Apuntes sobre PowerPoint 2007
Apuntes sobre PowerPoint 2007Apuntes sobre PowerPoint 2007
Apuntes sobre PowerPoint 2007
 
Fwpa doc-desarrollo
Fwpa doc-desarrolloFwpa doc-desarrollo
Fwpa doc-desarrollo
 
Electromecanica
ElectromecanicaElectromecanica
Electromecanica
 
Electromecanica
ElectromecanicaElectromecanica
Electromecanica
 
Electromecanica
ElectromecanicaElectromecanica
Electromecanica
 
Curso javascript
Curso javascriptCurso javascript
Curso javascript
 
Postgres tutorial
Postgres tutorialPostgres tutorial
Postgres tutorial
 

Manual oracle plsql_intermedio_2012

  • 1. División de Educación Continua – FCA – UNAM http.//dec.fca.unam.mx 2012 Universidad Nacional Autónoma de México Facultad de Contaduría y Administración División de Educación Continua Oracle PL/SQL Intermedio [Oracle PL/SQL Intermedio]
  • 2. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 2 de 48 Contenido Contenido................................................................................................................................... 2 Lista de procedimientos.............................................................................................................. 5 Lista de figuras........................................................................................................................... 5 Lista de tablas............................................................................................................................ 6 Lista de ejemplos ....................................................................................................................... 6 Objetivo...................................................................................................................................... 8 1. Introducción a las Unidades de Programa ........................................................................ 9 Antecedentes ......................................................................................................................... 9 1.1. Definición................................................................................................................. 10 1.2. Tipos ....................................................................................................................... 10 1.2.1. Procedimientos........................................................................................................ 10 1.2.2. Funciones................................................................................................................ 10 1.2.3. Paquetes................................................................................................................. 10 1.2.4. Triggers................................................................................................................... 11 1.3. Ventajas .................................................................................................................. 11 1.3.1. Modularidad............................................................................................................. 11 1.3.2. Diseño sencillo de aplicaciones............................................................................... 11 1.3.3. Flexibilidad en el mantenimiento.............................................................................. 11 1.3.4. Agrupamiento en paquetes...................................................................................... 11 1.3.5. Reutilización............................................................................................................ 11 1.3.6. Mejor rendimiento.................................................................................................... 11 2. Crear procedimientos almacenados y funciones............................................................. 12
  • 3. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 3 de 48 2.1. Procedimientos almacenados y funciones............................................................... 12 2.1.1. Secciones de un procedimiento o función................................................................ 12 2.1.1.1. Encabezado.......................................................................................................... 12 2.1.1.2. Sección declarativa............................................................................................... 12 2.1.1.3. Sección ejecutable................................................................................................ 12 2.1.1.4. Sección de manejo de excepciones...................................................................... 13 2.2. Crear y ejecutar procedimientos almacenados ........................................................ 13 2.2.1. Crear y ejecutar funciones....................................................................................... 15 2.2.2. Modos de parámetros.............................................................................................. 17 2.2.3. Tipos de parámetros................................................................................................ 17 2.2.4. Valores predeterminados para parámetros IN ......................................................... 18 2.2.5. Notación de parámetros por posición, por nombre y mixta ...................................... 19 3. Mantenimiento de Procedimientos Almacenados y Funciones ....................................... 20 3.1. Recompilar .............................................................................................................. 20 3.2. Eliminar ................................................................................................................... 21 3.3. Diccionario de datos................................................................................................ 21 4. Crear y mantener paquetes ............................................................................................ 22 4.1. Paquetes................................................................................................................. 22 4.1.1. Secciones de un paquete ........................................................................................ 23 4.1.1.1. Especificación....................................................................................................... 23 4.1.1.2. Cuerpo.................................................................................................................. 23 4.2. Crear paquetes........................................................................................................ 23 4.3. Mantener Paquetes. ................................................................................................ 26 4.3.1. Eliminar paquetes.................................................................................................... 27 4.3.2. Recompilar paquetes............................................................................................... 27
  • 4. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 4 de 48 5. Triggers de bases de datos ............................................................................................ 28 5.1. Triggers de bases de datos ..................................................................................... 28 5.1.1. Introducción............................................................................................................. 28 5.1.2. Tareas que puede realizar un trigger....................................................................... 28 5.1.3. Triggers DML........................................................................................................... 29 5.1.4. Predicados condicionales para sentencias DML...................................................... 29 5.1.5. Seudoregistros OLD y NEW....................................................................................... 30 5.1.6. Resumen de tipos de triggers.................................................................................. 31 5.2. Crear triggers de bases de datos............................................................................. 31 5.3. Mantener triggers de bases de datos....................................................................... 34 5.3.1. Activar, desactivar y compilar triggers ..................................................................... 34 5.3.2. Consultas para obtener información sobre triggers.................................................. 35 Fuentes de Información............................................................................................................ 36 Bibliografía ........................................................................................................................... 36 Referencias Web..................................................................... ¡Error! Marcador no definido. Anexo A. Procedimientos útiles para trabajar con Oracle Database XE ................................... 37 Anexo B. Instrucciones para crear tablas de ejemplo ............................................................... 46 Contacto................................................................................................................................... 48
  • 5. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 5 de 48 Lista de procedimientos Procedimiento 1. Crear espacio de trabajo y entrar al entorno de programación en SQL......... 37 Procedimiento 2. Entrar al entorno de programación en SQL................................................... 41 Lista de figuras Figura 1. Ejemplo de código de un programa de aplicación...................................................... 10
  • 6. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 6 de 48 Lista de tablas Tabla 1. Vistas del sistema relacionadas con procedimientos y funciones ............................... 21 Tabla 2. Momentos de ejecución de un trigger ......................................................................... 29 Tabla 3. Predicados condicionales para determinar sentencia DML......................................... 29 Tabla 4. Valores de los seudoregistros OLD y NEW ................................................................... 30 Tabla 5. Resumen de tipos de triggers ..................................................................................... 31 Lista de ejemplos Ejemplo 1 Crear primer procedimiento para formar email......................................................... 13 Ejemplo 2. Instrucciones para ejecutar un procedimiento......................................................... 14 Ejemplo 3 Crear primera función para calcular cuadrado de un número................................... 16 Ejemplo 4. Instrucciones para ejecutar una función.................................................................. 16 Ejemplo 5. Tipo de parámetro con atributo %TYPE ................................................................... 17 Ejemplo 6. Tipo de parámetro con atributo %ROWTYPE............................................................. 18 Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPE............................. 18 Ejemplo 8. Parámetros IN con valores predeterminados .......................................................... 19 Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixta.................................. 19 Ejemplo 10. Recompilar un procedimiento ............................................................................... 20 Ejemplo 11. Eliminar un procedimiento y una función............................................................... 21 Ejemplo 12. Consultas para obtener información sobre procedimientos y funciones ................ 22 Ejemplo 13. Instrucciones para crear un paquete (especificación y cuerpo)............................. 23 Ejemplo 14. Crear el primer paquete para administrar empleados ........................................... 24 Ejemplo 15. Consulta para obtener información sobre paquetes.............................................. 25
  • 7. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 7 de 48 Ejemplo 16. Instrucciones para ejecutar funciones de un paquete ........................................... 26 Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete................................... 26 Ejemplo 18. Instrucciones para eliminar paquetes.................................................................... 27 Ejemplo 19. Instrucciones para recompilar un paquete ............................................................ 27 Ejemplo 20. Ejemplo de trigger con predicados condicionales ................................................. 32 Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales ............... 32 Ejemplo 22. Ejemplo de trigger para llevar bitácora de movimientos ........................................ 33 Ejemplo 23. Activar, desactivar y compilar triggers................................................................... 34 Ejemplo 24. Consultas para obtener información sobre triggers............................................... 35
  • 8. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 8 de 48 Objetivo Al finalizar el curso, el participante será capaz de: 1. Entender la estrategia de creación de unidades de programa dentro de una 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. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 9 de 48 1. Introducción a las Unidades de Programa Antecedentes Existen al menos tres técnicas para interactuar con una base de datos desde los programas de aplicación (Elmasri, 2007, pp. 252 y ss.). La más utilizada es la incrustación de comandos SQL dentro de los lenguajes de programación de propósito general. Es decir, dentro de las líneas de código del lenguaje de programación se incluyen (incrustan) líneas de código del lenguaje SQL. Esta técnica es conocida como SQL embebido (embedded SQL) o SQL incrustado. La segunda técnica consiste en utilizar bibliotecas, conocidas como APIs (Application Programming 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. En esta 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 bases de datos. Este curso está diseñado para conocer en buena medida la tercera de las tres técnicas mencionadas. Para tal fin haremos uso del lenguaje de programación de bases de datos PL/SQL1 de Oracle. Las ventajas que tiene la tercera de las técnicas con respecto a las demás serán presentadas má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ón hecho en Java. ¿Qué técnicas, de las mencionadas anteriormente, son utilizadas en el ejemplo? 1 Recordemos que PL/SQL es un lenguaje procedural extendido a partir del lenguaje SQL. Fue desarrollado por Oracle para permitir portabilidad y procesamiento de transacciones. Más información en http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/overview.htm#CEGGFECE.
  • 10. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 10 de 48 Figura 1. Ejemplo de código de un programa de aplicación 1.1. Definición Definiremos una unidad de programa como un contenedor de código, es decir, objetos que guardan bloques de código PL/SQL que se encuentra almacenado en nuestra base de datos. Estas unidades de programa deben tener asociado un nombre y pueden ser ejecutada las veces que sea necesario. Además, nos permiten descomponer problemas complejos en unidades de programación más simples que podemos reutilizar en varias aplicaciones2 . Por otra parte, es posible incluir comandos SQL para manipulación de datos (DML) y para definición de datos (DDL) dentro de estas unidades de programa. 1.2. Tipos En este curso nos abocaremos a cuatro tipos de unidades de programa. En seguida las enumeramos y damos una breve descripción de cada una. 1.2.1. Procedimientos Son unidades de programa que permiten ejecutar una o varias acciones. 1.2.2. Funciones Son unidades de programa que realizan un cálculo y regresan un valor. 1.2.3. Paquetes Son unidades de programa que contienen procedimientos y funciones, los cuales son ejecutados como una unidad. Podemos pensar en paquetes como aplicaciones completas. 2 Si desea ampliar su información sobre este tema, puede visitar el sitio http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId0.
  • 11. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 11 de 48 1.2.4. Triggers Son unidades de programa que se ejecutan automáticamente cuando se da un evento en la base de datos. Los triggers son ejecutados generalmente cuando se modifican los datos de una tabla 1.3. Ventajas Usar unidades de programa nos permite reutilizar el mismo código en varias aplicaciones o repetir su ejecución dentro de la misma aplicación. Además, nos brinda las siguientes ventajas. 1.3.1. Modularidad Las unidades de programa nos permiten dividir un programa en módulos bien definidos. 1.3.2. Diseño sencillo de aplicaciones Al diseñar una aplicación es posible posponer la implementación detallada de las unidades de programa hasta que el programa principal esté definido totalmente. Después de que el programa principal esté definido totalmente se pueden implementar una por una las unidades de programa con el fin de hacer pruebas individuales para cada unidad. 1.3.3. Flexibilidad en el mantenimiento Es posible modificar una unidad de programa sin modificar los programas que la mandan ejecutar. 1.3.4. Agrupamiento en paquetes Las unidades de programas pueden agruparse en paquetes, lo que mejora diversos aspectos de la implementación (se verán en la sección 4) 1.3.5. Reutilización Varias aplicaciones pueden utilizar la misma unidad de programa o el mismo paquete. 1.3.6. Mejor rendimiento Cada unidad de programa es compilada y almacenada en forma ejecutable. Esto permite que sea ejecutada varias veces de forma más ágil, ya que estas unidades de programa son ejecutadas en el servidor de bases de datos. Sólo basta una simple llamada desde una aplicación para realizar numerosos procesamientos de datos.
  • 12. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 12 de 48 También, usar unidades de programa reduce el tráfico en la red y mejora los tiempos de respuesta. Además, las unidades de programa son compartidas entre varios usuarios, lo que reduce requerimientos de memoria y de ejecución. 2. Crear procedimientos almacenados y funciones 2.1. Procedimientos almacenados y funciones Como vimos, los procedimientos almacenados y funciones son bloques de código PL/SQL que se encuentran almacenados en nuestra base de datos3 . También son llamados subprogramas y ambos son conocidos en la tecnología de bases de datos con el nombre genérico de procedimientos almacenados. 2.1.1. Secciones de un procedimiento o función En términos generales todo procedimiento o función incluye cuatro secciones que describiremos a continuación. 2.1.1.1. Encabezado Especifica el nombre y los parámetros del procedimiento o función. Los parámetros son opcionales, esto es, el procedimiento o función puede tener o no parámetros de acuerdo al objetivo para el que fueron creados. 2.1.1.2. Sección declarativa Esta 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 el procedimiento o función terminan de ejecutarse. 2.1.1.3. Sección ejecutable Esta sección es obligatoria. Contiene instrucciones para asignar valores, controlar la ejecución de las instrucciones y manipular datos. 3 Si desea ver documentación en línea sobre este tema visite el sitio http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/subprograms.htm#LNPLS008.
  • 13. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 13 de 48 2.1.1.4. Sección de manejo de excepciones Esta sección es opcional. Contiene instrucciones para manejar posibles errores de ejecución. 2.2. Crear y ejecutar procedimientos almacenados Como habíamos dejado establecido, los procedimientos almacenados permiten ejecutar una o varias acciones. Éstos son creados con el comando CREATE PROCEDURE. Para ejecutar un procedimiento es necesario utilizar su nombre y definir valores para cada uno de sus parámetros, por ejemplo aumenta_salario(12, 5000); En la instrucción anterior, los valores 12 y 5000 son parámetros del procedimiento, éstos podrí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 al entorno Application Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese a la sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código del Ejemplo 1. Para crear el procedimiento marque las instrucciones y ejecútelas con el comando EXECUTE. Ejemplo 1 Crear primer procedimiento para formar email -- Encabezado: nombre y parámetros CREATE OR REPLACE PROCEDURE crear_email ( nombre1 VARCHAR2, nombre2 VARCHAR2, empresa VARCHAR2 ) IS -- Sección declarativa email VARCHAR2(40); mensaje_error VARCHAR2(30) := 'Email demasiado largo.'; BEGIN -- Sección ejecutable email := nombre1 || '.' || nombre2 || '@' || empresa; DBMS_OUTPUT.PUT_LINE ('Email: ' || email); EXCEPTION -- Sección para manejo de excepciones WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE(mensaje_error); END; / El código anterior concatena los valores de las variables nombre1, nombre2 y empresa para crear una cuenta de correo electrónico. La cuenta de correo es almacenada en la variable email y desplegada con el paquete DBMS_OUTPUT, que sirve para desplegar mensajes o monitorear la
  • 14. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 14 de 48 ejecución de las unidades de programas4 . De hecho, se utiliza el procedimiento PUT_LINE(), que permite desplegar una línea. También se ejemplifica el manejo de excepciones. Si el email concatenado supera los 20 caracteres de la variable email, se produce un error. En ese momento el procedimiento detiene su ejecució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 de instrucciones del Ejemplo 2. Ejemplo 2. Instrucciones para ejecutar un procedimiento (1) BEGIN crear_email('Juan', 'Ramos', 'miempresa'); END; / (2) EXECUTE crear_email('Juan', 'Ramos', 'miempresa'); (3) DECLARE nombre VARCHAR2(20); apellido VARCHAR2(20); empresa VARCHAR2(20); BEGIN nombre := 'Juan'; apellido := 'Ramos'; empresa := 'miempresa'; crear_email(nombre, apellido, empresa); END; / (4) BEGIN crear_email('JuanFrancisco', 'RamosGutierrez', 'miempresacomercial'); END; / 4 Más información sobre este paquete en http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0. En SQL* Plus es necesario activar una variable de entorno para ver las impresiones de este paquete, el comando que debe ejecutarse es SET SERVEROUTPUT ON.
  • 15. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 15 de 48 El primer grupo de instrucciones (1) crea un bloque de programación para ejecutar el procedimiento almacenado. Dentro de ese bloque se únicamente se llama al procedimiento utilizando su 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 final es opcional. Esta manera de ejecutar un procedimiento funciona en SQL*Plus, pero no puede funcionar 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. Esto se hace con el fin de probar si el procedimiento maneja adecuadamente el error cuando el correo electrónico rebasa el tamaño de la variable email VARCHAR2(40). Como puede ver, después de ejecutar esta instrucción, Oracle responde con el mensaje de error Email demasiado largo. 2.2.1. Crear y ejecutar funciones Como dijimos arriba, las funciones realizan un cálculo y regresan un valor. Son creadas con el comando CREATE FUNCTION. Para ejecutar una función es necesario crear una expresión donde asignemos a una variable el resultado de su ejecución, para ello debemos utilizar el nombre de la función y definir los valores para cada 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(), ese valor correspondería al identificador del empleado, el cual nos permitiría obtener su salario y almacenarlo en la variable salario_actual. Las funciones, a diferencia de los procedimientos, deben incluir la cláusula RETURN en la sección de encabezado para indicar el tipo de dato de retorno. Además, cualquier secuencia de programació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 entorno Application Express con el nombre de usuario y contraseña que le asignaron. Luego ingrese a la
  • 16. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 16 de 48 sección SQL Commands del SQL Workshop. En el espacio de programación escriba el código del Ejemplo 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ámetros CREATE OR REPLACE FUNCTION cuadrado (base NUMBER) RETURN NUMBER -- Cláusula RETURN AS -- Sección declarativa cuadrado_base NUMBER; BEGIN -- Sección ejecutable cuadrado_base := base * base; RETURN cuadrado_base; -- Instrucción RETURN END; / El código anterior calcula el cuadrado del número introducido mediante el único parámetro de la funció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ón RETURN para regresar el valor calculado. Para ejecutar una función de Oracle podemos utilizar cualquiera de los grupos de instrucciones del Ejemplo 4. Ejemplo 4. Instrucciones para ejecutar una función 1) BEGIN DBMS_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 o monitorear la ejecución de las unidades de programas5 . En especial se utiliza el procedimiento PUT_LINE(), que permite desplegar una línea. 5 Más información sobre este paquete en http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#autoId0.
  • 17. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 17 de 48 En 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 la instalación de Oracle y permite calcular expresiones mediante la cláusula SELECT. 2.2.2. Modos de parámetros El modo de un parámetro indica su comportamiento. Los modos posibles son IN, OUT e IN OUT. El modo IN es el modo por defecto, indica que el parámetro pasa un valor al procedimiento o funció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 dentro del procedimiento o función. Las buenas prácticas de programación recomiendan que en el caso de las funciones se evite utilizar parámetros OUT o IN OUT, ya que la función está pensada para regresar un valor y no tiene por qué modificar los valores de los parámetros. De hecho, en Oracle si una función utiliza parámetros IN o IN OUT los resultados pueden ser inesperados. 2.2.3. Tipos de parámetros Los parámetros de un procedimiento o función deben ser asociados a un tipo de datos. Existen dos posibilidades para hacer esto. Por una parte podemos usar tipos no restringidos como NUMBER o VARCHAR2. Estos tipos no pueden declararse con un tamaño asociado, es decir, está prohibido declarar NUMBER(3) o VARCHAR2(40). Por otra podemos emplear tipos de datos restringidos usando los atributos %TYPE o %ROWTYPE. Declarar un parámetro con %TYPE asegura que el parámetro sea del mismo tipo que la columna asociada al atributo %TYPE. En el Ejemplo 5 la declaración del procedimiento asigna al parámetro numero_depto el mismo tipo de datos de la columna numDepto de la tabla Empleados. Ejemplo 5. Tipo de parámetro con atributo %TYPE CREATE OR REPLACE PROCEDURE aumenta_salario ( numero_depto Empleados.numDepto%TYPE … 6 Más información sobre esta tabla en http://docs.oracle.com/cd/E11882_01/server.112/e26088/queries009.htm#SQLRF20036.
  • 18. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 18 de 48 Es recomendable utilizar el atributo %TYPE ya que si el tipo de datos de la columna cambia, no tenemos que hacer cambios en nuestros procedimientos o funciones. El atributo %ROWTYPE crea un registro que contiene todas las columnas de la tabla especificada. Como puede verse en el Ejemplo 6, el parámetro empleado_info es creado como un registro con todas las columnas de la tabla Empleado. Ejemplo 6. Tipo de parámetro con atributo %ROWTYPE CREATE OR REPLACE PROCEDURE aumenta_salario ( empleado_info Empleados%ROWTYPE … Como comentario final de esta sección, podemos decir que las funciones pueden regresar un valor declarado con el atributo %ROWTYPE. Veamos un ejemplo que utiliza estos tipos de datos restringidos. Ejemplo 7. Tipos de datos restringidos con atributos %TYPE y %ROWTYPE CREATE OR REPLACE PROCEDURE datos_empleado ( id_empleado IN Empleados.idEmpleado%TYPE ) IS datos_empleado Empleados%ROWTYPE; BEGIN SELECT * INTO datos_empleado FROM Empleados WHERE 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 procedimiento BEGIN datos_empleado (1); END; / 2.2.4. Valores predeterminados para parámetros IN Es posible declarar un parámetro de modo IN con un valor predeterminado (por defecto). Un parámetro con este valor se convierte en un parámetro opcional. Esto es, si en la llamada del
  • 19. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 19 de 48 procedimiento o función se omite este parámetro, se toma el valor predeterminado. De lo anterior se desprende 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 y bono, cada uno con su valor predeterminado (1000 y 500). En la llamada al procedimiento podemos omitir los valores tanto de uno, como del otro. Ejemplo 8. Parámetros IN con valores predeterminados CREATE OR REPLACE PROCEDURE aumenta_salario_bono ( id_empleado IN Empleados.idEmpleado%TYPE, cantidad IN Empleados.salario%TYPE := 1000, bono IN Empleados.salario%TYPE := 500 ) IS BEGIN UPDATE Empleados SET salario = salario + cantidad + bono WHERE idEmpleado = id_empleado; END; / -- Para ejecutar el procedimiento BEGIN aumenta_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 realizados SELECT * FROM Empleados WHERE idEmpleado IN (9, 10); 2.2.5. Notación de parámetros por posición, por nombre y mixta Podemos utilizar tres notaciones para especificar parámetros en la llamada a un procedimiento o función. La primera es por posición, que nos obliga a poner los parámetros en el mismo orden en el que fueron declarados. La segunda es por nombre, en este caso utilizamos en nombre del parámetro y lo asociamos a su valor con la siguiente sintaxis parámetro => valor. La tercera es mixta en el sentido de que permite iniciar con notación por posición y después utilizar notación por nombre. Las notaciones por nombre y mixta son empleadas cuando tenemos parámetros opcionales. Veamos el Ejemplo 9. Ejemplo 9. Notaciones de parámetros por posición, por nombre y mixta CREATE OR REPLACE PROCEDURE aumenta_salario (
  • 20. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 20 de 48 id_empleado IN Empleados.idEmpleado%TYPE, cantidad IN Empleados.salario%TYPE := 1000 ) IS BEGIN UPDATE Empleados SET salario = salario + cantidad WHERE idEmpleado = id_empleado; END; / BEGIN aumenta_salario (5, 2000); -- por posición aumenta_salario (id_empleado => 6, cantidad => 2000); -- por nombre aumenta_salario (cantidad => 2000, id_empleado => 7); -- por nombre aumenta_salario (8, cantidad => 2000); -- mixta END; / -- Para consultar cambios realizados SELECT * FROM Empleados WHERE idEmpleado IN (5, 6, 7, 8); 3. Mantenimiento de Procedimientos Almacenados y Funciones 3.1. Recompilar Para recompilar un procedimiento o función debemos utilizar los comandos ALTER PROCEDURE o ALTER FUNTION respectivamente. Es recomendable hacerlo después de modificar tablas, vistas o cualquier objeto asociado a nuestro procedimiento o función. Recompilar previene errores de ejecución y disminuye el tiempo que toma ejecutar la unidad de programa. El muestra cómo recompilar el procedimiento aumenta_salario. Ejemplo 10. Recompilar un procedimiento ALTER PROCEDURE aumenta_salario COMPILE; Es importante recordar que recompilar no significa cambiar la declaración o definición del procedimiento o función. Para modificar estas unidades de programa es necesario eliminarlas y volverlas a crear o bien utilizar la instrucción CREATE OR REPLACE. La cláusula OR REPLACE primero borra el procedimiento o función (en caso de que exista) y luego lo vuelve a crear.
  • 21. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 21 de 48 3.2. Eliminar Para eliminar un procedimiento o función utilizamos las instrucciones SQL DROP PROCEDURE y DROP FUNCTION. Los siguientes son dos ejemplos de cómo eliminar un procedimiento y una función. Ejemplo 11. Eliminar un procedimiento y una función DROP PROCEDURE aumenta_salario; DROP FUNCTION cuadrado; 3.3. Diccionario de datos Oracle incluye diversas vistas en el diccionario de datos que nos dan información sobre nuestros procedimientos o funciones7 . En la Tabla 1 se mencionan las principales. Tabla 1. Vistas del sistema relacionadas con procedimientos y funciones Vista del sistema Descripción SYS.DBA_SOURCE Describe el texto de todos los procedimientos y funciones de la base de datos. SYS.USER_SOURCE Describe el texto de los procedimientos y funciones que pertenecen al usuario conectado actualmente. SYS.DBA_ARGUMENTS Lista los argumentos de todos los procedimientos y funciones de la base de datos. SYS.USER_ARGUMENTS Lista los argumentos de los procedimientos y funciones que pertenecen al usuario conectado actualmente. SYS.DBA_PROCEDURES Describe todos los procedimientos y funciones PL/SQL de la base de datos. SYS.USER_PROCEDURES Describe todos los procedimientos y funciones PL/SQL que pertenecen al usuario conectado actualmente. 7 Para ver más información sobre las vistas y tablas del sistema visite el sitio http://docs.oracle.com/cd/E11882_01/timesten.112/e21644/systemtables.htm#TTSYS346.
  • 22. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 22 de 48 El Ejemplo 12 presenta cuatro consultas basadas en las vistas del sistema que mencionamos atrás. La primera (1) y segunda (2) sirven para listar todos nuestros procedimientos y funciones. La tercera (3) muestra los argumentos de cada uno. La cuarta (4) despliega el código del procedimiento lí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_PROCEDURES ORDER BY 1; (3) SELECT object_name, argument_name, position, data_type FROM USER_ARGUMENTS ORDER BY 1, 3; (4) SELECT line, text FROM USER_SOURCE WHERE name = 'AUMENTA_SALARIO' ORDER BY 1; 4. Crear y mantener paquetes 4.1. Paquetes Definiremos un paquete como una colección de objetos de programación (procedimientos, funciones, variables, constantes, excepciones) relacionados y almacenados como una unidad dentro de la base de datos8 . Los paquetes brindan las siguientes ventajas. Permiten mejor organización de una aplicación (¿cuáles eran los procedimientos para administrar empleados?). Mejoran el manejo de privilegios. Es posible modificar el paquete sin recompilar los objetos que contiene (procedimientos y funciones). Oracle puede tener múltiple acceso a objetos de programación en memoria al mismo tiempo. 8 Más información sobre este tema en http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_packages.htm#autoId2 y en http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS009.
  • 23. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 23 de 48 Pueden contener variables globales disponibles para las funciones y procedimientos almacenados 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 paquete Un paquete tiene dos secciones. Cada una permite declarar o definir distintos objetos. 4.1.1.1. Especificación En 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. Cuerpo En 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 paquetes En esta sección revisaremos cómo crear paquetes y ejecutar objetos dentro de ellos. Cada sección de un paquete es creada con una instrucción diferente. Para la especificación utilizamos el comando CREATE PACKAGE. Para el cuerpo del paquete usamos CREATE PACKAGE BODY. Es recomendable usar la cláusula OR REPLACE para realizar modificaciones a nuestros paquetes. El Ejemplo 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 o función tenga los mismos parámetros que la especificación en cuanto al nombre, tipo y modo. En el caso de las funciones también es necesario que el tipo de datos de retorno coincida en ambas secciones. Obviamente, el nombre del paquete debe ser el mismo tanto en la especificación como en el cuerpo. El Ejemplo 14 muestra cómo crear un paquete con dos procedimientos y una función. Primero se crea la especificación y después el cuerpo.
  • 24. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 24 de 48 Ejemplo 14. Crear el primer paquete para administrar empleados -- Especificación del paquete. CREATE or REPLACE PACKAGE administracion_empleados IS FUNCTION 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_empleados IS FUNCTION alta ( nombres VARCHAR2, apellidos VARCHAR2, correoE VARCHAR2, salario NUMBER, iddepto NUMBER ) RETURN NUMBER IS nuevo_id NUMBER; BEGIN nuevo_id := empleado_seq.NEXTVAL; INSERT INTO Empleados ( idEmpleado, nombres, apellidos, correoE, salario, idDepto ) VALUES ( nuevo_id, nombres, apellidos, correoE,
  • 25. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 25 de 48 salario, iddepto ); RETURN (nuevo_id); END alta; PROCEDURE baja ( empleado_id IN NUMBER ) IS BEGIN DELETE FROM Empleados WHERE idEmpleado= empleado_id; IF SQL%NOTFOUND THEN raise_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 ) IS BEGIN UPDATE Empleados SET salario = salario + cantidad WHERE idEmpleado = empleado_id; IF SQL%NOTFOUND THEN raise_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 la consulta del Ejemplo 15. Ejemplo 15. Consulta para obtener información sobre paquetes SELECT object_name, procedure_name FROM user_procedures WHERE object_type = 'PACKAGE';
  • 26. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 26 de 48 Finalmente, para ejecutar los procedimientos o funciones incluidos dentro de los paquetes utilizamos la notación nombre_paquete.nombre_procedimiento o nombre_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) DECLARE nuevo_empleado NUMBER(6); BEGIN nuevo_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 realizados SELECT * FROM Empleados; Ejemplo 17. Instrucciones para ejecutar procedimientos de un paquete (1) BEGIN administracion_empleados.baja(11); END; / -- Para consultar cambios realizados SELECT * FROM Empleados; (2) BEGIN administracion_empleados.aumenta_salario(1, 1000); END; / -- Para consultar cambios realizados SELECT * FROM Empleados; 4.3. Mantener Paquetes. En esta sección describiremos las instrucciones para eliminar y recompilar paquetes.
  • 27. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 27 de 48 4.3.1. Eliminar paquetes Para eliminar un paquete utilizamos la instrucción DROP PACKAGE. Esta instrucción elimina tanto la especificación del paquete como su cuerpo. Si lo que queremos es eliminar un procedimiento o funció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 permanezcan validos e inalterables. El Ejemplo 18 muestra cómo eliminar el cuerpo del paquete administracion_empleados, además muestra cómo eliminar todo el paquete. Ejemplo 18. Instrucciones para eliminar paquetes DROP PACKAGE BODY administracion_empleados; DROP PACKAGE administracion_empleados; 4.3.2. Recompilar paquetes Podemos recompilar la especificación, el cuerpo o todo un paquete con el comando ALTER PACKAGE. Este tipo de recompilación se conoce como recompílación explícita y es buena idea ya que disminuye la probabilidad de errores de ejecución y aumenta el rendimiento de la base de datos. Con este comando son recompilados todos los procedimientos y funciones del paquete. El comando ALTER PACKAGE no cambiar la definición de un paquete, si queremos cambiarla debemos eliminarlo y volverlo a crear. Entonces, para compilar un paquete utilizamos la instrucción ALTER PACKAGE nombre_paquete COMPILE [SPECIFICATION | BODY | PACKAGE]. El muestra cómo compilar el cuerpo del paquete administracion_empleados así como todo el paquete completo. Ejemplo 19. Instrucciones para recompilar un paquete ALTER PACKAGE administracion_empleados COMPILE; ALTER PACKAGE administracion_empleados COMPILE BODY;
  • 28. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 28 de 48 5. Triggers de bases de datos 5.1. Triggers de bases de datos 5.1.1. Introducción Un trigger es una unidad de programa almacenada en la base de datos que se ejecuta automáticamente cuando ocurre un evento9 . Esto implica que no es posible mandar ejecutar un trigger de manera explícita, como se hace con los procedimientos y las funciones, sólo la base de datos puede 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 evento que 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 el trigger 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 para un 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 de sistema. 5.1.2. Tareas que puede realizar un trigger Un trigger brinda funcionalidad a la base de datos. Permite realizar labores rutinarias y de administració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 base de datos distribuida. 9 Más información sobre triggers de bases de datos en http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS020. 10 DML, del inglés Data Manipulation Language. 11 DDL, del inglés Data Definition Language.
  • 29. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 29 de 48 Prevenir 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 restricciones de integridad (constraints). 5.1.3. Triggers DML Un trigger DML es creado para una tabla o vista y se ejecuta automáticamente cuando se da un evento de INSERT, DELETE o UPDATE. Este tipo de trigger puede ejecutarse en cuatro momentos que se muestran en la Tabla 2. Tabla 2. Momentos de ejecución de un trigger Nombre Momento de ejecución BEFORE trigger a nivel de sentencia Antes de que el evento sea ejecutado AFTER trigger a nivel de sentencia Después de que el evento sea ejecutado BEFORE 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, de manera tal que el trigger sólo se ejecutará si alguna de esas columnas es modificada. 5.1.4. Predicados condicionales para sentencias DML Los trigger DML pueden declararse para ser ejecutados por una sentencia DML o por varias de ellas, incluso por las tres. Dada esta situación, resulta conveniente conocer qué sentencia desencadenó la ejecución del trigger. Esto se puede saber gracias a cuatro predicados condicionales que almacenan el valor de TRUE de acuerdo a la sentencia que desencadenó el trigger (véase Tabla 3). Tabla 3. Predicados condicionales para determinar sentencia DML Predicado condicional Almacena TRUE cuando
  • 30. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 30 de 48 INSERTING 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 NEW Si un trigger se ejecuta para cada renglón que afecta la sentencia DML, el trigger tiene acceso a los datos del renglón que está siendo afectado. Dicho acceso se logra mediante los seudoregistros OLD y NEW. La manera de hacer referencia a un valor de estos seudoregistros es mediante la instrucción :seudoregistro.nombre_campo, por ejemplo, :NEW.idEmpleado. Los valores que toman estos seudoregistros dependen de la sentencia que desencadenó el trigger y son mostrados en la Tabla 4. Tabla 4. Valores de los seudoregistros OLD y NEW Sentencia Valor de OLD.nombre_campo Valor de NEW.nombre_campo INSERT NULL Valores posteriores al INSERT UPDATE Valores previos al UPDATE Valores posteriores al UPDATE DELETE Valores previos al DELETE NULL Para 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ón está 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. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 31 de 48 Un AFTER trigger no puede cambiar los valores del seudoregistro NEW, ya que la sentencia DML se ejecuta antes del trigger. Un BEFORE trigger puede cambiar los valores del seudoregistro NEW antes de que la sentencia INSERT o UPDATE los cambien en la tabla. 5.1.6. Resumen de tipos de triggers En la Tabla 5 se ofrece un resumen de los tipos de triggers posibles de acuerdo a las características discutidas. Sirva esta tabla como referencia para discusiones posteriores. Recuerde que es posible la combinación de categorías. Tabla 5. Resumen de tipos de triggers Categoría Descripción Tipos de triggers Sentencia Evento DML que desencadena el trigger INSERT trigger DELETE trigger UPDATE trigger Momento Antes o después del evento que desencadena el trigger BEFORE trigger AFTER trigger Nivel Nivel de afectación del evento DML. Indica si el trigger se ejecuta por la sentencia o por cada renglón afectado. Trigger a nivel de renglón Trigger a nivel de sentencia Objeto asociado Objeto al que afecta el evento, pueden ser tablas y vistas, o esquemas y base de datos. Trigger DML Trigger de sistema 5.2. Crear triggers de bases de datos En esta sección se darán ejemplos de cómo crear triggers con las características expuestas en los apartados anteriores. El muestra las instrucciones para crear un trigger que utiliza los predicados condicionales para indicar, mediante la impresión de un letrero, qué evento lo desencadenó.
  • 32. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 32 de 48 Ejemplo 20. Ejemplo de trigger con predicados condicionales CREATE OR REPLACE TRIGGER trg_predicados BEFORE INSERT OR UPDATE OF salario, idDepto OR DELETE ON Empleados BEGIN CASE WHEN INSERTING THEN DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por INSERT'); WHEN UPDATING('salario') THEN DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por UPDATE de salario'); WHEN UPDATING('idDepto') THEN DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por UPDATE de idDepto'); WHEN DELETING THEN DBMS_OUTPUT.PUT_LINE('Trigger desencadenado por DELETE'); END CASE; END; / Ejemplo 21. Instrucciones para desencadenar trigger con predicados condicionales (1) -- Desencadenar trigger por INSERT DECLARE nuevo_empleado NUMBER(6); BEGIN nuevo_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 DELETE BEGIN administracion_empleados.baja(12); END; / (3) -- Desencadenar trigger por UPDATE de salario BEGIN administracion_empleados.aumenta_salario(1, 1000); END; / -- Desencadenar trigger por UPDATE de idDepto
  • 33. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 33 de 48 UPDATE 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 movimientos CREATE OR REPLACE TRIGGER tri_bitacora_salario AFTER UPDATE OF salario ON Empleados FOR EACH ROW BEGIN INSERT INTO bitac_salarios (idEmpleado, fecha_mov, salario_nuevo, salario_anterior) VALUES (:NEW.idEmpleado, SYSDATE, :NEW.salario, :OLD.salario); END; / —- Desencadenar trigger modificando salario BEGIN administracion_empleados.aumenta_salario(1, 1000); END; / —- Revisar registro de movimientos en bitácora SELECT * FROM bitac_salarios; —- Desencadenar trigger modificando salario para varios registros UPDATE Empleados SET salario = salario + 1000 WHERE idDepto = 20; —- Revisar registro de movimientos en bitácora SELECT * FROM bitac_salarios;
  • 34. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 34 de 48 5.3. Mantener triggers de bases de datos En 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 sobre nuestros triggers. 5.3.1. Activar, desactivar y compilar triggers El comando ALTER TRIGGER permite activar, desactivar y compilar triggers12 . No sirve para modificar la definición de un trigger, para ello es necesario eliminarlo y volverlo a crear, o utilizar la instrucció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 trigger ALTER TRIGGER trg_predicados DISABLE; -- Ejecutar DML sobre tabla para verificar si se dispara el trigger. BEGIN administracion_empleados.aumenta_salario(1, 1000); END; / -- Activar un trigger ALTER TRIGGER trg_predicados ENABLE; -- Ejecutar DML sobre tabla para verificar si se dispara el trigger. BEGIN administracion_empleados.aumenta_salario(1, 1000); END; / -- Compilar un trigger ALTER 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 triggers asociados. 12 Para desactivar todos los triggers de una tabla utilice el comando ALTER TABLE nombre_tabla [ ENABLE | DISABLE ] ALL TRIGGERS.
  • 35. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 35 de 48 Volver a cargar los datos en una tabla. 5.3.2. Consultas para obtener información sobre triggers En el Ejemplo 24 podemos encontrar dos consultas que nos muestran información sobre nuestros triggers. La primera muestra algunas características de un trigger específico, para ello hace uso de la vista de sistema USER_TRIGGERS. La segunda muestra las primeras líneas del cuerpo del trigger, 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, Status FROM USER_TRIGGERS WHERE Trigger_name = 'TRG_PREDICADOS'; -- Muestra las primeras líneas del cuerpo del trigger SELECT Trigger_body FROM USER_TRIGGERS WHERE Trigger_name = 'TRG_PREDICADOS'; 13 Para ver el cuerpo completo del trigger puede ejecutar la instrucción "SET LONG 10000".
  • 36. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 36 de 48 Fuentes de Información Bibliografía Elmasri, R. y Navathe, S. (2007). Fundamentos de sistemas de bases de datos. Madrid: Pearson Educación.
  • 37. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 37 de 48 Anexo A. Procedimientos útiles para trabajar con Oracle Database XE En este anexo podrá encontrar varios procedimientos útiles para el trabajo de programación en Oracle 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 SQL 1. Desde el botón Iniciar seleccione la opción Get Started del grupo Oracle Database 11g Express Edition. Esta opción abrirá su navegador predeterminado y le dará acceso al entorno de trabajo de Oracle. 2. En el entorno de trabajo de Oracle seleccione la opción Application Express.
  • 38. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 38 de 48 3. Lo anterior dará como resultado una página de acceso. Ingrese en la caja de texto Username 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 de administración SYS. 4. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio de trabajo. Asegúrese de poner los siguientes datos. Luego presione el botón Create Workspace. a. Database User: Create New b. Database Username: CURSODEC c. Application Express Username: cursodec d. Password: curso100% e. Confirm Password: curso100%
  • 39. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 39 de 48 5. Oracle le confirmará la creación exitosa de su espacio de trabajo y le brindará la opción de ingresar con el usuario que creó. Haga clic en To begin, click here to login, para ingresar a la 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ón que proporcionó en el paso 4 y presione el botón Login.
  • 40. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 40 de 48 7. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQL seleccione 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 los ejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucción SELECT * FROM demo_customers; luego márquela y presione el botón Run. Como resultado deberán desplegarse varios registros en la parte inferior de la página, como se ve en la siguiente figura. Si puede ver estos registros está listo para comenzar a programar en SQL.
  • 41. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 41 de 48 Procedimiento 2. Entrar al entorno de programación en SQL Este procedimiento se realiza siempre y cuando ya haya creado su espacio de trabajo. Si no 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 11g Express Edition. Esta opción abrirá su navegador predeterminado y le dará acceso al entorno de trabajo de Oracle.
  • 42. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 42 de 48 2. 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 texto Username 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 de administración SYS.
  • 43. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 43 de 48 4. Si los datos fueron escritos correctamente, aparecerá una página para crear su espacio de trabajo (si no ha creado su espacio de trabajo realice el Procedimiento 1). Dado que usted ya 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). Esto le 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 siguiente información. Luego presione el botón Login. a. Workspace: CURSODEC b. Username: cursodec c. Password: curso100%
  • 44. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 44 de 48 6. Ahora se encuentra en su espacio de trabajo. Para comenzar a programar en SQL seleccione 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 los ejercicios del curso. Para confirmar que puede comenzar a trabajar, escriba la instrucción SELECT * FROM demo_customers; luego márquela y presione el botón Run. Como resultado deberán desplegarse varios registros en la parte inferior de la página, como se ve en la siguiente figura. Si puede ver estos registros está listo para comenzar a programar en SQL.
  • 45. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 45 de 48
  • 46. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 46 de 48 Anexo B. Instrucciones para crear tablas de ejemplo —- DROP SEQUENCE empleado_seq; CREATE SEQUENCE empleado_seq START WITH 1 INCREMENT 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 Empleados VALUES(empleado_seq.NEXTVAL, 'Marlene', 'Acosta', 'macosta@empresa.com', 7000, 10); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Carolina', 'Buelna', 'cbuelna@empresa.com ', 6800, 10); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Eva', 'Montes', 'emontes@empresa.com ', 8000, 10); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Laura', 'Trejo', 'ltrejo@empresa.com ', 15000, 20); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Miguel', 'Romero', 'mromero@empresa.com ', 18500, 20); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Norma', 'Zola', 'nzola@empresa.com ', 19000, 20); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Patricia', 'Chávez', 'pchavez@empresa.com ', 10000, 30); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Sonia', 'Humm', 'shumm@empresa.com ', 25000, 30); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Victor', 'Ibarra', 'vibarra@empresa.com ', 9500, 30); INSERT INTO Empleados VALUES(empleado_seq.NEXTVAL, 'Mónica', 'Gómez', 'mgomez@empresa.com ', 12000, 30); —- SELECT * FROM Empleados; -- La siguiente imagen muestra el resultado esperado.
  • 47. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 47 de 48
  • 48. Oracle PL/SQL Intermedio División de Educación Continua Liverpool #66 Col. Juárez C.P. 06600 Tel. 5533-1617 al 19, 01800-8-332-322 Página: http://dec.fca.unam.mx Página 48 de 48 Contacto Para cualquier duda o aclaración puede contactarnos en: 01-800-8-DEC-FCA 01-800-8-332-322 Teléfonos (55) 5514 4948, (55) 5514 4794 Conmutador (55) 5533 1617 al 19 Jefe de la División Mtro. Eric M. Rivera Rivera erivera@dec.fca.unam.mx Subjefa de la División Mtra. Adriana Arias Cedillo aarias@dec.fca.unam.mx Coordinador Administrativo Lic. Héctor Mauricio Moguel Martínez hmoguel@dec.fca.unam.mx Coordinador Académico Lic. Gabriel Guevara Gutiérrez gguevara@dec.fca.unam.mx