Exercice SQL corrigé les Triggers

 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;

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *