Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplos Triggers
Ejemplos Triggers
Disparadores en Oracle
(Ejemplos Prcticos)
Nota: Recuerde guardar los scripts, utilice para ello un editor de texto.
Triggers DML
1 . Cree las siguientes tablas con la siguiente estructura:
Autores = {
ID:
Nombre:
Apellidos:
}
numrico (PK)
carcter (50)
carcter (50)
Libros = {
ISBN:
Gnero:
Ttulo:
Pginas:
Precio:
Copyright:
Autor1:
Autor2:
Autor3:
}
Estadisticas = {
Genero:
carcter (20)
Total_Libros: numrico
Precio_Medio: numrico
}
GROUP BY genero;
v_genero estadisticas.genero%TYPE;
v_total_libros estadisticas.total_libros%TYPE;
v_precio_medio estadisticas.precio_medio%TYPE;
BEGIN
DELETE FROM estadisticas;
OPEN c_Estadisticas;
LOOP
FETCH c_Estadisticas INTO v_genero, v_total_libros, v_precio_medio;
EXIT WHEN c_Estadisticas%NOTFOUND;
INSERT INTO estadisticas (genero, total_libros, precio_medio)
VALUES (v_genero, v_total_libros, v_precio_medio);
END LOOP;
CLOSE c_Estadisticas;
END ActualizarEstadisticas;
/
CREATE OR REPLACE TRIGGER ActualizarEstadisticas_FOR
AFTER INSERT OR DELETE OR UPDATE ON libros
DECLARE
CURSOR c_Estadisticas IS
SELECT genero,
COUNT(*) total_libros,
AVG(precio) precio_medio
FROM libros
GROUP BY genero;
BEGIN
DELETE FROM estadisticas;
FOR v_RegistroEstadisticas in c_Estadisticas LOOP
INSERT INTO estadisticas (genero, total_libros, precio_medio)
VALUES (v_RegistroEstadisticas.genero, v_RegistroEstadisticas.total_libros,
v_RegistroEstadisticas.precio_medio);
END LOOP;
END ActualizarEstadisticas_FOR;
/
3 . Para comprobar el funcionamiento del disparador:
a) Consulte la totalidad de las 3 tablas creadas
b) Inserte los datos de varios autores y a continuacin utilice los datos de
dichos autores para insertar datos en la tabla Libros.
AUTORES
ID
NOMBRE
APELLIDOS
1
2
Marlene
Rachel
Thierault
Charmichael
James
Michael
Michael
Gaja
Kirtikumar
John
Ian
Kenny
Stephan
David
Graham
Simon
Bastin
Nigel
Dan
Viscusi
Abbey
Corey
Vaidyanatha
Deshpande
Kostelac
Abramson
Smith
Haisley
James
Seibert
Russell
Gerald
King
Natchek
LIBROS
ISBN
GNERO
TTULO
PGS.
A1
A2
72122048
Oracle
Basics
Oracle
Basics
Oracle
Basics
Oracle
Basics
Oracle
Ebusiness
765
44.99
1999
404
39.99
2001
535
39.99
2002
487
39.99
2002
10
11
823
69.99
2002
18
19
20
820
59.99
2002
15
16
17
544
45.99
2002
15
72131454
72192798
72194618
72133791
72132302
72222492
Oracle
Ebusiness
Oracle
Ebusiness
A3
Triggers Instead-Of
4 . Cree una vista con la siguiente estructura:
LIBROS
ISBN
AUTORES
Gnero
Ttulo
Pginas
Precio
ISBN
Copyright
Autor1
Ttulo
Autor2
Nombre
ID
Nombre
Apellidos
Apellidos
LIBROS_AUTORES
SELECT *
INTO v_Libro
FROM libros
WHERE isbn = :new.isbn;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO libros (isbn, titulo)
VALUES (isbn_sequence.NEXTVAL, :new.titulo)
RETURNING isbn INTO v_isbn;
SELECT *
INTO v_Libro
FROM libros
WHERE isbn = v_isbn;
END;
IF v_Libro.autor1 IS NULL THEN
UPDATE libros
SET autor1 = v_AutorID
WHERE isbn = v_isbn;
ELSIF v_libro.autor2 IS NULL THEN
UPDATE libros
SET autor2 = v_AutorID
WHERE isbn = v_isbn;
ELSIF v_libro.autor3 IS NULL THEN
UPDATE libros
SET autor3 = v_AutorID
WHERE isbn = v_isbn;
ELSE
RAISE_APPLICATION_ERROR(-2005, v_libro.titulo || ' ya tiene 2 autores');
END IF;
END InsertLibrosAutores;
/
d) Repita la insercin del apartado b)
Qu sucede ahora?
show errors
Un disparador igual al anterior pero cambiando el nombre para poder identificar el
efecto de su ejecucin
CREATE OR REPLACE TRIGGER DespuesSentencia2
AFTER UPDATE ON libros
BEGIN
INSERT INTO tabla_temp (numero, mensaje)
VALUES (orden_triggers.NEXTVAL,
'Despues Sentencia 2: contador = ' || PaqueteTriggers.v_Contador);
-- Actualiza el valor del contador.
PaqueteTriggers.v_Contador := PaqueteTriggers.v_Contador + 1;
END DespuesSentencia2;
/
show errors
Siguiendo la misma estructura que los anteriores, cree tres disparadores que se
ejecuten antes de la sentencia y a nivel de fila: AntesFila1, AntesFila2 y AntesFila3
y cuide de que cada uno muestre los mensajes correspondientes:
(
BEFORE UDPATE ON Libros
FOR EACH ROW
)
Finalmente, cree un disparador que se ejecute despus de cada sentencia a nivel
de fila: DespuesFila
7 . Ahora lance una sentencia de actualizacin sobre la tabla Libros de forma que
todos los libros del gnero Oracle Ebusiness pasen a ser del gnero Nuevo
Genero
8 . Consulte la totalidad de la tabla tabla_temp y a partir de los datos que
contiene, deduzca cul es el orden de ejecucin de los disparadores.