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
   |  
-- TABLE DE TEST 
create table TEST_CHEV (DEB integer, FIN integer )
 
-- TABLE TEMPORAIRE A L'IMAGE DE LA TABLE DE TEST AVEC LE ROWID 
create GLOBAL TEMPORARY table TMP_CHEV (DEB integer, FIN integer, RID ROWID)
 
-- remplissage de la table temporaire au fil de l'eau car on ne peut pas faire de select dans la table 
CREATE OR REPLACE TRIGGER TRG_AIU_CHEV
AFTER INSERT OR UPDATE
ON TEST_CHEV 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
  insert into  TMP_CHEV (DEB , FIN , RID)
    values (:NEW.DEB, :NEW.FIN , :NEW.ROWID);
END ;
/
 
-- verification apres requete: ici on peut faire un select dans la table 
CREATE OR REPLACE TRIGGER TRG_AS_CHEV
AFTER INSERT OR UPDATE
ON TEST_CHEV 
REFERENCING NEW AS NEW OLD AS OLD
DECLARE
 nn integer;
BEGIN
   -- test d'existance de chevauchement 
   -- ici avec des inégalités larges car on ne tolère  pas qu'un début soit égal à une fin.
   select count(1) into nn  from TEST_CHEV T, TMP_CHEV TMP
    where T.ROWID != TMP.RID 
	  and T.DEB <= TMP.FIN
	  and T.FIN >= TMP.DEB;
   -- purge de la table temporaires
   delete from TMP_CHEV;
   -- declenchement d'exception, le statement sera annulé.
   if nn > 0 then
     RAISE_APPLICATION_ERROR (-20000,'CHEVAUCHEMENT INTERDIT!');
   end if;
END ;
/ | 
Partager