Pages - Menu

Pages

Corrigé Exercices Trigger SQL

- Consulter la page de l'exercice.
- Solution des exercices


Correction 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 ;


Correction 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;


                                

Aucun commentaire:

Enregistrer un commentaire