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;
- 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;
Article plus récent Article plus ancien