Exercice 1
CREATE TRIGGER INS_CLIENT BEFORE INSERT ON CLIENT FOR EACH ROW DECLARE nom_conjoint CLIENT.NOM%TYPE ; compteur CLIENT.NUMCL%TYPE ; pb_dept EXCEPTION ; pb_conjoint1 EXCEPTION ; pb_conjoint2 EXCEPTION ; BEGIN -- Contrainte sur le département IF TRUNC(:NEW.CP/1000) NOT IN (01, 07, 26, 38, 42, 69, 73, 74) THEN RAISE pb_dept ; END IF ; -- Contrainte sur le nom du conjoint (+ test d’existence du conjoint) IF NEW.CONJOINT IS NOT NULL THEN SELECT COUNT(*), NOM INTO compteur, nom_conjoint FROM CLIENT WHERE NUMCL = :NEW.CONJOINT GROUP BY NOM ; IF compteur = 0 THEN -- Pas de conjoint RAISE pb_conjoint1 ; END IF ; IF nom_conjoint :NEW.NOM THEN RAISE pb_conjoint2 ; END IF ; END IF ; EXCEPTION WHEN pb_dept THEN RAISE_APPLICATION_ERROR (-20501, ‘Insertion impossible : le client n’habite pas en région Rhône-Alpes !’) ; WHEN pb_conjoint1 THEN RAISE_APPLICATION_ERROR (-20502, ‘Insertion impossible : le conjoint du client n’existe pas !’) ; WHEN pb_conjoint2 THEN RAISE_APPLICATION_ERROR (-20503, ‘Insertion impossible : le nom du conjoint est différent de celui du client !’) ; END ;
Exercice 2
CREATE OR REPLACE TRIGGER cleauto before INSERT ON tabl FOR each row declare begin n integer; newkey integer; preums exception; -- Recherche s'il existe des tuples dans la table SELECT count(*) INTO n FROM tabl; IF n=0 then raise preums; -- Premiere insertion end IF; -- Recherche la valeur de cle C la plus elevee -- et affecte C+1 a la nouvelle cle SELECT max(clenum) INTO newkey FROM tabl; :new.clenum := newkey + 1; exception -- Premier numero = 1 when preums then :new.clenum := 1; end;