Professional Documents
Culture Documents
ITRODUCCIÓ A PL/SQL
09/03/2005
GEDICA TRAINING & CONSULTING C.A.
TABLA DE CONTENIDO
CONTROL DE TRANSACCIONES............................................................................................................... 37
PRACTICA 2................................................................................................................................................... 40
Capítulo 3..................................................................................................................................41
ESTRUCTURAS DE COTROL ............................................................................................41
ESTRUCTURAS DE COTROL DE PL/SQL.............................................................................. 42
CONDICIONALES ......................................................................................................................................... 42
La sentencia IF ................................................................................................................................................. 43
ITERACIONES ............................................................................................................................................... 45
ETIQUETAS.................................................................................................................................................... 49
CURSORES ....................................................................................................................................... 51
CURSORES en SQL........................................................................................................................................ 51
CURSORES EN PL/SQL ................................................................................................................................ 53
PRACTICA 3................................................................................................................................................... 62
Capítulo 4..................................................................................................................................63
MAEJO DE ERRORES ........................................................................................................63
MAEJO DE ERRORES E PL/SQL ........................................................................................... 64
EXCEPCIONES PREDEFINIDAS ................................................................................................................. 64
MANEJANDO EXCEPCIONES..................................................................................................................... 65
EL PRAGMA EXCEPTION_INIT.................................................................................................................. 66
EXCEPCIONES DEFINIDAS POR EL USUARIO ....................................................................................... 67
PRACTICA 4................................................................................................................................................... 70
Capítulo 5..................................................................................................................................71
PROGRAMAS ALMACEADOS E LA BASE DE DATOS...............................................71
IGEIERIA DEL LEGUAJE PL/SQL ..................................................................................... 72
INGENIERIA DE PL/SQL .............................................................................................................................. 72
IGEIERIA DE PL/SQL RESIDETE E EL RDBMS .......................................................... 73
DIFERENCIA ENTRE PROCEDIMIENTO Y FUNCION ............................................................................ 74
CARACTERISTICAS DE PROCEDIMIENTOS Y FUNCIONES ................................................................ 74
USOS DE PROCEDIMIENTOS Y FUNCIONES .......................................................................................... 75
CREACION Y COMPILACION DE PROCEDIMIENTOS Y FUNCIONES................................................ 75
Instrucciones Válidas en Procedimientos y Funciones .................................................................................... 77
Instrucciones No Validas en Procedimientos y Funciones............................................................................... 78
EJECUCION DE PROCEDIMIENTOS Y FUNCIONES ALMACENADOS ............................................... 78
COMPILACIO DE ERRORES E PL/SQL............................................................................... 80
ERRORES DE PL/SQL ................................................................................................................................... 80
ERRORES DEFINIDOS POR EL USUARIO ................................................................................................ 81
ELIMINACION DE PROCEDIMIENTOS Y FUNCIONES .......................................................................... 82
PAQUETES ....................................................................................................................................... 83
ESTADO PERSISTENTE ............................................................................................................................... 83
ESTRUCTURA DE UN PAQUETE ............................................................................................................... 84
DEPENDENCIAS ENTRE PAQUETES ........................................................................................................ 84
ESPECIFICACIONES PARA LA CREACION DE PAQUETES .................................................................. 85
PRACTICA 5................................................................................................................................................... 88
Capítulo 6..................................................................................................................................89
TRIGGERS DE BASE DE DATOS.........................................................................................89
TRIGGERS o DISPARADORES DE EVETOS.......................................................................... 90
RESTRICCIONES DE LOS TRIGGERS........................................................................................................ 92
DEFINICION Y CREACION DE TRIGGERS............................................................................................... 93
CREACION DE UN TRIGGER DE BASE DE DATOS ................................................................................ 94
SECUENCIA DE EJECUCION DE UN TRIGGER DE BASE DE DATOS ................................................. 94
Predicados Condicionales ................................................................................................................................ 96
ELIMINANDO UN TRIGGER DE BASE DE DATOS ................................................................................. 98
PRACTICA 6................................................................................................................................................... 99
ITRODUCCIO A PL/SQL
COTEIDO PROGRAMÁTICO:
• Introducción a PL\SQL
• Estructura de los bloques
• Tipos de Bloques
• Declaración de variables
• Operadores
• Funciones en PL\SQL
• Estructuras de Control
• Cursores
• Manejo de Errores
• Programas almacenados en la B.D.
• Triggers de Base de Datos.
ESTRATEGIAS METODOLÓGICAS:
REQUISITOS DE ADMISIÓ:
Capítulo 1
ITRODUCCIO A PL/SQL
ITRODUCCIÓ A PL/SQL
Es muy probable que en sus prácticas de SQL, UD. haya sentido la necesidad de usar
condiciones, bucles, o declarar variables, como lo hacía en los lenguajes de tercera generación,
como lo son Pascal, Basic, C, Cobol, etc. Para mayor sorpresa observó que esto no es posible
usando solo SQL. Fue por la razón que se hizo necesaria una herramienta que concediera todas las
ventajas de SQL y a su vez, todas las ventajas de un lenguaje de tercera generación. Es así como
nace PL/SQL.
Los bloques de PL/SQL, se pueden escribir en SQL*Plus, para realizar accesos rápidos a la
base de datos, sin la necesidad de utilizar un software especializado, pero PL/SQL también es
empleado en otras herramientas de ORACLE, (como por ejemplo FORMS, REPORTS, Pro*C,
POWER*OBJECTS, entre otras), para la elaboración de programas de gran envergadura.
DECLARE
-- Declaraciones de variables, cursores y excepciones
BEGIN -- Inicio de Bloque
-- Instrucciones SQL;
-- Instrucciones PL/SQL;
EXCEPTION;
-- Instrucciones para el manejo de errores
END; -- Fin de Bloque
/ -- Comando de ejecución del bloque
Cada instrucción de SQL o cada sentencia de control de PL/SQL debe estar terminada en
punto y coma (;)
Para ejecutar un bloque de PL/SQL se debe utilizar un slash (/). Cuando el bloque se ha
ejecutado exitosamente, debe aparecer el mensaje siguiente:
Las palabras reservadas DECLARE, BEGIN y EXCEPTION son las únicas que no están
seguidas de punto y coma.
TIPOS DE BLOQUE
Cada unidad de programa de PL/SQL se compone de uno o más bloques, estos bloques
pueden ser independientes o estar inmersos uno dentro de otro. Puede haber cualquier número de
sub-bloques internos o anidados. Se conocen dos tipos de bloque anónimos y subprogramas
(Procedimientos y Funciones). La siguiente figura ilustra la estructura de los tipos de bloques
conocidos:
Anónimo Procedimiento Función
Bloques Anónimos
Son bloques sin nombre, se declaran en un punto de la aplicación desde el cual se ejecutan.
Se puede insertar un bloque anónimo dentro de otro programa que posea un precompilador, como
Pro*C o ejecutarse desde SQL*Plus. El cuerpo de instrucciones de los Triggers lo conforman
bloques de este tipo.
Subprogramas
Son bloques de PL/SQL con nombre. Estos pueden tomar parámetros de entrada y devolver
valores a su vez una vez finalizada la ejecución. Se pueden invocar desde diferentes puntos en la
aplicación. Se declaran como Procedimientos y Funciones, en general se elabora un procedimiento
para ejecutar alguna tarea compleja o repetitiva, y una función para calcular algún valor.
La siguiente tabla muestra los diferentes programas que pueden crearse en PL/SQL:
Debido a que PL/SQL es una extensión de SQL, las reglas de sintaxis en general que aplican
a SQL también aplican al lenguaje PL/SQL:
Los identificadores y literales, así como otras unidades léxicas, pueden estar separadas por
uno o más espacios u otros delimitadores que no puedan ser confundidos como parte de la unidad
léxica. No puede insertar espacios dentro de las unidades léxicas excepto en cadenas de caracteres
literales y comentarios.
Las instrucciones pueden estar en una misma línea, pero las palabras clave deben estar en una
única línea.
DELIMITADORES
Los delimitadores son símbolos simples o compuestos que adquieren un significado especial
al ser interpretados por PL/SQL, la siguiente tabla muestra los símbolos que maneja este lenguaje:
IDETIFICADORES
Los identificadores son usados para nombrar programas PL/SQL, ítems y unidades, entre las
cuales pueden incluir variables, constantes, excepciones, cursores, variables de cursores,
subprogramas y paquetes. Las reglas para nombrar un identificador en PL/SQL son las mismas que
para nombrar variables.
LITERALES
Los literales incluyen todos los caracteres imprimibles en PL/SQL, estos son letras, números,
espacios y caracteres especiales.
Los literales numéricos se pueden representar por un valor simple entero o punto flotante (por
ejemplo 5 ó -650.76) o en notación científica (por ejemplo 3.45E-5 lo que representa 3.4x10-5)
COMETARIOS
Los comentarios son utilizados para documentar los programas y facilitar el mantenimiento
de los mismos. En PL/SQL los comentarios deben estar precedidos por dos guiones de separación
(--) sin blanco entre ellos, si el comentario ocupa una línea o encerrado entre los separadores de
inicio y fin /* y */, si el comentario ocupa varias líneas.
…
v_salario NUMBER(9,2);
VARIABLES E PL/SQL
Con PL/SQL se pueden declarar variables, estas variables pueden ser utilizadas para recibir
valores resultantes de la ejecución de consultas SQL, o pueden aparecer en cualquier tipo de
expresiones que aparezcan dentro del bloque PL para el cual fueron declaradas. Algunas ventajas
del uso de variables son las siguientes:
ESCALARES
Son variables que contienen valores simples, almacenan principalmente valores que
corresponden a los mismos tipos básicos de las columnas de una tabla. También pueden almacenar
valores lógicos.
COMPUESTAS
Son variables que contienen varios tipos de datos, como los registros.
REFERECIAS
LOB
Los tipos de dato LOB (Objetos Largos) permiten localización eficiente y acceso aleatorio a
los datos, existen los siguientes tipos de datos LOB:
• BFILE : (Binary File) se utiliza para almacenar archivos binarios fuera de la base
de datos, en archivos del sistema operativo.
Variables Bind (de enlace), son variables que se declaran en una sesión y sirven
para almacenar cálculos parciales, son las variables utilizadas para el pase de
parámetros al runtime durante la ejecución de uno o más programas PL/SQL. Para
declarar una variable bind durante una sesión de SQL*Plus se utiliza el comando
VARIABLE seguido del nombre de la variable y el tipo, a continuación se muestra un
ejemplo :
Tanto SQL como SQL*Plus pueden referenciar las variables bind, y SQL*Plus puede
visualizar su valor o utilizarla como cualquier variable durante la ejecución de cualquier bloque.
Para visualizar el contenido de una variable de tipo bind se utiliza el comando PRINT. El siguiente
ejemplo ilustra el uso del comando PRINT:
También podemos ver el contenido de las variables bind usadas dentro de un bloque
PL/SQL, desde dentro del mismo bloque, haciendo uso del paquete DBMS_OUTPUT.PUT_LINE
que es un paquete proporcionado por ORACLE y PUT_LINE es un procedimiento dentro de ese
paquete. El siguiente ejemplo muestra el uso del paquete DBMS_OUTPUT:
Donde:
identificador: es el nombre de la variable
CONSTANT: restringe la variable al único valor de inicialización, no puede ser cambiado
tipo_dato: es un tipo de dato valido, escalar, compuesto, referencia o LOB
NOT NULL: indica que la variable no puede contener un valor nulo, las variables que
poseen esta cláusula deben ser inicializadas
expresión: es cualquier expresión PL/SQL valida, puede ser un literal, otra variable o una
expresión que involucra operadores y funciones
Los nombres de variables deben obedecer las mismas reglas que los objetos SQL
Es recomendable usar ciertos estándares en los nombres para mayor facilidad de
comprensión y mantenimiento del código, por ejemplo v_nombre indicara el nombre
de una variable y c_nombre indicara el nombre de una constante
Se puede inicializar la variable usando el operador de asignación, o usando la
palabra reservada DEFAULT, si no hay asignación inicial el valor será NULL hasta
que se realice la primera asignación
Dos objetos pueden tener el mismo nombre, si están definidos en bloques distintos,
cuando esto sucede, solo puede usarse en un bloque el objeto que esta definido en él
No se debe asignar nombres de variables con el mismo nombre de una columna
referenciada en el bloque, cuando esto sucede al referenciar el nombre de la variable, el
manejador asumirá que se está consultando la columna y puede generar errores
Los identificadores no deben tener más de 30 caracteres. El primer carácter debe ser
una letra, los restantes caracteres pueden ser letras, números o caracteres especiales
Los objetos de PL/SQL (variables y constantes) y las operaciones efectuadas sobre los
objetos de la base de datos (tablas, vistas y columnas), pueden ser asociados con los siguientes
atributos:
%ROWTYPE : Este atributo es utilizado para declarar una variable con la estructura
idéntica a la de una fila en una tabla o vista. A continuación se muestra un ejemplo:
FILA_EMP EMPLEADO%ROWTYPE;
%TYPE: Este atributo es utilizado para declarar una variable del mismo tipo como:
- Una columna de una tabla o vista
- Una variable previamente declarada
A continuación se muestra un ejemplo de este tipo de declaración:
TRABAJADOR EMPLEADO.NOMBRE%TYPE;
En este ejemplo, el identificador TRABAJADOR será del mismo tipo que la columna
NOMBRE de la tabla EMPLEADO.
DECLARE
TYPE emprectyp IS RECORD
(empno NUMBER(4) NOT NULL,
ename VARCHAR2(10),
job VARCHAR2(14),
......
deptno NUMBER (4));
La siguiente declaración, define la variable reg_emp como de tipo registro con la estructura
definida en la declaración anterior.
emp_rec emprectyp;
DECLARE
TYPE timetyp IS RECORD
(second NUMBER(2) :=0,
minute NUMBER(2) := 0,
hour NUMBER(2) := 0);
Se tiene un nuevo tipo de dato el cual permite ser usado como un arreglo, es el tipo TABLE.
A continuación se muestra la sintaxis para declarar variables de tipo table.
DECLARE
TYPE enametabtyp IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
DECLARE
TYPE enametabty IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Al declarar una variable de PL/SQL como de tipo TABLE se deben tener en cuenta las
siguientes consideraciones:
PROCEDURE insertar_datos_emp
(filas BINARY_INTEGER, empno_tab empnotabtyp, ename_tab enametabtyp) IS
BEGIN
FOR i IN 1 .. filas LOOP
INSERT INTO EMPLEADO (EMPNO, NOMBRE, ...)
VALUES (empno_tab(i), ename_tab(i), ...);
END LOOP;
END;
Para asignar un valor a una variable, deberá escribir una sentencia PL/SQL. En el lado
izquierdo estará el nombre de la variable ya declarada, a continuación el operador de asignación
(:=) y seguidamente el valor o la expresión cuyo resultado se almacenara en la variable, terminando
con punto y coma (;).
Donde:
identificador: es el nombre de la variable
expresión: puede ser una variable, un literal o una llamada a función, pero no una columna de
base de datos
En los bloques PL/SQL una variable declarada en la sección de declaraciones, solo es visible
dentro de ese bloque. Un bloque que sea declarado a su vez dentro de otro (bloque interno) puede
acceder a las variables que fueron declaradas en el bloque principal que lo contiene y manipular el
contenido de estas variables, además de las variables que sean declaradas en su propia sección de
declaración. Sin embargo, las variables declaradas en el bloque interno no pueden visualizarse en el
bloque externo.
…
DECLARE
X
BINARY_INTEGER;
BEGIN
-- Instrucciones
X := X + 1;
DECLARE
Y NUMBER; Alcance
de X
BEGIN
…
Y := Y + X; Alcance
… de Y
END;
…
END;
En el ejemplo anterior observe que en bloque interno tanto la variable X, que fue declarada
en el bloque externo, como la variable Y propia del bloque, son visibles en tanto que en el bloque
externo solo es visible la variable X. Esto se debe a que una variable declarada en un bloque, tiene
vida solo mientras el bloque se ejecuta, y desaparece al terminar la ejecución de ese bloque.
Alcance
OPERADORES
Los operadores son símbolos reservados de PL/SQL que permiten la comparación de dos o
más expresiones para permitir la obtención de un resultado BOOLEANO. Se conocen varios tipos
de operadores, a continuación se muestran los operadores que maneja PL/SQL:
OPERADORES UMERICOS
Operador Significado
< menor que
> mayor que
= igual a
!= ó <> diferente de
<= menor o igual a
>= mayor o igual a
Operador Significado
AND Y
OR O
NOT Negación
Los operadores lógicos poseen un valor de verdad que puede ser TRUE o FALSE, o en su
defecto puede ser NULL o vacío. Dependiendo de los valores de las dos expresiones que en un
momento dado se estén comparando, los valores posibles de la comparación para cada tipo de
operador se muestran a continuación:
Para el operador OR
PRACTICA 1
1. Desarrollar un bloque de programa simple, que muestre el costo final de un producto, al
aplicar el Iva de 15% al precio solicitado como entrada.
2. Declarar una tabla PL/SQL denominada estudiante con los campos nombre, edad y sexo. El
programa deberá mostrar un mensaje indicando que la misma esta vacío, utilice los
métodos vistos.
Capítulo 2
FUCIOES E PL/SQL
FUCIOES E PL/SQL
El lenguaje de programación PL/SQL soporta todas las funciones provistas por SQL. Todas
las funciones, excepto las de agrupamiento, pueden ser utilizadas como parte de una instrucción
PL/SQL que no involucra cláusulas de SQL. La tabla siguiente muestra algunas de las funciones
que pueden utilizarse clasificadas por tipo:
Los identificadores de cada sentencia son primero verificados para comprobar si son
columnas de una tabla de la base de datos, en caso de no serlo, el manejador asumirá que es un
identificador de PL/SQL.
Al igual que en SQL, para recuperar datos de la base de datos se hace uso de la cláusula
SELECT, con la única variante de que para poder manipular el resultado mediante instrucciones
PL/SQL se necesitan variables de almacenamiento propias de PL/SQL, puesto que las columnas no
se pueden manipular directamente.
Donde:
La cláusula INTO es obligatoria, debe aparecer entre las opciones SELECT y FROM. Se
utiliza para especificar las variables que almacenaran los valores de las columnas que retornara la
consulta. La consulta debe retorna una y solo una fila, si retorna mas de una generara un error, igual
sucede cuando la consulta no retorna ninguna fila. En PL/SQL los errores pueden capturarse y
tratarse de manera diferente para que el programa no se detenga de manera abrupta, a este proceso
se le llama manejo de excepciones y será explicado en capítulos posteriores.
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = ‘VENTAS’;
END;
DECLARE
SUELDO NUMBER(6,2) := 5000.50;
EMPLEADO CHAR(25) := 'MONICA';
BEGIN
INSERT INTO EMPLEADO (NOMBRE, CARGO,
SALARIO)
VALUES (EMPLEADO, 'SECRETARIA', SUELDO);
END;
DECLARE
SUELDO NUMBER(6,2) := 5000.50;
EMPLEADO CHAR(25) := 'MONICA';
BEGIN
UPDATE EMPLEADO
SET SALARIO = SALARIO * 1.5
WHERE EMPNO = 500;
END;
Igual que en las operaciones anteriores, la eliminación de datos desde un bloque PL/SQL es
idéntica a la eliminación de datos hecha desde SQL. A continuación se muestra un ejemplo:
DECLARE
EMPLEADO EMPLEADO.NOMBRE%TYPE := 'MONICA';
BEGIN
DELETE FROM EMPLEADO
WHERE NOMBRE = EMPLEADO
AND CODIGO = 1050;
COMMIT;
END;
COTROL DE TRASACCIOES
El lenguaje PL/SQL permite un control total de la lógica de las transacciones, tomando como
transacción el mismo criterio que en SQL. Esto permite que el usuario pueda controlar totalmente
los cambios que se efectúan en la base de datos, guardando algunos grupos de datos y descartando
otros si la situación así lo requiere. Una transacción comienza con la primera instrucción SQL que
se ejecuta y finaliza con el próximo COMMIT o ROLLBACK exitoso, el final de una transacción
puede ocurrir de manera explícita, por una instrucción dentro de un bloque PL/SQL o de manera
implícita, por algún evento en el entorno de SQL donde se está ejecutando el bloque de
instrucciones, por ejemplo la culminación de una sesión SQL*Plus termina automáticamente la
transacción pendiente. Para marcar un punto intermedio en el procesamiento de la transacción se
utiliza el comando SAVEPOINT.
Los comandos de control de transacciones son completamente soportados por PL/SQL, sin
embargo algunas instalaciones pueden imponer algunas restricciones al uso de estos.
DECLARE
SUELDO NUMBER(6,2) := 5000.50;
EMPLEADO CHAR(25) := 'MONICA';
BEGIN
INSERT INTO EMPLEADO (NOMBRE, CARGO,
SALARIO)
VALUES (EMPLEADO, 'SECRETARIA',
SUELDO);
SAVEPOINT A;
SAVEPOINT B;
UPDATE EMPLEADO
SET SALARIO = SUELDO
WHERE NOMBRE = EMPLEADO
OR NUMDEPT = 01;
ROLLBACK TO SAVEPOINT B;
COMMIT;
END;
/
PRACTICA 2
1. Crear un bloque PL/SQL que muestre por pantalla cuantos registros tiene la tabla
Empleados.
2. Crear un bloque PL/SQL que inserte una fila a la tabla empleados. Todos los datos debe ser
solicitados por pantalla.
3. Crear un bloque PL/SQL que actualice el nombre del registro insertado en el ejercicio
anterior.
4. Crear un bloque PL/SQL que elimine el registro insertado en el ejercicio anterior
Capítulo 3
ESTRUCTURAS DE COTROL
En PL/SQL se puede controlar el flujo de control de las operaciones mediante el uso de dos
tipos de estructuras de control básicas: CONDICIONALES con la sentencia IF e ITERACIONES
con la sentencia LOOP.
CODICIOALES
La sentencia IF
Permite la ejecución de una o varias sentencias dependiendo de que el valor de verdad que
retorna una condición resulte verdadero. En la instrucción condicional puede haber una o más
condiciones en la misma instrucción, en este caso cada una gobernará la ejecución de un grupo de
instrucciones y todas las condiciones deben ser excluyentes entre sí.
. . . . . . . .
. . . . . . . . (grupo de ELSIF)
. . . . . . . .
[ELSE
sentencia o grupo de sentencias por defecto]
END IF;
Donde:
Ejemplo de IF: Construya un programa que permita obtener como parámetro de entrada
desde teclado un código de empleado, buscará el salario del mismo y aumentar el sueldo según la
tabla siguiente:
DECLARE
SUELDO NUMBER;
BEGIN
SELECT SALARIO INTO SUELDO
FROM EMPLEADO
WHERE CODIGO = &IDENTIFICA;
IF (SUELDO => 10000) AND (SUELDO <= 20000) THEN
UPDATE EMPLEADO
SET SALARIO = SUELDO + 5000;
WHERE CODIGO = &IDENTIFICA;
ELSIF (SUELDO > 20000) AND (SUELDO < 30000)
THEN
UPDATE EMPLEADO
SET SALARIO = SUELDO + 4000;
WHERE CODIGO = &IDENTIFICA;
END IF;
COMMIT;
END;
/
OTA: El ampersand (&) es usado en los bloques de PL/SQL, (cuando se trabaja con SQL*PLUS), para
facilitar el ingreso de parámetros. Los parámetros serán recibidos e interpretados al momento de la ejecución del bloque.
Como se puede observar en el ejemplo anterior, código es igual a &IDENTIFICA, donde &IDENTIFICA va a ser
sustituido por el valor introducido por el usuario al momento de ejecutar el bloque de PL/SQL.
ITERACIOES
Bucle simple
Bucle numérico (FOR)
Bucle condicional (WHILE)
BUCLE SIMPLE
Ejemplo 2: Construya un programa que permita insertar en una tabla temporal diez veces la
cadena de caracteres “HOLA”:
DECLARE
CONTADOR NUMBER(3) := 0;
BEGIN
LOOP
INSERT INTO TEMPORAL (NUMERO1, TEXTO)
VALUES (CONTADOR, 'HOLA');
CONTADOR := CONTADOR + 1;
EXIT WHEN CONTADOR = 10;
END LOOP;
END;
/
Donde:
índice: es la variable de conteo y control del bucle. Esta variable es implícitamente de tipo
numérico, el cual podrá ser referenciado dentro del bucle, pero no podrá asignársele valor
REVERSE: realiza el conteo de mayor a menor, (si no se coloca este parámetro el conteo se
realizará de menor a mayor).
entero_1 y entero_2: rango en el que se va a realizar el conteo.
BEGIN
FOR I IN 1..10 LOOP
INSERT INTO TEMPORAL (NUMERO1, TEXTO)
VALUES (I, 'HOLA');
END LOOP;
END;
/
Repite una o más sentencias mientras la condición de control de la iteración sea verdadera
Donde:
condición: es la condición que gobierna la ejecución
DECLARE
CONTADOR NUMBER(3) := 0;
BEGIN
SETECIA GOTO
Sintaxis: . . . . . . . .
. . . . . . . .
GOTO ETIQUETA
sentencia o grupo de sentencias
<<ETIQUETA>>
sentencia o grupo de sentencias
. . . . . . . .
. . . . . . . .
ETIQUETAS
Las etiquetas se pueden usar para referenciar valores en bloques y bucles, que de otra manera
no podrían ser visibles a causa de las reglas de alcance. Las etiquetas tienen que ser especificadas
previa a sentencias ejecutables.
Sintaxis : <<Nombre_etiqueta>>
DECLARE
declaraciones
BEGIN
sentencias a ejecutar
[EXCEPTION
excepciones manejadas en el bloque]
ED Nombre_etiqueta;
BEGIN
<<BLOQUEEXTERNO>>
DECLARE
N NUMBER;
BEGIN
N := 5;
<<BLOQUEINTERNO>>
DECLARE
X NUMBER := 10;
N CHAR(10) := 'DOS';
BEGIN
INSERT INTO TEMPORAL
VALUES (BLOQUEEXTERNO.N, X, N);
COMMIT;
END BLOQUEINTERNO;
END BLOQUEEXTERNO;
END;
/
En el ejemplo anterior, se está utilizando el nombre del bloque para decirle a PL/SQL, que el
valor "N" que deberá ser procesado, es el que se declaró en el bloque externo y no el que se declaró
en el bloque interno.
BEGIN
<<ETIQUETA>>
FOR I IN 1..10 LOOP
-- sentencias a ejecutar
DECLARE
I NUMBER := 10;
BEGIN
INSERT INTO TEMPORAL
VALUES (I, ETIQUETA.I, 'COMPLETO');
END;
END LOOP ETIQUETA;
END;
/
En el ejemplo anterior, se toma el valor "I" del bloque interno y el valor "I" del bucle FOR,
referenciado por la etiqueta, al momento de realizar la inserción.
CURSORES
CURSORES en SQL
Cuando se manda a ejecutar una instrucción SQL, el manejador Oracle Server abre un área
en memoria en la cual el comando es interpretado y, en caso de ser correcto, el comando es
ejecutado. A esta área de memoria se le llama CURSOR.
Cuando comienza la ejecución de la instrucción, PL/SQL crea un cursor implícito que posee
el identificador de SQL. PL/SQL maneja este cursor automáticamente, sin embargo el programador
puede declarar explícitamente cursores para el tratamiento secuencial de filas de datos, la forma de
hacer esto se explicará en secciones subsiguientes. Hay cuatro atributos asociados a los cursores
que nos permiten controlar y verificar el resultado de su ejecución, estos atributos son:
SQL%ROWCOUNT Retorna el número de filas que fueron afectadas por la mas reciente
instrucción de SQL, es un valor entero
SQL%FOUND Valor lógico BOOLEANO que retorna VERDADERO si la más reciente
instrucción SQL afectó una o más filas de datos
SQL%NOTFOUND Valor BOOLEANO que retorna FALSO si la mas reciente instrucción SQL
no afectó ninguna fila de datos
SQL%HISOPEEN Siempre evalúa en FALSO debido a que PL/SQL cierra implícitamente los
cursores inmediatamente después que son ejecutados
Los atributos de cursores permiten evaluar que pasó en el último cursor implícito utilizado,
estos atributos pueden utilizarse en instrucciones PL/SQL pero no pueden ser utilizados en
instrucciones SQL. Se puede utilizar estos atributos en la sección de excepciones de un bloque para
conocer el resultado de la ejecución de una instrucción de manipulación de datos y tomar las
acciones necesarias como emitir mensajes de número de registros afectados.
Los cursores como se indicó anteriormente son áreas de memoria que contienen filas de datos
de una sentencia SQL durante la ejecución, existen dos tipos de cursores:
CURSORES IMPLÍCITOS
CURSORES E PL/SQL
Los cursores en PL/SQL son cursores explícitos, para crear y manipular este tipo de cursores
se deben tener en cuenta varios aspectos, tomando en cuenta que el control de estos es
responsabilidad del programador:
Sintaxis: DECLARE
CURSOR nombre_del_cursor IS sentencia select;
Para poder utilizar correctamente un cursor explícito, debe seguir los siguientes pasos:
En este caso la cláusula INTO funciona igual que cuando se utiliza para recuperar datos en
cualquier instrucción de SQL. La primera columna obtenida será asignada a la variable1, la segunda
a la variable2, y así sucesivamente. El orden de estas columnas está fijado por la sentencia
SELECT, al momento de la creación del cursor.
Paso 4: Cerrar el cursor, para ello se utiliza la cláusula CLOSE seguida del nombre del
cursor
CLOSE nombre_de_cursor;
DECLARE
SALARIOLIMITE NUMBER(4) := 12000;
MINOMBRE EMPLEADO.NOMBRE%TYPE;
MISALARIO EMPLEADO.SALARIO%TYPE;
CURSOR MICURSOR IS -- Declaración del cursor Paso 1
SELECT NOMBRE, SALARIO
FROM EMPLEADO
WHERE SALARIO > SALARIOLIMITE;
BEGIN
OPEN MICURSOR; -- Apertura del cursor Paso 2
LOOP
-- Recuperación de los datos Paso 3
FETCH MICURSOR INTO MINOMBRE, MISALARIO;
EXIT WHEN MICURSOR%NOTFOUND;
INSERT INTO TABLANUEVA
VALUES (MINOMBRE, MISALARIO);
END LOOP;
CLOSE MICURSOR; -- Cierre del cursor
COMMIT;
END;
/
CURSORES Y REGISTROS
...
FETCH empleados ITO reg_empleado;
También se puede utilizar la instrucción FOR para declarar y utilizar un cursor sin que se
tenga que utilizar explícitamente las instrucciones de APERTURA, RECUPERACION DE
DATOS ni CIERRE del cursor, sino que la misma estructura se encarga de estas operaciones al
momento de su ejecución.
Nombre del registro: contendrá cada fila de datos que sea recuperada, las columnas de datos
en el registro se pueden referenciar utilizando el nombre del registro seguido del nombre o alias de
la columna separados por un punto.
ombre_del_registro.ombre_de_la_columna
REAPERTURA DE U CURSOR
Esta técnica se utiliza para reabrir un cursor con otros valores de inicialización.
DECLARE
BONOTOTAL NUMBER(8,2) := 0;
SALARIOMIN EMPLEADO.SALARIO%TYPE :=
1000;
BONOAUMENTO EMPLEADO.SALARIO%TYPE;
CURSOR BONO IS
SELECT SALARIO * .10
FROM EMPLEADO
WHERE SALARIO > SALARIOMIN;
BEGIN
OPEN BONO;
LOOP
FETCH BONO INTO BONOAUMENTO;
EXIT WHEN BONO%NOTFOUND;
BONOTOTAL := BONOTOTAL + BONOAUMENTO;
IF BONOTOTAL > 2000 THEN
CLOSE BONO;
SALARIOMIN := SALARIOMIN + 500;
BONOTOTAL := 0;
-- Reapertura del cursor, pero con un nuevo
-- valor de SALARIOMIN
OPEN BONO;
END IF;
. . . . . . . .
. . . . . . . .
END LOOP;
END;
/
Los cursores pueden parametrizarse de manera que puedan ser abiertos y cerrados en
diferentes instantes de tiempo, con distintos valores que permiten variar la condición de
recuperación de los datos.
Sintaxis: DECLARE
CURSOR nombre_del_cursor [(nombre_del_parámetro tipo_del_parámetro)]
IS sentencia_select_realizando_la_consulta;
DECLARE
CURSOR MICURSOR (SUELDO NUMBER) IS
SELECT NOMBRE
FROM EMPLEADO
. . . . . . . .
UPDATE EMPLEADO
SET SALARIO = SALARIO*10.0
WHERE NOMBRE = 'JOSE';
IF SQL%NOTFOUND THEN
--Si no existe el empleado se inserta.
INSERT INTO EMPLEADO(CODIGO, NOMBRE,
SALARIO)
VALUES (4332, 'JOSÉ', 10000);
END IF;
. . . . . . . .
A menudo, el procesamiento que se lleva a cabo en un bucle de extracción modifica las filas
extraídas por el cursor. PL/SQL proporciona una sintaxis conveniente para estas situaciones. El
método consta de dos partes: la cláusula FOR UPDATE en la declaración del cursos, y la cláusula
WHERE CURRENT OF en una orden UPDATE o DELETE.
FOR UPDATE
La cláusula FOR UPDATE es parte de una orden SELECT. Es la última cláusula de la orden,
después de la cláusula ORDER BY (si existe). La sintaxis es:
Donde referencia_columna es una columna, o lista de columnas, de la tabla sobre la que se realiza
la consulta. Por ejemplo,
DECLARE
CURSOR empleados IS
SELECT empno, nombre, salario
FROM empleado
WHERE numdept = 01
FOR UPDATE NOWAIT;
WHERE CURRET OF
Si se declare el cursor con la cláusula FOR UPDATE, puede emplearse la cláusula WHERE
CURRENT OF en una orden UPDATE o DELETE. La sintaxis de esta cláusula es la siguiente:
Donde cursor es el nombre de un cursor declarado con una cláusula FOR UPDATE. La
cláusula WHERE CURRENT OF hace referencia a la fila recién extraída por el cursor.
PRACTICA 3
1. Elaborar un programa que consulte todos los registros de la tabla VENDEDOR y calcule
las comisiones en base al 8% de las ventas, actualice las comisiones para todos los
vendedores
2. Elabore un programa que llene la tabla GRUPO_NUMERO con diez grupos de números
del 1 al 10, el resultado del programa debe ser como sigue:
GRUPO NUMERO
1 1
1 2
1 3
…. ….
1 10
2 1
2 2
… …
Capítulo 4
MAEJO DE ERRORES
Los errores en PL/SQL son llamados excepciones. Cuando ocurre un error, el procesamiento
salta a la sección de EXCEPCIONES donde deben estar las instrucciones a ejecutarse en caso de
detectarse el error, si no existe el manejo de la excepción el manejador suspenderá la ejecución y
arrojará un mensaje indicando cual fue la condición que no fue tratada apropiadamente. Cuando el
manejo de la excepción es completado, el procesamiento del bloque termina.
EXCEPCIOES PREDEFIIDAS
Las excepciones predefinidas son un grupo de errores posibles totalmente reconocidos por el
manejador. La tabla siguiente muestra algunas de las excepciones predefinidas más comunes:
MAEJADO EXCEPCIOES
Como se indicó anteriormente, cuando ocurre una excepción el control de la ejecución salta
hasta la sección de excepciones, donde estarán las instrucciones de manejo de la condición de error
apropiadas.
Sintaxis: . . . . . . . . . .
EXCEPTIO
WHE nombre_de_la_excepción [OR nombre_de_la_excepción ... ] THE
instrucciones_de_manejo_de_excepcion;
WHE OTHERS THE
secuencia_de_sentencias;
Donde:
EXCEPTION: indica el comienzo de la sección de manejo de excepciones.
WHEN: indica que a continuación se indicará el nombre de la excepción, además se
especificarán las acciones a tomar cuando ocurra esta condición.
WHEN OTHERS: es el conjunto de acciones que se ejecutaran en caso de ocurrir alguna
excepción no considerada en las declaraciones que la preceden
DECLARE
SUELDO NUMBER;
BEGIN
SELECT SALARIO INTO SUELDO
FROM EMPLEADO
WHERE CODIGO = 2000;
EXCEPTION
WHEN TOO_MANY_ROWS OR NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20100,'No retorna filas o demasiadas filas
retornadas');
END;
/
EL PRAGMA EXCEPTIO_IIT
Este pragma permite asociar una excepción nominada con un error ORACLE determinado,
lo que permite interceptar de forma específica dicho error, en lugar de a través de un gestor
OTHERS. El pragma EXCEPTION_INIT se emplea de la forma siguiente:
DECLARE
E_EMPLEADOS EXCEPTION;
PRAGMA EXCEPTION_INIT(E_EMPLEADOS,-2292);
V_NUMDEP DEPARTAMENTO.NUMDEPT%TYPE = 1;
BEGIN
DELETE FROM DEPARTAMENTO
WHERE NUMDEPT = V_NUMDEPT;
COMMIT;
EXCEPTION
WHEN E_EMPLEADOS THEN
DBMS_OUTPUT.PUT_LINE(‘NO SE PUEDE ‘||
‘BORRAR DEPARTAMENTO||
TO_CHAR(V_NUMDEP));
END;
Además de las excepciones predefinidas el usuario puede definir sus propias excepciones, y
obligar la ocurrencia de esa excepción, o de una predeterminada. Para definir una excepción propia
se debe declarar previamente la excepción de la siguiente manera:
Sintaxis: DECLARE
nombre_excepcion_propia EXCEPTIO;
Una vez definida la excepción puede activarse, esto es hacer que el control salte hasta la
sección de excepciones en el punto donde la excepción aparece, utilizando la cláusula RAISE.
La cláusula RAISE se puede utilizar para activar (levantar) una excepción tanto de usuario
como predefinida, sencillamente colocando el nombre de la excepción que se desea activar a
continuación de la cláusula RAISE.
El siguiente ejemplo ilustra la forma de declarar y activar una excepción de usuario, en este
se define la excepción AUMENTO y se activa la misma en caso de que el sueldo sea menor a 3000.
Al activarse la excepción el control va al manejo de la excepción y actualiza la tabla EMPLEADO
colocando el salario en 5000.
DECLARE
SUELDO NUMBER;
AUMENTO EXCEPTION;
BEGIN
SELECT SALARIO INTO SUELDO
FROM EMPLEADO
WHERE CODIGO = 2000;
IF SUELDO < 3000 THEN
RAISE AUMENTO;
EXCEPTION
WHEN AUMENTO THEN
UPDATE EMPLEADO
SET SALARIO = 5000
WHERE CODIGO = 2000;
COMMIT;
END;
/
La cláusula RAISE también puede usarse sin el nombre de la excepción, con la condición
que se utilice dentro del manejador de excepciones. La finalidad de realizar esto, es para reactivar la
excepción en curso.
En algunos casos se hace necesario tener el control sobre excepciones, que no han sido
predefinidas por ORACLE.
DECLARE
CODIGOERROR NUMBER;
MENSAJEERROR CHAR(70);
FORMATOFECHA EXCEPTION;
PRAGMA EXCEPTION_INIT(FORMATOFECHA, -1858);
BEGIN
UPDATE EMPLEADO
SET FECHACONTRATO = 'JAN-10-93' -- error en el formato de fecha
RAISE_APPLICATION_ERROR(CODIGOERROR,MENSAJEERROR);
END;
/
PRACTICA 4
1. Elaborar un programa que consulte los datos de un empleado, si el empleado no existe,
mostrar un mensaje que indique “El código de empleado X no Existe. Ingrese un código
valido”.
2. Elaborar un programa que ingrese un nuevo empleado, antes de insertar el registro debe
validad que el código de empleado no existe, si existe mostrar un error que indique, “El
código X ya esta asignado. Por favor utilice un nuevo código”.
3. Elaborar un programa para actualizar el salario de un empleado que el usuario introduzca,
antes de actualizar valide que el salario nuevo sea mayor al salario actual, de lo contrario
arroje un error que indica que no puede disminuir el salario del empleado.
Capítulo 5
PROGRAMAS ALMACEADOS E LA
BASE DE DATOS
IGEIERIA DE PL/SQL
Ingeniería de PL/SQL
Bloque de PL/SQL
Bloque de PL/SQL
DECLARE
Procedimiento DECLARE
Procedimiento Procedimiento
BEGIN Procedimiento Ejecutor
Procedimiento BEGIN de
SQL Procedimiento sentencias
Procedimiento SQL Procedimental
SQL Procedimiento
END; SQL
END;
ORACLE RDBMS
Programa anfitrión
Ingeniería de PL/SQL
Lenguaje anfitrión
Lenguaje anfitrión
Bloque de PL/SQL
Bloque de PL/SQL
DECLARE
DECLARE
Procedimiento
Procedimiento
Procedimiento Ejecutor
Procedimiento
BEGIN de
BEGIN
Procedimiento sentencias
Procedimiento
SQL Procedimental
SQL
Procedimiento
Procedimiento
SQL
SQL
END;
END;
Lenguaje anfitrión
Lenguaje anfitrión
Lenguaje anfitrión
Procedimiento Función
Solo puede retornar valores mediante el uso Retorna siempre un valor en el nombre de la
de parámetros función
Se invocan solo con el nombre y operan Deben aparecer en algún lugar donde se
como si el código estuviera en el lugar donde se pueda almacenar el valor que retorna
llaman
• Permiten definir las reglas o funciones del negocio, por ejemplo, Crear una orden,
Eliminar un cliente.
• Encapsula una transacción, por ejemplo, recolecta y procesa información desde
nodos remotos
• Permiten crear programas con código genérico (compartido o común), por ejemplo,
Calculo del impuesto sobre la renta
• Los procedimientos y funciones son compilados en la Base de Datos al momento de
su creación. La forma y el texto compilado de un procedimiento o función son
almacenados en el diccionario de datos.
AS
/
Los argumentos pueden operar en tres modos, dependiendo del modo, el argumento se tratará
como un parámetro por valor o por referencia. La siguiente tabla muestra el tipo de argumento
posible para los parámetros en PL/SQL:
Modo Descripción
IN Parámetro por valor, no modifica los valores que recibe como parámetro. Es el modo
por defecto
OUT Parámetro de solo salida, no puede contener un valor de entrada al momento de llamar
al procedimiento o función
IN OUT Parámetro por referencia, puede contener valores de entrada al procedimiento y
cualquier modificación del parámetro dentro del procedimiento o función se reflejara en
el correspondiente parámetro externo
El siguiente ejemplo ilustra la forma de crear una función. Crear una función que acepte
como entrada un número de cuenta contable y retorne el saldo del balance de la cuenta
Instrucciones DDL
Instrucciones dinámicas de SQL
Las instrucciones COMMIT, ROLLBACK y SAVEPOINT en procedimientos
llamados remotamente
Dependiendo del lugar desde el cual se realiza la llamada al procedimiento, existen diferentes
formas de ejecutar un procedimiento almacenado. A continuación se listan las formas de invocar un
procedimiento almacenado:
Desde OCI
CALL OSQL3 (cursor, /*interpretador*/
"BEGIN
nombre_procedimiento(parámetros);
END;"
CALL OBNDRV (..);
CALL OEXEC (..);
ERRORES DE PL/SQL
Para ilustrar el manejo de errores en PL/SQL trate de crear un procedimiento llamado TEST1
usando el código siguiente:
A continuación muestre los errores de compilación, para ello use la instrucción SHOW
ERRORS
SQL> SHOW ERRORS
LINE/COL ERROR
------------------------------- -----------------------------------------------------------------
1/17 PLS-00103: Encountered the symbol "BEGIN" when expecting one of
the following:
( ; is with as compress compiled wrapped
El usuario puede definir errores y puede hacer que al activarse el error se retorne el número y
el mensaje del error, los cuales previamente deben haber sido definidos por el usuario, para esto:
• Se debe definir el grupo de errores de aplicación
• Se sugiere estandarizar los números y mensajes de error a través de la creación de una tabla
en la Base de Datos, para mantener los errores y mensajes, y ejecutar un SELECT … INTO antes
de llamar al procedimiento
• El rango numérico entre -20000 a -20999, esta reservado en ORACLE para los errores
definidos por el usuario
• ORACLE no verifica que los errores definidos por el usuario sean únicos
Crear un procedimiento que active un mensaje de error definido por el usuario si la condición
que se indica no es encontrada.
Al igual que las tablas, los procedimientos y funciones también pueden ser eliminados. La
sintaxis para eliminar un procedimiento es:
PAQUETES
• Procedimientos
• Funciones
• Definiciones de Cursores
• Definiciones de Excepciones
ESTADO PERSISTETE
Los paquetes retienen el último estado válido de los objetos que contienen, mientras esté
activa la sesión del usuario que invoca al paquete o un objeto contenido en él, esto significa que:
Las variables retienen los valores asignados y los cursores retienen las áreas de
contexto y posicionamiento de datos
El estado persistirá a través de las llamadas que realice el usuario dentro de una
sesión
Cada sesión tiene su propio control de versiones del estado del paquete
ESTRUCTURA DE U PAQUETE
• Cuerpo del Paquete : Es el área de texto donde se coloca el código de los procedimientos y
funciones que el paquete contiene
Package PK
Especificaciones
Procedure A
variable C
variable D PK.A;
procedure A x := PK.C;
procedure B
i := D;
Cuerpo
j := C;
Se deben especificar por separado, tanto la cabecera como el cuerpo del paquete. Para la
definición de la cabecera la sintaxis es la siguiente:
El siguiente ejemplo ilustra la forma de crear el cuerpo del paquete definido anteriormente:
[PACKAGE]
Para eliminar un paquete, se utiliza la cláusula DROP, recuerde que un paquete es también
un objeto de la base de datos:
PRACTICA 5
1. Crear un procedimiento con el nombre valida_no_existe_cliente, donde el empleado debe
recibir el código del cliente y consultar si existe, de ser así, retornar un error con el mensaje
“El código del cliente ya existe”
2. Crear una función llamada busca_direccion_cliente, que reciba el código del cliente y
retorne la dirección del mismo.
3. Crear una función llamada busca_descripcion_producto que reciba el código del producto y
retorne el nombre del mismo.
4. Crear un procedimiento para insertar un nuevo cliente, debe recibir los valores a insertar, y
antes de ejecutar el insert debe validar que el cliente no exista, para esto utilice el
procedimiento creado en el ejercicio 1.
5. Crear un procedimiento llamado maneja_error que le permita controlar los errores que
ocurren en el sistema, el procedimiento debe recibir el código del error, el mensaje y el
nombre del programa que lo origina, debe insertar estos valores en la tabla errores_sistema
junto con la fecha y hora en la que ocurrió el error, luego propagar el error.
6. Modifique los programas de los ejercicios 1 y 4 para que cuando ocurre un error cualquiera
que este sea, ejecuten el procedimiento 5.
Capítulo 6
TRIGGERS DE BASE DE DATOS
Los triggers son eventos que se activan automáticamente cuando en la base de datos ocurre el
evento al cual están asociados. Un trigger se asocia a un objeto que contiene datos modificables en
la base de datos, esto es una tabla o una vista, y se dispara cuando ocurre un cambio en el contenido
de ese objeto.
Los triggers ayudan a lograr la integridad en aquellas bases de datos que requieren tablas
desnormalizadas, es decir copias de tablas grandes a tablas más pequeñas, técnica que se utiliza con
la finalidad de aumentar la velocidad de ejecución.
Los triggers permiten la creación de tablas de auditoria, con el fin de saber que registro,
usuario, columna, fecha, hora y datos fueron modificados durante una transacción. De esta manera
se podrá preservar tanto el dato antiguo como el dato nuevo en aquellos valores que son críticos.
Los triggers también son utilizados ampliamente en bases de datos distribuidas, para llevar
controles sobre la data, así como también llevar un control de las reglas del negocio.
Según el tipo de operación, asociados internamente a la base de datos existen tres tipos de
triggers:
De acuerdo al momento en que se disparan en relación con el evento al cual están asociados,
los triggers pueden ser:
La siguiente tabla muestra las posibles combinaciones de activación de los triggers según el
tipo de trigger de que se trate y al instante de activación:
Instante de activación
Acción Before After
Insert Before Insert After Insert
Update Before Update After Update
Delete Before Delete After Delete
Un evento en la base de datos dispara uno o varios de los triggers definidos en la tabla
anterior, y cada una de estas combinaciones puede estar asociada a una transacción o a una fila, de
manera excluyente. Esto significa que existen un total de doce triggers asociados a las tablas o
vistas de la base de datos.
Debido a que los triggers de base de datos pueden ser manejados por el usuario, pero el
control de las operaciones internas y de la modificación de los datos es responsabilidad única del
manejador, los triggers tienen ciertas restricciones, a continuación se listan algunas:
• No se pueden usar cláusulas de control de operación. Esto significa que desde un trigger
de base de datos no se puede realizar COMMIT, ni ROLLBACK ni tampoco SAVEPOINT.
Por lo tanto las transacciones deben ser terminadas por quien disparó un trigger y no por el
trigger en sí
• Los triggers de base de datos no pueden crearse sobre una instrucción SELECT, ni pueden
asociarse a instrucciones DDL, tales como son CREATE, ALTER o DROP
• Los triggers de base de datos no pueden asociarse a las tablas del Diccionario de Datos
• Los triggers de base de datos solo se activan cuando ocurre el evento al cual están
asociados, esto quiere decir que su activación no puede ser forzada por el usuario
Un trigger de Base de Datos definido por el usuario está formado por un bloque de PL/SQL
asociado a una tabla específica. Se dispara de manera implícita cuando se ejecuta la instrucción
asociada a la tabla.
INSERT tabla T
INSERT
INTO t....;
triger
DELETE
FROM t...;
DELETE
triger
EMPLEADO DEPARTAMENTO
Antes del trigger de fila
100 10
Despues del trigger de fila
50
120 Antes del trigger de fila
240 10
Despues del trigger de fila
260 40
280 20
Antes del trigger de fila
300 30
Despues del trigger de fila
301 10
Despues del comando trigger
Un trigger de base de datos puede ser creado de manera similar a la creación de cualquier
otro objeto de la base de datos, para ello se hace uso de la cláusula CREATE TRIGGER.
Donde:
esquema: indica el entorno de usuario
nombre_de_trigger: indica el nombre con el cual se va a crear el trigger
columnas: indica las columnas de la tabla a las cuales va a estar asociado el trigger
tabla: indica el nombre de la tabla a la cual va a estar asociado el trigger
condición: restringe la activación del trigger a las filas que cumplen esta condición
bloque_pl/sql: contiene el bloque de instrucciones que conforman el cuerpo del
trigger
Los triggers de Base de Datos son almacenados separados de otros objetos, de manera que
un trigger de Base de Datos y una tabla pueden tener el mismo nombre, sin embargo es
recomendable la utilización de nombres únicos.
Para referenciar los valores nuevos o viejos de una columna en expresiones de trigger de fila
se utilizan los prefijos:
Ejemplo
Al tratar de referenciar los valores :NEW y :OLD se deben tener en cuenta las siguientes
consideraciones:
• Los valores NEW y OLD están disponibles únicamente en los triggers de fila
• Los valores NEW y OLD están disponibles en el UPDATE
• El valor OLD en un INSERT es nulo
• El trigger de fila BEFORE puede asignar valores a :NEW si no es asignado el valor por la
cláusula UPDATE SET o lista INSERT VALUES
• Se puede usar la cláusula REFERENCING para remplazar :NEW y :OLD con otros
nombres relacionados
• Los dos puntos no son necesarios al referenciar en la cláusula WHEN
Si el trigger de Base de Datos se puede disparar sobre más de un tipo de operaciones DML,
se puede usar el predicado condicional para determinar la operación del DML que ocasiona el
disparo del trigger de Base de Datos.
Predicados Condicionales
• IF INSERT ...
• IF UPDATING ....
• IF DELETING .....
Se puede tener el mismo trigger en la Base de Datos para un DELETE, INSERT y UPDATE,
y usar el predicado condicional para determinar qué ocasionó que se disparase el trigger de Base de
Datos. Esto resulta más fácil que mantener tres triggers por separados. Esto siempre y cuando los
procedimientos no contengan cláusulas de control de operaciones, tales como COMMIT.
El siguiente ejemplo muestra la forma de crear un trigger, haciendo uso de los valores NEW,
OLD y de los predicados condicionales.
UPDATE departamento_compras
SET total_salario = total_salario + (:NEW.salario -
:OLD.salario)
WHERE departamento = :OLD.departamento;
END IF;
END;
/
Debido a que un trigger es también un objeto de Base de Datos, para borrar un trigger se
utiliza la cláusula DROP.
Sintaxis: DROP TRIGGER esquema.nombre_trigger;
Si una tabla es eliminada, los triggers definidos sobre ella también serán eliminados
PRACTICA 6
1. Elabore un trigger sobre la tabla empleado, para controlar que cuando se ejecute una
actualización de los salarios, el salario nuevo sea siempre mayor al salario actual, pero no
debe ser mayor a 1.000.000 de lo contrario arroja mensajes de error por cada caso. Y
controlar estos a través del procedimiento mensaje_error.
2. Elabore un trigger sobre la tabla empleado para controlar que cuando si inserte un nuevo
empleado, el nombre se inserte en mayúscula, y si la fecha de ingreso no es colocada
entonces se asigne la fecha actual. Adicionalmente si el nuevo empleado pertenece al
departamento de investigación u operaciones insertar los registros en las tablas
emp_investigacion y emp_operaciones.
3. Elabore un trigger sobre la tabla empleado que le permita guardar en la tabla
control_registros si ocurre un evento de actualización o eliminación. En dicha tabla debe
guardarse la fecha en que ocurrió el evento, el usuario que lo ejecuto, y si se trata de una
actualización el valor viejo del campo modificado y el valor nuevo, además del campo
clave del registro que se actualizo, es decir, el código del empleado, si lo que ocurre es una
eliminación guardar el campo clave del registro eliminado.