Disparadores en Oracle (Ejemplos Prácticos)

Documentos relacionados
Tema 1. Bases de datos activas

Disparadores en ORACLE

Un ejemplo teórico de trigger podría ser éste:

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

El Lenguaje PL/SQL. Un lenguaje de propósito general orientado a la inclusión de sentencias SQL. Estructura del código PL/SQL.

Diseño de bases de datos

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

Bibliografía Oracle Database Concepts - 10g Release 2 (10.2) (Octubre 2005)

PRÁCTICA III. DISPARADORES EN SQL (II)

Formato para prácticas de laboratorio

Programación SQL. Lucio Salgado Diciembre 2008

Otros objetos de Base de Datos

Oracle básico (IV): Programación en PL/SQL

Permite definir cada relación que pertenece a la base de datos relacional, incluyendo:

E16 - Diseño de Sistemas de Bases de Datos Boletín 3

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Triggers. BASES DE DATOS Mercedes García Merayo

Laboratorio Informix. Stored Procedures Triggers

Estándares para la construcción de Sentencias SQL

Laboratorios de BASES DE DATOS. (I.T. Informática)

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

DISPARADORES EN SQL DISPARADORES EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999

OBJETIVOS METODOLOGÍA PROCEDIMIENTO 1.- Trabajo con el servidor de bases de datos Sybase

Los disparadores pueden ser utilizados para cumplir con alguna de las siguientes tareas:

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

GUIA DE LABORATORIO N 9 B. (000Webhost Php- Para desarrollar en casa)

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

EXAMEN: BASES DE DATOS 4º Ingeniería Informática (29 de enero de 2009)

Formato para prácticas de laboratorio

Administración Básica de Oracle9i.

RESTRICCIONES DE DOMINIOS

Procesamiento y Optimización de consultas Material Preliminar en preparación

Enlaces relacionados:

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS LABORATORIO DE BASES DE DATOS 1

Programando con PL/SQL en una Base de Datos Oracle

Bases de Datos / Elementos de Bases de Datos Que es un Stored Procedure? Stored Procedures: Ventajas

MANUALITO MS-SQL SERVER

APUNTES: APLICACIONES WEB BASADAS EN PHP Y MYSQL Página 1 de 5

Tutorial Oracle SQL Developer 1.2.1

- Bases de Datos - - Diseño Físico - Luis D. García

Administración Básica de Oracle 10g. Prácticas sobre trabajos.

LENGUAJE ESTRUCTURADO DE CONSULTAS SQL (2)

CONSULTAS BASICAS EN SQL SERVER

SQL. (...la guía básica de supervivencia de dmi) Universidad de los Andes Demián Gutierrez Enero

INST Estándar Codificación SQL y PL-SQL

El usuario puede utilizar esta tabla derivada como una tabla más, en sus consultas.

Restricciones de Integridad

Tema 1. Bases de datos activas

6. PROGRAMACIÓN CON TRANSACT-SQL

PRÁCTICA T2. El lenguaje procedural PL/SQL de Oracle

Tema: Procedimientos almacenados y cursores. Facultad : Ingeniería Escuela : Computación Asignatura: SQL SERVER. GUÍA 2 Pág. 1

Índice. iii. Objetivos... 24

Tema: Disparadores Parte I.

Curso SQL Nivel Avanzado 1. Miguel Jurado García

Triggers 24/12/2016. Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers en Oracle

6 - Recuperar algunos registros (where)

4- Uso de sentencias para el envió y extracción de datos

PL/SQL avanzado: Secuencias, triggers, cursores y subprogramas

DESCRIPCIÓN ESPECÍFICA NÚCLEO: Núcleo Sector Comercio y Servicios.

Nociones de performance

Haga clic para PostgreS cambiar el estilo

A. Introducción. B. Los DATABASES TRIGGERS. PL/SQL en objetos de la base de datos. Oracle 11g - SQL, PL/SQL, SQL*Plus 271

PL/SQL. DECLARE /* Parte Declarativa */ BEGIN /* Parte de Ejecución */ EXCEPTION /* Parte de Excepciones */ END;

Disparadores en ORACLE. Disparadores Tema 11

TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL

El lenguaje de manipulación de datos (DML) es una parte fundamental de SQL.

Base de Datos Oracle 10g: Introducción a SQL Código: D Duración: 5 días (40 horas)

BASES DE DATOS EN VISUAL BASIC ACCESS + SQL

Estándar de desarrollo de aplicaciones del Govern de les Illes Balears

CURSORES EN SQL SERVER

T12 Vistas y tablas temporales

Oracle 12c DISEÑO Y PROGRAMACIÓN

Bases de datos relacionales y el modelo entidad-relación

Práctica 5: Oracle XML DB

UNIDAD DE TRABAJO 3: PROGRAMACIÓN DE BASES DE DATOS TEMA 8: INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN

Sub consultas avanzadas

Repaso de Conceptos Básicos de Bases de Datos

A.1. Definiciones de datos en SQL

El Lenguaje SQL TEMA V. Grupo de Bas ses de Datos Avanzadas Univ. Carlo os III de Madrid. V.1 SQL como Lenguaje de Definición de Datos

Referencia SQL en la versión de HUGOSQL White Paper por: HUGOSQL 2012

DR/UC. DR/UC FACTURA(CIF, N_Factura, Fecha, Total) ASIGNATURA(Cod_Asignatura, Titulación, Nombre_Asig, Curso, Empresa_fotocopias, precio_fotocopia)

Formatos para prácticas de laboratorio

Tema: PROCEDIMIENTOS ALMACENADOS.

Trabajos de Ampliación. Bases de datos NoSQL.

Consultas con combinaciones

PL/PGSQL. Extensión "procedural" de SQL

ADMINISTRACIÓN DE BASE DE DATOS

Diseño de bases de datos

Dependiendo de las tareas, podemos clasificar las sentencias SQL en dos tipos:

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

Para ver una copia completa de la licencia, acudir a la dirección

Bases de Datos / Elementos de Bases de Datos 2015

Transcripción:

Asignatura: Base de Datos Titulación: Ingeniería Informática Curso: 4º Disparadores en Oracle (Ejemplos Prácticos) 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: numérico (PK) Nombre: carácter (50) Apellidos: carácter (50) } Libros = { ISBN: carácter (10) (PK) Género: carácter (20) Título: carácter (100) Páginas: numérico Precio: numérico Copyright: numérico (4) Autor1: numérico (FK autores) Autor2: numérico (FK autores) Autor3: numérico (FK autores) } Estadisticas = { Genero: carácter (20) Total_Libros: numérico Precio_Medio: numérico } 2. Estudie el código del siguiente disparador. Trate de expresar con palabras cuál es el resultado esperado de su ejecución. 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

GROUP BY genero; v_genero estadisticas.genero%type; v_total_libros estadisticas.total_libros%type; v_precio_medio estadisticas.precio_medio%type; 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 GROUP BY genero; 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 continuación utilice los datos de dichos autores para insertar datos en la tabla Libros. AUTORES ID NOMBRE APELLIDOS 1 Marlene Thierault 2 Rachel Charmichael

3 James Viscusi 4 Michael Abbey 5 Michael Corey 6 Gaja Vaidyanatha 7 Kirtikumar Deshpande 8 John Kostelac 9 Ian Abramson 10 Kenny Smith 11 Stephan Haisley 15 David James 16 Graham Seibert 17 Simon Russell 18 Bastin Gerald 19 Nigel King 20 Dan Natchek LIBROS ISBN GÉNERO TÍTULO PÁGS. A1 A2 A3 72122048 Oracle Oracle8i: A Beginner''s Guide 765 44.99 1999 4 5 Basics 72131454 Oracle Oracle Performance Tuning 404 39.99 2001 6 7 8 Basics 101 72192798 Oracle Oracle9i: A Beginner''s Guide 535 39.99 2002 4 5 9 Basics 72194618 Oracle Oracle Backup & Recovery 487 39.99 2002 10 11 Basics 72133791 Oracle Ebusiness 72132302 Oracle Ebusiness 72222492 Oracle Ebusiness 101 Oracle E-Business Suite Manufacturing & Supply Chain Management Oracle E-Business Suite Financials Handbook Oracle9i Application Server Portal Handbook 823 69.99 2002 18 19 20 820 59.99 2002 15 16 17 544 45.99 2002 4 8 15 c) Repita la consulta de las 3 tablas y compruebe el efecto de la ejecución del disparador d) Elimine de la tabla libros 2 de los libros del género Oracle Basics y consulte la tabla Estadísticas. El disparador funciona también cuando se borran filas? Triggers Instead-Of 4. Cree una vista con la siguiente estructura:

LIBROS AUTORES ISBN Género Título Páginas Precio Copyright Autor1 Autor2 ID Nombre Apellidos ISBN Título 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 código del siguiente disparador y trate de explicar cuál es el efecto de su ejecución. * Primero se crea una secuencia de números 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; 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;

SELECT * INTO v_libro 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 END; IF v_libro.autor1 IS NULL THEN UPDATE libros SET autor1 = v_autorid ELSIF v_libro.autor2 IS NULL THEN UPDATE libros SET autor2 = v_autorid ELSIF v_libro.autor3 IS NULL THEN UPDATE libros SET autor3 = v_autorid ELSE RAISE_APPLICATION_ERROR(-2005, v_libro.titulo ' ya tiene 2 autores'); END IF; END InsertLibrosAutores; d) Repita la inserción del apartado b) Qué sucede ahora? Orden de Ejecución de los Triggers En este apartado comprobará el orden de ejecución 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) ); 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 actualización lanzada sobre la tabla Libros. CREATE OR REPLACE TRIGGER AntesSentencia BEFORE UPDATE ON libros -- 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 continuación un disparador que se lanza después de cada sentencia de actualización lanzada sobre la tabla Libros CREATE OR REPLACE TRIGGER DespuesSentencia1 AFTER UPDATE ON libros 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;

show errors Un disparador igual al anterior pero cambiando el nombre para poder identificar el efecto de su ejecución CREATE OR REPLACE TRIGGER DespuesSentencia2 AFTER UPDATE ON libros 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 después de cada sentencia a nivel de fila: DespuesFila 7. Ahora lance una sentencia de actualización sobre la tabla Libros de forma que todos los libros del género Oracle Ebusiness pasen a ser del género Nuevo Genero 8. Consulte la totalidad de la tabla tabla_temp y a partir de los datos que contiene, deduzca cuál es el orden de ejecución de los disparadores.