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');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 create table PREREQUIS( codmod varchar2(10), codmodpreq varchar2(30), notepreq number(4,2) );
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');
Partager