1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
CREATE TABLE TOTO (LOGIN varchar2(50),CODE varchar2(50),FLAG NUMBER(1) default 0);
CREATE OR REPLACE TRIGGER TRG_TOTO_BIU_ROW
BEFORE INSERT OR UPDATE ON TOTO
FOR EACH ROW
BEGIN
-- test si il y a un changement de flag vers la valeur 1
-- dans ce cas on le passe à 2 pour signaler que c'est une nouvelle valeur
--return;
IF :new.FLAG = 1
and (INSERTING
OR (UPDATING AND nvl(:old.FLAG,0) != 1 AND nvl(:old.FLAG,0) != 2 /*pour pas tourner en rond */ )
)
then
:new.FLAG := 2;
end if;
END ;
/
CREATE OR REPLACE TRIGGER TRG_TOTO_AIU_STATEMENT
AFTER INSERT OR UPDATE ON TOTO
DECLARE
l_login TOTO.LOGIN%TYPE;
l_code TOTO.CODE%TYPE;
BEGIN
-- apres le statement, la table n'est plus en mutation, on peut donc agir dessus.
-- recherche d'une ligne flaguée à 2
select CODE,LOGIN into l_code,l_login from TOTO where FLAG = 2 and rownum = 1;
-- FLAG 1 sur la ligne modifiée
-- il faut d'abord faire cette modif sinon ça tourne en rond....
update TOTO set FLAG = 1 where CODE = l_code and LOGIN = l_login;
-- FLAG 0 sur toutes les autres lignes
update TOTO set FLAG = 0 where FLAG in (1,2) and (CODE != l_code or LOGIN != l_login);
EXCEPTION WHEN NO_DATA_FOUND THEN
-- pas d'action si il n'y a pas de 2
null;
END ;
/ |