Bonjour,
Je voudrais créer un trigger qui calcule le nombre d'étudiants inscrits dans le nomod 'sy001'qui a un nombre limité d'effectifs (effecmax) sur la table module lors de l'inscription de l'étudiant sur la table inscription, en créant un compteur sur la table module et qui empêche aussi que l'on puisse baisser le nombre d'effectifs maximal par la suite mais mon compteur ne marche pas et je n'arrive pas à comprendre comment je peux le faire fonctionner ou comment contourner ce problème et le résoudre...
Je voudrais aussi créer un trigger qui empêche qu'un étudiant puisse s'inscrire plus d'une fois à un même module mais ça ne marche pas non plus et je ne comprends pas l'erreur.
Et un troisième trigger qui m'envoie un code d'erreur si je ne remplis pas le champ civilité de la table etudiant par 'MR' ou 'ME' ou 'MLE' (bref uniquement que par ces trois possibilités).
Merci de m'aider à résoudre ces problèmes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
create table ETUDIANT(
numetud number(10),
nom varchar2(20),
prenom varchar2(20),
datenaiss date,
civilite varchar2(5),
patronyme  varchar2(20),
numinsee char(13),
adresse varchar2(100)
);

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
insert into ETUDIANT values(2000000001,'Matera','Emma','25/08/1992','MLE',NULL,2920811111112,'10 rue Jean Renoir, 75017 Paris');
insert into ETUDIANT values(1000000002,'Fauchier','Quentin','18/05/1991','MR',NULL,1905111111113,'35 rue Georges Sand, 92392 Villeneuve');
insert into ETUDIANT values(2000000003,'Marin','Juliette','31/12/1989','ME','Bateau',2891211111114,'5 place Rambrand, 75009 Paris');
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
create table MODULE(
codmod varchar2(10),
nomod varchar2(30),
effecmax number(2)
);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
insert into MODULE values('bd001','Bases de donnees deb',NULL);
insert into MODULE values('bd002','Bases de donnees avan',NULL);
insert into MODULE values('sy001','Systeme d Information',5);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
create table EXAMEN(
codmod varchar2(10),
codexam varchar2(10), 
datexam date
);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
create table  RESULTAT(
numetud number(10),
codmod varchar2(10),
codexam varchar2(10),
note number(4,2)
);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
create table INSCRIPTION(
numetud number(10),
codmod varchar2(10),
datinsc date
);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
insert into INSCRIPTION values(1000000000,'bd001','12/09/2008');
insert into INSCRIPTION values(1000000000,'sy001','12/09/2008');
insert into INSCRIPTION values(2000000003,'bd001','15/09/2008');
insert into INSCRIPTION values(2000000003,'sy001','15/09/2008');
insert into INSCRIPTION values(1000000001,'sy001','12/09/2008');
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
create table PREREQUIS(
codmod varchar2(10),
codmodpreq varchar2(30), 
notepreq number(4,2)
);
trigger TrigInsInscript, TrigDelInscript, TrigUpInscript pour limiter les inscriptions à l'effecmax

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
create or replace trigger TrigInsInscript
before insert on inscription2
for each row 
when (new.codmod = 'sy001')
 
declare 
v_compteur module2.nbinscrits%type;
v_nomod module2.nomod%type;
 
begin 
 
	select nbinscrits, nomod into v_compteur, v_nomod from module2
	where codmod = :new.codmod;
 
if (v_compteur<3) then
 
	update module2 set nbinscrits = nbinscrits + 1 
	where codmod = :new.codmod;
 
else 
	raise_application_error (-20110,'Le module'|| v_nomod ||'est limité à 2 inscriptions par an!');
 
end if;
 
exception 
	when no_data_found then
	raise_application_error (-20111,'Module'||:new.codmod||'inexistant');
 
	when others then raise;
 
end;
/	
 
create or replace trigger TrigDelInscript
after delete on inscription2
for each row 
when (new.codmod = 'sy001')
 
begin 
	update module2 set nbinscrits = nbinscrits - 1 
	where codmod = :old.codmod;
end;
/	
 
create or replace trigger TrigUpInscript
after update of codmod on inscription2
for each row 
when (new.codmod = 'sy001')
 
declare 
v_compteur module2.nbinscrits%type;
v_nomod module2.nomod%type;
 
begin 
 
	select nbinscrits, nomod into v_compteur, v_nomod from module2
	where codmod = :new.codmod;
 
if (v_compteur<3) then
 
	update module2 set nbinscrits = nbinscrits + 1 
	where codmod = :new.codmod;
 
	update module2 set nbinscrits = nbinscrits - 1 
	where codmod = :old.codmod;
 
else 
	raise_application_error (-20112,'Le module'|| v_nomod ||'est limité à 2 inscriptions par an!');
 
end if;
 
exception 
	when no_data_found then
	raise_application_error (-20113,'Module'||:new.codmod||'inexistant');
 
	when others then raise;
 
end;
/	
 
 
 
 
create or replace trigger TrigDoubleInscript
before insert  on inscription2
 
declare 
v_num inscription2.numetud%type;
v_cod inscription2.codmod%type;
 
begin
select codmod, numetud into v_cod, v_num  from inscription2 where numetud = :new.numetud;
if (codmod = :new.codmod) then
raise_application_error (-20114,'Double inscription dans ce module'||:new.codmod);
end;
/	
 
insert into INSCRIPTION2 values(1000000000,'bd001','12/09/2008');
 
 
 
create or replace trigger TrigCivilite
before insert  on etudiant2
 
declare create or replace trigger TrigCivilite
before insert  on etudiant2
 
declare 
v_civilite etudiant2.civilite%type;
 
 
begin
select civilite into v_civilite  from etudiant2;
if (civilite<> 'MR' or civilite<> 'ME'  or civilite<> 'MLE' ) then
raise_application_error (-20115,'Erreur dans civilite');
 
end if;
end;
/	
v_civilite etudiant2.civilite%type;
 
 
begin
select civilite into v_civilite  from etudiant2;
if (v_civilite<> 'MR' or v_civilite<> 'ME'  or v_civilite<> 'MLE' ) then
raise_application_error (-20115,'Erreur dans civilite');
 
end if;
end;
/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
insert into ETUDIANT2 values(2000000099,'Barbosa','Ange','11/11/1983','MLE',NULL,2911211111101,'Gervais');