You are on page 1of 4

Asignatura: Base de Datos Nota: Guardar todos los scripts. 1.

Crear las siguientes tablas:


Autores = { ID: numrico(4) (PK) Nombre: carcter (50) Apellidos: carcter (50) }

Disparadores en Oracle

Libros = {

ISBN: carcter (10) (PK) Gnero: carcter (20) Ttulo: carcter (100) Pginas: numrico Precio: numrico Copyright: numrico (4) Autor1: numrico (FK autores) Autor2: numrico (FK autores) Autor3: numrico (FK autores) }

Estadisticas = { Genero: carcter (20) Total_Libros: numrico Precio_Medio: numrico }

2. Estudia el cdigo de los siguientes triggers y explica cual es el resultado esperado en su ejecucin y comprueba si contiene errores.

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;

Otro formato de trigger: 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. Comprobar el funcionamiento de los disparadores, para ello primero insertar los siguientes datos en las tres tablas, haciendo uso de programas PL/SQL que nos permita insertar los datos:

AUTORES
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 72132302 72222492 GNERO TTULO Oracle Basics Oracle8i: A Beginner''s Guide Oracle Basics Oracle Performance Tuning 101 Oracle Basics Oracle9i: A Beginner''s Guide Oracle Basics Oracle Backup & Recovery 101 Oracle Ebusiness Oracle E-Business Manufacturing Oracle Ebusiness Oracle E-Business Suite Financials Oracle Ebusiness Oracle9i Application ServerPortal PGS. 765 404 535 487 823 820 544 44.99 39.99 39.99 39.99 69.99 59.99 45.99 1999 2001 2002 2002 2002 2002 2002 A1 4 6 4 10 18 15 4 A2 5 7 5 11 19 16 8 A3 8 9 20 17 15

4. Crea una consulta para cada una de las tablas y comprueba el efecto de la ejecucin del disparador. Elimina de la tabla libros 2 de ellos y consulta la tabla Estadsticas. El disparador funciona cuando se borran filas?

Triggers Instead-Of 5. Crea una vista con los campos de ISBN y Titulo de la tabla Libros, ms los campos Autores y Apellidos de la tabla Autores, llama a esta vista con el nombre LIBRO_AUTORES. 6. Consulta la vista que acabas de crear e inserta en la vista la siguiente tupla: (72122048, Oracle8i: A Beginners Guide, Steve, Blow); Qu sucede? 7. Explica cual es el efecto de la ejecucin del siguiente trigger:
/* 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) 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;
8. Repite la insercin a la vista, establecido en el punto 6. Qu sucede ahora?

Orden de Ejecucin de los triggers. 9. Crea los siguientes objetos:

CREATE SEQUENCE orden_triggers START WITH 1 INCREMENT BY 1; CREATE OR REPLACE PACKAGE PaqueteTriggers AS v_Contador NUMBER; END PaqueteTriggers; CREATE TABLE tabla_temp ( Numero NUMBER, Mensaje VARCHAR2(200) );
10. Crea 7 triggers diferentes sobre la tabla Libros para comprobar cuando se dispara cada tipo de disparador y cuando son ejecutadas las acciones que contiene. Primer Trigger, 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 PaqueteTriggers.v_Contador := 0; INSERT INTO tabla_temp (numero, mensaje) VALUES (orden_triggers.NEXTVAL, 'Antes de la Sentencia (before): contador = ' || PaqueteTriggers.v_Contador); PaqueteTriggers.v_Contador := PaqueteTriggers.v_Contador + 1; END AntesSentencia;
Crea el Segundo Trigger, un disparador que se lanza despus de cada sentencia de actualizacin lanzada sobre la tabla Libros Crea un tercer Trigger, Igual que el anterior pero cambiando el nombre para poder identificar el efecto de su ejecucin Siguiendo la estructura de los anteriores, crea tres disparadores ms que se ejecuten antes de la sentencia y a nivel de fila: AntesFila1, AntesFila2 y AntesFila3. Crear los trigger con la opcin: BEFORE UPDATE ON LIBROS FOR EACH ROW Crea el ultimo trigger llamado DespuesFila, que se ejecute despus de cada sentencia a nivel de fila. 11. Lanza una sentencia de actualizacin sobre la tabla Libros de forma que todos los libros del gnero Oracle Ebusiness pase a ser del gnero Nuevo Genero.

You might also like