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