PL/SQL Francisco Moreno Universidad Nacional.

Slides:



Advertisements
Presentaciones similares
SQL Sigla del nombre “Structured Query Language”.
Advertisements

Ejercicios Solemne 2 Parte 1
LENGUAJE ESTRUCTURADO DE CONSULTA “SQL”
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Introducción a PL/SQL Conceptos básicos.
Fernando Velasco
Unidad 3 Lenguaje de manipulación de datos(DML).
Maestría en Bioinformática Bases de Datos y Sistemas de Información SQL: DML Ing. Alfonso Vicente, PMP
Maestría en Bioinformática Bases de Datos y Sistemas de Información Otros objetos de Base de Datos Ing. Alfonso Vicente, PMP
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle
Características Objeto Relacionales en Oracle
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle
Diseño Físico Procedimientos Almacenados y Disparadores (Triggers)
PL/SQL Francisco Moreno Universidad Nacional.
MySQL M.C. Pedro Bello López.
1 BD Activas: Motivación zLos SGBD convencionales son “pasivos”. Sólo ejecutan preguntas o transacciones realizadas por los usuarios o por los programas.
PL/SQL Francisco Moreno Universidad Nacional. Introducción al PL/SQL ¿Por qué PL/SQL? A pesar de que SQL tiene mecanismos de control condicional (cláusula.
Bases de Datos Relacionales
16/04/ Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla.
Universidad del Cauca – FIET – Departamento de Sistemas
PL/SQL Francisco Moreno Universidad Nacional.
Subconsultas Avanzadas
Ing. Ricardo Carlos Inquilla Quispe
Procedimientos Almacenados Funciones Agregadas
Componentes sintácticos
Integridad Referencial 1. Integridad referencial 2.
UNITA - IBARRA TRIGGERS
Lenguaje Estructurado de Consultas
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
Laboratorio de Bases de datos
PL/SQL Francisco Moreno Universidad Nacional.
TRIGGERS EN ORACLE 8 J. Iriarte S. España
SQL: DDL Francisco Moreno & Carlos Mario Zapata. SQL:DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la Base de Datos Tipos de Objetos:
SQL (Structured Query Language / Lenguaje de consulta estructurado)‏
Mayo de 2009Dos Ideas - La visión de Sistemas desde el Desarrollo Manipulación de Datos Conceptos básicos.
Triggers(Disparadores)
Características Objeto-Relacionales en Oracle Francisco Moreno Universidad Nacional.
LENGUAJE SQL.
Structured Query Language (Lenguaje Estructurado de Consultas)
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
SQL: DDL Francisco Moreno. SQL: DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la BD Tipos de objetos: - Tablas: corresponden a las.
Expresiones algebraicas equivalentes
SQL Sigla del nombre “Structured Query Language”.
Prof. De Bases de Datos: Lcdo. Luis Peña. El lenguaje más habitual para construir las consultas a bases de datos relacionales es SQL, Structured Query.
Diseña y administra base de datos avanzadas
Base de datos Francisco Castro. Creación de una tabla drop table TABLA cascade constraints; /*==============================================================*/
PUESTO-TRABAJO (Código-Puesto, Empresa, Sueldo, DNI- Contratado) TITULADO (DNI-Titulado, Nombre, Apellidos, Dirección) TITULACION (Iden-Titulación, Nombre,
Comandos de SQL Prog. Orientada a Eventos. Inserción de datos (INSERT) INSERT….VALUES INSERT INTO Tabla1 (Columna1, Columna2…) VALUES (‘ValorAlfa’, ValorNum…);
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
DISPARADORES Y SISTEMAS DE GESTION DE BASE DE DATOS DE SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
SQL Lenguaje Estructurado de Consultas. Structured Query Lenguaje (SQL). Lenguaje de acceso a bases de datos. Proyecto de Investigación de IBM. La mayoria.
Lenguaje Estructurado de Consultas
Base de Datos I – Ing. Mary Carlota Bernal J. BASE DE DATOS I PL/SQL.
Apuntes PL-SQL Triggers II. Tipos de datos compuestos Registros PL/SQL: Son similares a un tipo struct en C o a un tipo Registro en otros 3GL. Se componen.
SQL: DDL.
6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
Apuntes PL-SQL Triggers I.
3 Cursores ORACLE Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega.
Administración de Base de Datos Integridad Prof Mercy Ospina Torres Prof Renny A. Hernandez
Mtr. Adrián Monge Monge Educación 2015 Maestría, Mención en Administración de Proyectos ULACITMaestría, Mención en Administración de Proyectos 2012 Licenciatura,
DML Transact SQL Sesión X Triggers. Duración 2 Horas.
6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
6 Triggers ORACLE - III Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
PL/SQL Francisco Moreno Universidad Nacional.
BASE DE DATOS IUPSM CLASE PRACTICA. PROF. ING. JOSE L GUZMAN H.
UN DISPARADOR O TRIGGER es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Es una rutina autónoma.
Transcripción de la presentación:

PL/SQL Francisco Moreno Universidad Nacional

Disparadores (Triggers) Los triggers son bloques PL/SQL que se ejecutan de manera implícita cuando se ejecutan operaciones INSERT, DELETE, UPDATE a una tabla* Se usan principalmente para establecer reglas complejas de integridad y labores de auditoría. * También existen triggers que se disparan ante otros eventos (LOGON, LOGOFF, STARTUP, BEFORE DDL, entre otros.) ¿Por ejemplo?

Un trigger tiene asociado: Un evento Un momento Un tipo El evento se refiere a la operación que se efectúa sobre la tabla (INSERT, DELETE o UPDATE).

El momento, se refiere a cuándo se dispara el trigger en relación con el evento. Sus posibles valores son BEFORE y AFTER*. El tipo indica el número de veces que el cuerpo del trigger se ejecuta: por la operación en conjunto (trigger de operación) o por cada fila procesada (trigger de fila). En este último caso se debe adicionar la cláusula FOR EACH ROW * Y también INSTEAD OF para vistas.

Los triggers se ejecutan implícitamente cuando ocurre el evento Haciendo las diferentes combinaciones, para una tabla se pueden crear máximo doce tipos de triggers Se pueden tener varios triggers del mismo tipo asociados con una misma tabla Los triggers se ejecutan implícitamente cuando ocurre el evento Normalmente en los triggers no se pueden* usar las sentencias COMMIT, ni ROLLBACK * Es posible con autonomous transactions, por simplicidad se omitirán.

Para especificar triggers de fila Sintaxis esencial de un trigger: CREATE [OR REPLACE] TRIGGER nombre_trigger momento evento ON tabla [FOR EACH ROW [WHEN condición]] bloque de PL/SQL Si el evento es UPDATE, se puede(n) especificar la(s) columna(s) que dispararán el trigger con la palabra OF (si no se especifican, el trigger se dispara con cualquier columna de la tabla que sea actualizada) El bloque comienza con la palabra DECLARE o BEGIN Para especificar triggers de fila

Evento Valor anterior Valor nuevo INSERT NULL El valor que se va a insertar DELETE El valor antes del borrado UPDATE El valor antes de la actualiza- ción El valor después de la actualiza-ción Si es un trigger de fila, se puede acceder al valor de una columna antes de la actualización con :OLD.nomcolumna y al valor después de la actualización con :NEW.nomcolumna

Ejemplo: Trigger de operación CREATE TABLE PRODUCTO(codigo NUMBER(6) PRIMARY KEY, precio NUMBER(6)); CREATE OR REPLACE TRIGGER control_insercion_productos BEFORE INSERT ON producto BEGIN IF TO_CHAR(SYSDATE,'D') = '7'THEN RAISE_APPLICATION_ERROR(-20506,'¡No los domingos!'); END IF; END; / La instrucción RAISE_APPLICATION_ERROR abortará la operación de inserción si esta se intenta hacer en el horario no permitido. Domingo (puede ser 1 o 7 según la config. del NLS) SQLCODE y SQLERRM asignados por el usuario

BEGIN INSERT INTO producto VALUES(1,10); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM); END; /

Ejemplo: Trigger de Fila Sean las tablas: CREATE TABLE cuenta( nro_cta NUMBER(10) PRIMARY KEY, saldo NUMBER(8) NOT NULL CHECK (saldo >= 0) ); INSERT INTO cuenta VALUES(1, 100); INSERT INTO cuenta VALUES(2, 200); CREATE TABLE retiro( nro_retiro NUMBER(10) PRIMARY KEY, cta NUMBER(10) REFERENCES cuenta NOT NULL, valor NUMBER(8) NOT NULL CHECK (valor > 0)

Cuando se va a insertar un retiro: - Si su valor es mayor al saldo de la cuenta, se debe rechazar la transacción. Si el retiro se puede hacer, se debe actualizar el saldo de la cuenta Nota: el banco cobra una comisión de 10$ por cada retiro. Además la cuenta debe quedar con un saldo mínimo de 20$, de lo contrario el retiro no se permite.

CREATE OR REPLACE TRIGGER control_retiro BEFORE INSERT ON retiro FOR EACH ROW DECLARE saldo_cta cuenta.saldo%TYPE; BEGIN SELECT saldo INTO saldo_cta FROM cuenta WHERE nro_cta = :NEW.cta; --La cta. debe quedar min con 20 y tener 10$ para la comisión IF saldo_cta < :NEW.valor + 30 THEN RAISE_APPLICATION_ERROR(-20505,'¡Fondos insuficientes!'); ELSE UPDATE cuenta SET saldo = saldo - :NEW.valor - 10 WHERE nro_cta = :NEW.cta; END IF; END; / Tarea: ¡Analizar qué pasaría si el valor del retiro fuese negativo!

INSERT INTO retiro VALUES(22, 1, 70); Ejercicio: Analizar las consecuencias de actualizar o borrar tanto en la tabla cuenta como en la tabla retiro. Por ejemplo: ¿sería válido actualizar el valor de un retiro? ¿Bajo que circunstancias?  Considerar el manejo de fechas: por ejemplo, si en la fecha del retiro la cuenta tenía saldo suficiente…

Un ejemplo con XML CREATE TABLE pago(id NUMBER(4) PRIMARY KEY, d XMLTYPE); CREATE OR REPLACE TRIGGER control_porc BEFORE INSERT ON pago FOR EACH ROW DECLARE p1 VARCHAR2(20); p2 VARCHAR2(20); BEGIN p1 := :NEW.d.EXTRACT('/Emp/Porcen1/text()').getstringval(); p2 := :NEW.d.EXTRACT('/Emp/Porcen2/text()').getstringval(); IF (TO_NUMBER(p1) + TO_NUMBER(p2)) != 100 THEN RAISE_APPLICATION_ERROR(-20505,'¡Los porc. no suman 100!'); END IF; END; /

Un ejemplo con XML INSERT INTO pago VALUES (100, XMLType('<Emp cod="5"> <Porcen1>80</Porcen1> <Porcen2>18</Porcen2> </Emp>')); (200, XMLType('<Emp cod="7"> <Porcen2>20</Porcen2>

La cláusula WHEN Sirve para agregar una condición adicional para activar el trigger Dentro de la condición WHEN para referirse a NEW y a OLD no se usan los dos puntos (:) Ejemplo. Sea: CREATE TABLE auditoria (usuario VARCHAR2(20),cuando DATE, cta NUMBER(6), aumento NUMBER(10));

Sin usar WHEN: Usando WHEN: CREATE or REPLACE TRIGGER quien_sube_retiro BEFORE UPDATE OF valor ON retiro FOR EACH ROW WHEN (NEW.valor > OLD.valor) BEGIN INSERT INTO auditoria VALUES(USER, SYSDATE, :old.cta, :NEW.valor - :OLD.valor ); END; / CREATE or REPLACE TRIGGER quien_sube_retiro BEFORE UPDATE OF valor ON retiro FOR EACH ROW BEGIN IF :NEW.valor > :OLD.valor THEN INSERT INTO auditoria VALUES(USER, SYSDATE, :old.cta, :NEW.valor - :OLD.valor ); END IF; END; / Conclusión: WHEN evita el uso de un IF explícito dentro de la sección ejecutable del trigger

El orden de ejecución de los triggers es el siguiente: La ejecución de un trigger es transaccional, es decir, si un trigger de fila afecta n registros y si uno solo de ellos aborta, entonces todo el proceso se aborta. El orden de ejecución de los triggers es el siguiente: 1. Se ejecutan (si los hay*) los triggers BEFORE de operación 2. Se ejecutan sucesivamente para cada fila: - (Si los hay*) los triggers BEFORE de fila - Se ejecuta la operación DML correspondiente** - (Si los hay*) los triggers AFTER de fila 3. Se ejecutan (si los hay*) los triggers AFTER de operación * Si hay varios triggers con idéntica definición (a partir de Oracle 8i), el orden de ejecución entre ellos es “aleatorio”  Ver diapositiva final. ** Tarea: analizar en relación con los triggers cuando se realizan las verificaciones de integridad (clave primaria, foránea, checks, entre otras).

CREATE TABLE jefe(cc NUMBER(8) PRIMARY KEY, salario NUMBER(8)); INSERT INTO jefe VALUES(10, 400); INSERT INTO jefe VALUES(20, 200); CREATE OR REPLACE TRIGGER bef_upd_ope1 BEFORE UPDATE ON jefe BEGIN DBMS_OUTPUT.PUT_LINE('Trigger de Ope. BEFORE 1'); END; / CREATE OR REPLACE TRIGGER bef_upd_ope2 DBMS_OUTPUT.PUT_LINE('Trigger de Ope. BEFORE 2');

CREATE OR REPLACE TRIGGER bef_upd_row1 BEFORE UPDATE ON jefe FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Bef Upd fila1 cc:'||:NEW.cc); DBMS_OUTPUT.PUT_LINE(:NEW.salario); :NEW.salario := :NEW.salario + 50; END; /

Ahora para comprobar el funcionamiento: UPDATE jefe set salario = 100; CREATE OR REPLACE TRIGGER bef_upd_row2 BEFORE UPDATE ON jefe FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Bef Upd fila2 cc:'||:NEW.cc); DBMS_OUTPUT.PUT_LINE(:NEW.salario); IF :NEW.salario > 100 THEN :NEW.salario := 0; END IF; END; / Ahora para comprobar el funcionamiento: UPDATE jefe set salario = 100;

Resultados Trigger de Ope. BEFORE 2 Trigger de Ope. BEFORE 1 Bef Upd fila1 cc:10 100 Bef Upd fila2 cc:10 150 Bef Upd fila1 cc:20 Bef Upd fila2 cc:20 Triggers de operación Triggers de fila afectando a la fila con cc 10 Triggers de fila afectando a la fila con cc 20 Ejercicio: intercambiar los nombres de bef_upd_row1 y de bef_upd_row2 y ejecutar todo de nuevo y ver que sucede

Tarea: consultar las opciones: IF INSERTING …, IF UPDATING…, IF DELETING… Oracle 11g soporta la opción FOLLOWS ver acá. También se soportan Compound Triggers ver acá. Permite codificar varios triggers en uno solo