TRIGGERS

Wednesday, October 18, 2006

Ejemplos

EN ESTE BLOG TRABAJAREMOS VARIOS EJERCIOS PARA COMPLEMENTAR EL APRENDIZAJE DE LOS DISPARADORES:


1. Este es un ejercicio para realizar auditorias almacenando en una tabla los eventos de instrucciones DDL que se realicen en la base de datos:


create or replace trigger DDLTrigger
AFTER DDL ON DATABASE
BEGIN
insert into ADM
VALUES ( ora_login_user, sysdate, ora_sysevent, ora_dict_obj_type, ora_dict_obj_owner, ora_dict_obj_name );
END;
/

2. En este ejecicio obtendremos la sumatoria y el promedio de los saldos de los articulos:

SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER ESTA_ARTICULO
AFTER INSERT OR DELETE OR UPDATE ON ARTICULO
DECLARE
CURSOR C_ESTADISTICO IS
SELECT CODTIPO, AVG(SALDO) PROMEDIO,SUM(SALDO) SUMATORIA
FROM ARTICULO
GROUP BY CODTIPO;
BEGIN
FOR V_ESTADISTICA IN C_ESTADISTICO LOOP
UPDATE ESTA_ARTICULO
SET PROM= V_ESTADISTICA.PROMEDIO,
SUMATORIA=V_ESTADISTICA.SUMATORIA
WHERE CODTIP=V_ESTADISTICA.CODTIPO;
IF SQL%NOTFOUND THEN
INSERT INTO ESTA_ARTICULO VALUES(V_ESTADISTICA.CODTIPO,V_ESTADISTICA.PROMEDIO,
V_ESTADISTICA.SUMATORIA);
END IF;
END LOOP;
END;
/

3. En este ejercicio trabajamos con los disparadores de sustitucion que trabajan solamente con vistas y la instruccion instead of:

CREATE VIEW V_CLIENTE AS
SELECT CODCLI,NOMCLIEFROM CLIENTE;


SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER V_CLIENTE
INSTEAD OF DELETE OR INSERT OR UPDATE ON V_CLIENTE
FOR EACH ROW
BEGIN
IF DELETING THEN
DELETE FROM CLIENTE
WHERE CODCLI=:OLD.CODCLI;
DBMS_OUTPUT.PUT_LINE('SE BORRO EL REGISTRO');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('SE INSERTO UN REGISTRO');
ELSE
DBMS_OUTPUT.PUT_LINE('SE ACTUALIZO UN REGISTRO');
END IF;
END;
/



4. Ahora en el ejercicio que sigue trabajaremos con paquetes, y usaremos dos disparadores para manejar las inserciones y actualizaiones de la tabla venta, que esta relacionada con la tabla cliente:


CREATE OR REPLACE PACKAGE PVENTA AS
V_CODCLI VENTA.CODCLI%TYPE;
V_FORMAPAGO VENTA.FORMADEPAGO%TYPE;
END;
/


CREATE OR REPLACE TRIGGER C_VENTA
BEFORE INSERT OR UPDATE ON VENTA
FOR EACH ROW
BEGIN
PVENTA.V_CODCLI:=:NEW.CODCLI;
PVENTA.V_FORMAPAGO:=:NEW.FORMADEPAGO;
END;
/


SET SERVEROUTPUT ON;

CREATE OR REPLACE TRIGGER D_VENTA
BEFORE INSERT OR UPDATE ON VENTA
FOR EACH ROW
DECLARE
CURSOR CLIEN IS SELECT *FROM CLIENTE;
BEGIN
IF INSERTING THEN
IF PVENTA.V_FORMAPAGO='CREDITO' THEN
FOR V_LOOP IN CLIEN LOOP
IF V_LOOP.CODCLI = PVENTA.V_CODCLI THEN
UPDATE CLIENTE SET SALDOCLIE=(SALDOCLIE*1.05) WHERE CODCLI= PVENTA.V_CODCLI;
DBMS_OUTPUT.PUT_LINE('BIEN');
END IF;
END LOOP;
END IF;
ELSE
IF PVENTA.V_FORMAPAGO='EFECTIVO' THEN
FOR V_LOOP IN CLIEN LOOP
IF V_LOOP.CODCLI = PVENTA.V_CODCLI THEN
UPDATE CLIENTE SET SALDOCLIE = 0 WHERE CODCLI= PVENTA.V_CODCLI;
DBMS_OUTPUT.PUT_LINE('BIEN ACTUALIZADO');
END IF;
END LOOP;
END IF;
END IF;
PVENTA.V_CODCLI:=NULL;
PVENTA.V_FORMAPAGO:=NULL;
END;
/

1 Comments:

Blogger faja said...

estos trigger`s estan muy dificiles ... para aprender

9:25 PM  

Post a Comment

<< Home