Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TySQL PLSQL
TySQL PLSQL
Triggers
Un trigger (disparador) define una accin que la base de
datos siempre debera realizar cuando ocurre algn tipo
de acontecimiento que la afecta.
Se utilizan para
z
z
z
Carmen Hernndez
Triggers y PL/SQL
Triggers
z
z
z
z
z
declarativa
ejecutable
manejo de excepciones
Carmen Hernndez
Triggers y PL/SQL
Triggers: Sintaxis
create or replace trigger NombreTrigger
{before | after | instead of}
{delete | insert | update [of NombreColumna
[, NombreColumna] ...] }
[or {delete | insert | update [of NombreColumna
[, NombreColumna] ...] } ] ...
on {NombreTabla | Nombre-Vista}
[ [referencing { old [as] NombreViejo | new [as]
NombreNuevo} ...]
for each {row | statement} [when (Condicin)] ]
Bloque pl/sql
Carmen Hernndez
Triggers y PL/SQL
Triggers: Sintaxis
z
Eliminacin
DROP TRIGGER nombre_disparador;
Activacin/Desactivacin
ALTER TRIGGER nombre_disparador {DISABLE |
ENABLE};
ALTER TABLE nombre_tabla
{ENABLE | DISABLE} ALL TRIGGERS;
Carmen Hernndez
Triggers y PL/SQL
Nombre disparador:
z
Replace:
z
Before/After/Instead of:
z
Evento:
z
Carmen Hernndez
Triggers y PL/SQL
Nivel:
z
z
Carmen Hernndez
Triggers y PL/SQL
Carmen Hernndez
Triggers y PL/SQL
Carmen Hernndez
Suceso
:old
:new
INSERT
NULL
Nuevos valores
UPDATE
Valores almacenados
Nuevos valores
DELETE
Valores almacenados
NULL
Triggers y PL/SQL
Con este trigger se ignoran los valores que un usuario pudiera introducir
como cdigo de estudiante y se inserta el siguiente valor de la secuencia.
Carmen Hernndez
Triggers y PL/SQL
10
Carmen Hernndez
Triggers y PL/SQL
11
PL/SQL
Introduccin (I)
z
Permite:
z
z
z
z
z
CLIENTE == cliente
Carmen Hernndez
Triggers y PL/SQL
13
Bloques
z
z
DECLARE
/* Declaraciones de uso local:
variables, cursores, y excepciones de Usuario */
BEGIN
/* Proceso: conjunto de sentencias ejecutables */
EXCEPTION
/* Excepciones: zona de control de errores */
END;
Carmen Hernndez
Triggers y PL/SQL
14
Tipos de expresiones:
z Aritmticas : + - * /
z Comparaciones : = != > > >= <=
z Concatenacin de caracteres
Tipos de variables:
z
Carmen Hernndez
Registros
Tablas y matrices. Pueden almacenar registros y escalares
Triggers y PL/SQL
15
Declaracin
<nom_variable> <tipo> [CONSTANT][NOT NULL] [:=VALOR];
z
z
z
Carmen Hernndez
Triggers y PL/SQL
16
NUMBER (8,0);
Nombre
VARCHAR (30);
Factor
CONSTANT
DNI2
DNI%TYPE;
Rcliente
cliente%ROWTYPE;
NUMBER(3,2):=0.10;
IVA
Carmen Hernndez
Triggers y PL/SQL
17
Estructuras De Control
z
z
IF (condicionales):
Ejecuta una o varias sentencias dependiendo de una condicin:
IF <condicin>
THEN <sentencias ejecutables>;
[ELSIF <condicin>
THEN <sentencias_ejecutable>]
[ELSE <sentencias_ejecutable>];
END IF;
Carmen Hernndez
Triggers y PL/SQL
18
z
z
Carmen Hernndez
Triggers y PL/SQL
19
Estructuras De Control
z
Tipos:
z
z
z
Carmen Hernndez
Triggers y PL/SQL
20
Carmen Hernndez
Triggers y PL/SQL
21
sentencias; ...
END LOOP;
z
Ejemplo:
DECLARE
v_contador NUMBER :=1;
BEGIN
WHILE v_contador <= 50 LOOP
INSERT INTO estudiante
VALUES (v_contador);
v_contador:=v_contador+1;
END LOOP;
END;
Carmen Hernndez
Triggers y PL/SQL
22
ndice: variable de control empieza tomando el valor exp_n1 y termina en exp_n2, en pasos de 1.
Su declaracin es implcita
z
z
los extremos del intervalo (exp_n1 y exp_n2) pueden ser valores constantes o exp. numricas
REVERSE: el recorrido se hace al revs
Ejemplo: BEGIN
FOR v_contador IN 1..50 LOOP
INSERT INTO estudiante
VALUES (v_contador);
END LOOP;
END;
Carmen Hernndez
Triggers y PL/SQL
23
Se ejecutan una vez por cada fila que se recupera del cursor.
z
Pasos:
z se abre el cursor
z se realiza la lectura sobre un nombre de registro, y despus se
ejecutan las sentencias del bucle; hasta que no hay mas filas.
z Se cierra el cursor
[nombre_bucle] FOR nombre_reg IN nombre_cursor
LOOP sentencias
END LOOP;
Carmen Hernndez
Triggers y PL/SQL
24
Cursores en PL/SQL
z
z
z
z
z
z
Carmen Hernndez
Triggers y PL/SQL
25
Carmen Hernndez
Triggers y PL/SQL
26
END IF;
END LOOP;
IF cursor_salario%ISOPEN THEN
CLOSE cursor_salario;
Carmen Hernndez
Triggers y PL/SQL
27
IF cursor_salario%ISOPEN THEN
CLOSE cursor_salario;
END;
Carmen Hernndez
Triggers y PL/SQL
28
Ejemplo:
BEGIN
FOR registro IN (SELECT DNI, nombre FROM cliente)
LOOP
INSERT into tabla_temporal
VALUES (registro.DNI, registro.nombre);
END LOOP;
END;
Carmen Hernndez
Triggers y PL/SQL
29
Ejemplo de Procedimiento
z
Ejemplo: Aumentar en un 10% el salario de aquellos empleados cuyo salario est por debajo de la media.
Recalcular la media e imprimirla si es mayor que 50.000.
Triggers y PL/SQL
30
Excepciones
z
Declaracin de excepciones:
z Se declaran por el usuario
z
Ejemplo:
DECLARE
. . .
User_exception
Carmen Hernndez
EXCEPTION;
Triggers y PL/SQL
31
Pueden ser
z
z
Carmen Hernndez
32
Carmen Hernndez
Triggers y PL/SQL
33
Tipos de Excepciones
z
Carmen Hernndez
Triggers y PL/SQL
34
Algunas Excepciones
Predefinidas
CURSOR_ALREADY_OPEN
Cursor ya abierto
DUP_VAL_ON_INDEX
INVALID_CURSOR
Cursor no vlido
INVALID_NUMBER
Nmero no vlido
LOGIN_DENIED
NO_DATA_FOUND
NOT_LOGGED_ON
No conectado a Oracle
PROGRAM_ERROR
Problema interna
STORAGE_ERROR
TIMEOUT_ON_RESOURCE
TOO_MANY_ROWS
VALUE_ERROR
Valor incorrecto
ZERO_DIVIDE
Divisin por 0
OTHERS
Carmen Hernndez
Triggers y PL/SQL
35
Excepciones. Gestin de
OTHERS
Se ejecuta para todas las excepciones generadas.
z
z
z
Carmen Hernndez
Triggers y PL/SQL
36
Excepciones
z
Carmen Hernndez
Triggers y PL/SQL
37
Tratamiento De Errores
z
RAISE_APLICATION_ERROR:
Se puede usar para obtener mensajes de error personalizados
RAISE_APPLICATION_ERROR(numero_error, mensaje_error);
donde:
numero_error: es un parmetro comprendido entre -20000 y -20999
mensaje_error: es el texto asociado al mensaje (menor de 512 cars.)
Carmen Hernndez
Triggers y PL/SQL
38
Tablas Mutantes
Qu son
z
Carmen Hernndez
Triggers y PL/SQL
40
Carmen Hernndez
Triggers y PL/SQL
41
Siempre que la insercin que provoque la activacin del disparador sea una
insercin simple (se inserte una nica fila).
2
Siempre que el disparador no se active como consecuencia de un borrado en
cascada. En ese caso, aparecer tambin un error de tabla mutante.
Carmen Hernndez
Triggers y PL/SQL
42
Ejemplo 1
z
Carmen Hernndez
Triggers y PL/SQL
43
Ejemplo 1 (1)
z
EJEMPLO 1:
CREATE OR REPLACE TRIGGER Disparador1
AFTER INSERT ON Zona FOR EACH ROW
BEGIN
INSERT INTO Departamento VALUES
(Secuencia_Departamento.NEXTVAL, 10000000, :new.Cod_Zona);
END Disparador1;
/
Operacin:
INSERT INTO Zona VALUES (1, CENTRO);
Carmen Hernndez
Triggers y PL/SQL
44
Ejemplo 1 (2)
z
EJEMPLO 1. Comentarios:
z
Carmen Hernndez
Triggers y PL/SQL
45
Ejemplo 2 (1)
z
EJEMPLO 2:
CREATE OR REPLACE TRIGGER Disparador2
AFTER INSERT ON Departamento FOR EACH ROW
DECLARE
Var Departamento%ROWTYPE;
BEGIN
UPDATE Zona SET Nom_Zona='U' WHERE Cod_Zona=:new.Cod_Zona;
END Disparador2;
/
Operacin:
INSERT INTO Departamento VALUES
(Secuencia_Departamento.NEXTVAL, 20000000, 1);
Carmen Hernndez
Triggers y PL/SQL
46
Ejemplo 2 (2)
z
EJEMPLO 2. Comentario:
z
Carmen Hernndez
Triggers y PL/SQL
47
Ejemplo 3 (1)
z
EJEMPLO 3:
z Creacin de una tabla independiente a las anteriores:
CREATE SEQUENCE Secuencia_Mensaje
START WITH 100000
INCREMENT BY 1;
CREATE TABLE Mensaje_Departamento (
Cod_Mensaje NUMBER(6) CONSTRAINT pk_error PRIMARY KEY,
Cod_Dep NUMBER(6) NOT NULL,
Tipo VARCHAR2(255) NOT NULL,
Fecha DATE NOT NULL
);
Carmen Hernndez
Triggers y PL/SQL
48
Ejemplo 3 (2)
z
EJEMPLO 3. Disparador:
CREATE OR REPLACE TRIGGER Disparador3
AFTER INSERT ON Departamento
FOR EACH ROW
BEGIN
INSERT INTO Mensaje_Departamento VALUES
(Secuencia_Mensaje.NEXTVAL, :new.Departamento, 'Presupuesto
elevado', SYSDATE);
END Disparador3;
/
Operacin:
INSERT
INTO
Departamento
(Secuencia_Departamento.NEXTVAL, 70000, 1);
Carmen Hernndez
Triggers y PL/SQL
VALUES
49
Ejemplo 3 (3)
z
EJEMPLO 3. Comentarios:
z
Carmen Hernndez
Triggers y PL/SQL
50
Ejemplo 4 (1)
z
EJEMPLO 4:
CREATE OR REPLACE TRIGGER Disparador4
BEFORE DELETE ON Departamento FOR EACH ROW
DECLARE
Var Zona%ROWTYPE;
BEGIN
SELECT
*
INTO
Var
FROM
Zona
WHERE
Cod_Zona=:old.Cod_Zona;
END Disparador4;
/
Operacin1: DELETE FROM Departamento WHERE Cod_Zona=1;
Operacin2: DELETE FROM Zona WHERE Cod_Zona=1;
Carmen Hernndez
Triggers y PL/SQL
51
Ejemplo 4 (2)
z
EJEMPLO 4. Comentarios:
z
Carmen Hernndez
Triggers y PL/SQL
52
Ejemplo 5 (1)
z
EJEMPLO 5:
CREATE OR REPLACE TRIGGER Disparador5
AFTER DELETE ON Departamento
DECLARE
Var Zona%ROWTYPE;
BEGIN
SELECT * INTO Var FROM Zona WHERE Cod_Zona=1;
END Disparador5;
/
Operacin 1: DELETE FROM Zona WHERE Cod_Zona = 1;
Operacin 2: DELETE FROM Departamento WHERE Cod_Zona = 1;
Carmen Hernndez
Triggers y PL/SQL
53
Ejemplo 5 (2)
z
EJEMPLO 5. Comentarios:
z
Carmen Hernndez
Triggers y PL/SQL
54