Está en la página 1de 7

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

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:
}

numrico (PK)
carcter (50)
carcter (50)

Libros = {
ISBN:
Gnero:
Ttulo:
Pginas:
Precio:
Copyright:
Autor1:
Autor2:
Autor3:
}

carcter (10) (PK)


carcter (20)
carcter (100)
numrico
numrico
numrico (4)
numrico (FK autores)
numrico (FK autores)
numrico (FK autores)

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

2 . Estudie el cdigo del siguiente disparador.


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

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

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

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)


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

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

URJC Diciembre 2005

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

Oracle8i: A Beginner''s Guide

765

44.99

1999

Oracle Performance Tuning


101
Oracle9i: A Beginner''s Guide

404

39.99

2001

535

39.99

2002

Oracle Backup & Recovery


101
Oracle E-Business Suite
Manufacturing & Supply
Chain Management
Oracle E-Business Suite
Financials Handbook
Oracle9i Application Server
Portal Handbook

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

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?

Triggers Instead-Of
4 . Cree una vista con la siguiente estructura:

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

LIBROS
ISBN

AUTORES
Gnero

Ttulo

Pginas

Precio

ISBN

Copyright

Autor1

Ttulo

Autor2

Nombre

ID

Nombre

Apellidos

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

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

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;

Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

CREATE OR REPLACE PACKAGE PaqueteTriggers AS


-- Contador global
v_Contador NUMBER;
END PaqueteTriggers;
CREATE TABLE tabla_temp (
Numero
NUMBER,
Mensaje
VARCHAR2(200)
);
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;
/
show errors
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;
/
Grupo de Investigacin Kybele

Disparadores en Oracle (Ejemplos Prcticos)

URJC Diciembre 2005

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.

Grupo de Investigacin Kybele

También podría gustarte