Sunteți pe pagina 1din 7

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

Asignatura: Base de Datos Titulacin: Ingeniera Informtica Curso: 4

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: } Libros = { ISBN: Gnero: Ttulo: Pginas: Precio: Copyright: Autor1: Autor2: Autor3: } Estadisticas = { Genero: carcter (20) Total_Libros: numrico Precio_Medio: numrico } carcter (10) (PK) carcter (20) carcter (100) numrico numrico numrico (4) numrico (FK autores) numrico (FK autores) numrico (FK autores) numrico (PK) carcter (50) carcter (50)

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

2 . Estudie el cdigo de los siguientes disparadores (ambos recogen la misma semntica codificada de dos formas diferentes). Trate de expresar con palabras cul es el resultado esperado de su ejecucin. CREATE OR REPLACE TRIGGER ActualizarEstadisticas 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; 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 en las tablas los datos propuestos a continuacin.

AUTORES
Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

ID 1 2 3 4 5 6 7 8 9 10 11 15 16 17 18 19 20

NOMBRE Marlene Rachel James Michael Michael Gaja Kirtikumar John Ian Kenny Stephan David Graham Simon Bastin Nigel Dan

APELLIDOS Thierault Charmichael Viscusi Abbey Corey Vaidyanatha Deshpande Kostelac Abramson Smith Haisley James Seibert Russell Gerald King Natchek

LIBROS
ISBN 72122048 72131454 72192798 72194618 72133791 GNERO Oracle Basics Oracle Basics Oracle Basics Oracle Basics Oracle Ebusiness Oracle Ebusiness Oracle Ebusiness TTULO Oracle8i: A Beginner''s Guide Oracle Performance Tuning 101 Oracle9i: A Beginner''s Guide Oracle Backup & Recovery 101 Oracle E-Business Suite Manufacturing & Supply Chain Management Oracle E-Business Suite Financials Handbook Oracle9i Application Server Portal Handbook PGS. 765 404 535 487 823 44.99 39.99 39.99 39.99 69.99 1999 2001 2002 2002 2002 A1 4 6 4 10 18 A2 5 7 5 11 19 20 8 9 A3

72132302 72222492

820 544

59.99 45.99

2002 2002

15 4

16 8

17 15

c) Repita la consulta de las 3 tablas y compruebe el efecto de la ejecucin del disparador d) Elimine de la tabla libros 2 de los libros del gnero Oracle Basics y consulte la tabla Estadsticas. El disparador funciona tambin cuando se borran filas?

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

Triggers Instead-Of
4 . Cree una vista con la siguiente estructura:
LIBROS
ISBN Gnero Ttulo Pginas Precio Copyright Autor1 Autor2

AUTORES
ID Nombre Apellidos

ISBN

Ttulo

Nombre

Apellidos

LIBROS_AUTORES

a) Consulte la vista que acaba de crear b) Inserte en la vista la siguiente tupla:


(72122048, Oracle8i: A Beginner''s Guide, Steve, Blow);

Qu sucede?

c) Ahora estudie el cdigo del siguiente disparador y trate de explicar cul es el efecto
de su ejecucin. -- Primero se crea una secuencia de nmeros para asegurar que no se repite el -- identificador asignado a un autor */ CREATE SEQUENCE autor_id_sequence START WITH 10000; CREATE SEQUENCE isbn_sequence START WITH 75000; CREATE OR REPLACE TRIGGER InsertLibrosAutores INSTEAD OF INSERT ON libros_autores DECLARE v_Libro libros%ROWTYPE; v_AutorID autores.id%TYPE; v_isbn libros.isbn%TYPE; BEGIN BEGIN SELECT id INTO v_AutorID FROM autores WHERE nombre = :new.nombre AND apellidos = :new.apellidos; EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO autores (id, nombre, apellidos) VALUES (autor_id_sequence.NEXTVAL, :new.nombre, :new.apellidos)

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

RETURNING ID INTO v_AutorID; END; BEGIN 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?

Orden de Ejecucin de los Triggers


En este apartado comprobar el orden de ejecucin de los triggers DML 5 . Cree los siguientes objetos CREATE SEQUENCE orden_triggers START WITH 1 INCREMENT BY 1; CREATE OR REPLACE PACKAGE PaqueteTriggers AS -- Contador global v_Contador NUMBER; END PaqueteTriggers; CREATE TABLE tabla_temp ( Numero NUMBER, Mensaje VARCHAR2(200) );

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

6 . Ahora crear 7 triggers diferentes sobre la tabla Libros para comprobar cuando se dispara cada tipo de disparador y cuando son ejecutadas las acciones que contiene. En primer lugar, un disparador que se dispara antes de cada sentencia de actualizacin lanzada sobre la tabla Libros. CREATE OR REPLACE TRIGGER AntesSentencia BEFORE UPDATE ON libros BEGIN -- Resetea el contador. PaqueteTriggers.v_Contador := 0; INSERT INTO tabla_temp (numero, mensaje) VALUES (orden_triggers.NEXTVAL, 'Antes de la Sentencia (befote): contador = ' || PaqueteTriggers.v_Contador); -- Y lo incrementa para cuando se lance el siguiente trigger. PaqueteTriggers.v_Contador := PaqueteTriggers.v_Contador + 1; END AntesSentencia; / A continuacin un disparador que se lanza despus de cada sentencia de actualizacin lanzada sobre la tabla Libros CREATE OR REPLACE TRIGGER DespuesSentencia1 AFTER UPDATE ON libros BEGIN INSERT INTO tabla_temp (numero, mensaje) VALUES (orden_triggers.NEXTVAL, 'Despues Sentencia 1: contador = ' || PaqueteTriggers.v_Contador); -- Actualiza el valor del contador. PaqueteTriggers.v_Contador := PaqueteTriggers.v_Contador + 1; END DespuesSentencia1; / 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; /
Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC (BD - 4 Ing. Inf.)

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.

Grupo de Investigacin Kybele

S-ar putea să vă placă și