-
Notifications
You must be signed in to change notification settings - Fork 3
/
script.sql
230 lines (150 loc) · 6.75 KB
/
script.sql
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
set serveroutput on;
prompt *****************************************************************
prompt ******************** CREATE TRIGGERS ****************************
prompt *****************************************************************
--============================== TRIGGERS ==============================
--======= TRIGGERS AUTO-INCREMENT =======
-- Auto-increment de la clé primaire de JEU (idJeu)
CREATE OR REPLACE TRIGGER auto_increment_idJeu
BEFORE INSERT ON Jeu FOR EACH ROW
BEGIN
SELECT primary_idJeu.nextval INTO :NEW.idJeu FROM dual;
END;
/
--=============
-- Auto-increment de la clé primaire de INSTANCE_JEU (cleJeu)
CREATE OR REPLACE TRIGGER auto_increment_cleJeu
BEFORE INSERT ON Instance_Jeu FOR EACH ROW
BEGIN
SELECT primary_cleJeu.nextval INTO :NEW.cleJeu FROM dual;
END;
/
--=============
-- Auto-increment de la clé primaire de MAGASIN (idMagasin)
CREATE OR REPLACE TRIGGER auto_increment_idMagasin
BEFORE INSERT ON Magasin FOR EACH ROW
BEGIN
SELECT primary_idMagasin.nextval INTO :NEW.idMagasin FROM dual;
END;
/
--=============
-- Auto-increment de la clé primaire de EDITEUR (idEditeur)
CREATE OR REPLACE TRIGGER auto_increment_idEditeur
BEFORE INSERT ON Editeur FOR EACH ROW
BEGIN
SELECT primary_idEditeur.nextval INTO :NEW.idEditeur FROM dual;
END;
/
--=============
-- Auto-increment de la clé primaire de PLATEFORME (idPlateforme)
CREATE OR REPLACE TRIGGER auto_increment_idPlateforme
BEFORE INSERT ON Plateforme FOR EACH ROW
BEGIN
SELECT primary_idPlateforme.nextval INTO :NEW.idPlateforme FROM dual;
END;
/
--=============
-- Auto-increment de la clé primaire de CONSTRUCTEUR (idConstructeur)
CREATE OR REPLACE TRIGGER auto_increment_idConstructeur
BEFORE INSERT ON Constructeur FOR EACH ROW
BEGIN
SELECT primary_idConstructeur.nextval INTO :NEW.idConstructeur FROM dual;
END;
/
--======= AUTRES TRIGGERS =======
-- Verification de la date d'achat d'un jeu : invalide si la date est plus grande que la date d'aujourd'hui
CREATE OR REPLACE TRIGGER check_date_achat
BEFORE INSERT OR UPDATE ON Achat FOR EACH ROW
DECLARE
date_futur EXCEPTION;
BEGIN
IF :NEW.dateAchat > SYSDATE THEN
RAISE date_futur;
END IF;
EXCEPTION
WHEN date_futur THEN
RAISE_APPLICATION_ERROR(-20001, 'Date invalide');
END;
/
--=============
-- Calcul de la donnée calculable dateFinGarantie à partir de la garantie du jeu.
CREATE OR REPLACE TRIGGER calcul_date_fin_garantie
BEFORE INSERT ON Achat FOR EACH ROW
DECLARE
garantie_jeu Jeu.garantieJeu%type;
BEGIN
SELECT garantieJeu INTO garantie_jeu FROM Jeu,Instance_Jeu WHERE Jeu.idJeu = Instance_Jeu.idJeu AND Instance_Jeu.cleJeu = :NEW.cleJeu;
:NEW.dateFinGarantie := add_months(:NEW.dateAchat,12*garantie_jeu);
END;
/
prompt ******************************************************************
prompt ******************** CREATE PROCEDURES ***************************
prompt ******************************************************************
--============================== PROCEDURES ==============================
-- Récupère le jeu dont le titre se rapproche le plus du titre passé en paramètre. Récupère la categorie du jeu et propose à l'utilisateur une liste de jeux du même genre qui pourrait l'interresser.
CREATE OR REPLACE PROCEDURE memeCategorie (titreJeu IN VARCHAR)
IS
catJeu Jeu.categorieJeu%type;
titreTrouve Jeu.titre%type;
BEGIN
SELECT titre INTO titreTrouve FROM Jeu WHERE UPPER(titre) LIKE '%'||UPPER(titreJeu)||'%' AND rownum = 1;
SELECT categorieJeu INTO catJeu FROM Jeu WHERE titre = titreTrouve;
dbms_output.put_line('Jeux trouve : ' || titreTrouve);
dbms_output.put_line('Categorie du jeu trouve : ' || catJeu);
dbms_output.put_line('--------------');
dbms_output.put_line('Jeux du meme genre : ');
FOR jeu in (SELECT idJeu, titre FROM Jeu WHERE categorieJeu = catJeu AND titre <> titreTrouve) LOOP
dbms_output.put_line('ID : '||jeu.idJeu||' Titre : '||jeu.titre);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Aucun jeu ne correspond a la recherche : '||titreJeu);
END;
/
--=============
-- Affiche les jeux vendus d'un magasin donné et la somme total de ses ventes
CREATE OR REPLACE PROCEDURE ventesMagasin (paramMagasin IN VARCHAR)
IS
idMag Magasin.idMagasin%type;
nomMag Magasin.nomMagasin%type;
prixTotal Jeu.prix%type;
BEGIN
SELECT idMagasin, nomMagasin INTO idMag,nomMag FROM Magasin WHERE UPPER(nomMagasin) LIKE '%'||UPPER(paramMagasin)||'%' AND rownum = 1;
dbms_output.put_line('Fiche de vente du Magasin : ' || nomMag);
dbms_output.put_line('--------------');
FOR vente IN (
SELECT titre, prix, dateAchat
FROM Magasin, Achat, Jeu, Instance_jeu
WHERE magasinAchat = idMagasin AND Achat.cleJeu = Instance_jeu.cleJeu AND Jeu.idJeu = Instance_jeu.idJeu AND Magasin.idMagasin = idMag) LOOP
dbms_output.put_line('Jeu : '||vente.titre||' Prix : '||vente.prix||' Date d''achat : '|| vente.dateAchat);
END LOOP;
SELECT SUM(prix) INTO prixTotal
FROM Magasin, Achat, Jeu, Instance_jeu
WHERE magasinAchat = idMagasin AND Achat.cleJeu = Instance_jeu.cleJeu AND Jeu.idJeu = Instance_jeu.idJeu AND Magasin.idMagasin = idMag;
dbms_output.put_line('--------------');
dbms_output.put_line('Somme des ventes : '|| prixTotal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Aucun magasin ne correspond a la recherche : '||nomMag);
--------------
END;
/
prompt *************************************************************
prompt ******************** CREATE VIEWS ***************************
prompt *************************************************************
--============================== VUES ==============================
-- Vue permettant de récupérer facilement les différentes plateformes disponibles pour un même jeu.
CREATE OR REPLACE VIEW plateforme_jeu AS
SELECT titre as TitreJeu, nomPlateforme as Plateforme FROM Jeu, Instance_Jeu, Plateforme
WHERE Jeu.idJeu = Instance_Jeu.idJeu AND Instance_Jeu.plateformeJeu = Plateforme.idPlateforme GROUP BY titre, nomPlateforme ORDER BY TitreJeu;
-- Vue permettant de compter le nombre d'instance de chaque jeu vendu.
CREATE OR REPLACE VIEW statistiques_jeux AS
SELECT titre as TitreJeu, count(*) as NbJeuxVendus FROM Jeu, Instance_Jeu, Achat
WHERE Jeu.idJeu = Instance_Jeu.idJeu AND Instance_Jeu.cleJeu = Achat.cleJeu GROUP BY titre ORDER BY TitreJeu;
prompt *************************************************************
prompt ******************** CREATE INDEX ***************************
prompt *************************************************************
--============================== INDEX ==============================
CREATE INDEX index_nomJeu on Jeu(titre);
CREATE INDEX index_magasin on Magasin(nomMagasin);
@privileges