Selected files
16 printable files
TD1/02.sql
TD1/03.sql
TD1/04.sql
TD1/05.sql
TD1/06.sql
TD1/06+constraint.sql
TD1/07.sql
TD1/08.sql
TD1/09.sql
TD1/10.sql
TD1/11.sql
TD1/create.sql
TD1/data.sql
TD1/dropTables.sql
TD1/sup.sql
TD1/tables.sql
TD1/02.sql
1 SET SERVEROUTPUT ON
2
3 DECLARE
4 nombre_etape_v VARCHAR2(128);
5 ville_depart_v VARCHAR2(128);
6 ville_arrivee_v VARCHAR2(128);
7 BEGIN
8 SELECT villeDepart, villeArrivee INTO ville_depart_v, ville_arrivee_v
9 FROM circuit
10 WHERE identifiant=9;
11
12 SELECT count (distinct ordre) INTO nombre_etape_v FROM etape
13 WHERE identifiant=9;
14
15 DBMS_OUTPUT.PUT_LINE('Information sur le circuit 9: ' || ville_depart_v || ', ' || ville_arrivee_v || ', ' ||
nombre_etape_v || ' ETAPES');
16
17 END;
17 END;
18 /
19
20
TD1/03.sql
1 set echo off
2 set verify off
3 set serveroutput on
4
5 VARIABLE mess_g varchar2(100);
6 ACCEPT nomLieu_g CHAR DEF 'Canals' PROMPT Lieu?;
7 ACCEPT ville_g CHAR DEF 'Amsterdam' PROMPT Ville?;
8 ACCEPT pays_g CHAR DEF 'Pays-Bas' PROMPT Pays?;
9
10 DECLARE
11 numVisite_v INTEGER;
12 BEGIN
13
14 SELECT count(*) INTO numVisite_v FROM etape
15 WHERE nomLieu = '&nomLieu_g' AND ville='&ville_g' AND pays='&pays_g';
16
17 IF numVisite_v = 0 THEN
18 DELETE FROM LieuAVisiter
19 WHERE nomLieu = '&nomLieu_g' AND ville='&ville_g' AND pays='&pays_g';
20 :mess_g := 'OK';
21 ELSE
22 :mess_g := 'Suppression impossible';
23 END IF;
24
25 dbms_output.put_line(:mess_g);
26 END;
27 /
28
TD1/04.sql
1 set serveroutput ON
2
3 CREATE OR REPLACE PROCEDURE bloque_reserv(N NUMBER)
4 IS
5 mess_v NVARCHAR2(50);
6 numrow_n NUMBER;
7 BEGIN
8 UPDATE Circuit
9 SET nbPlaceDisponible=0
10 WHERE dateDepart-sysdate < numDay_p;
11
12 -- Use Implicit cursor attribute
13 IF SQL%NOTFOUND THEN
14 mess_v := 'aucun circuit modifié';
15 ELSE
16 numrow_n := SQL%ROWCOUNT;
17 mess_v := to_char(numrow_n) || ' circuits modifiés';
18 END IF;
19
20 DBMS_OUTPUT.PUT_LINE(mess_v) ;
21 END;
22 /
23
24 show errors procedure bloque_reserv ;
25
26 -- EXECUTE bloque_reserv(40);
27
TD1/05.sql
1 CREATE OR REPLACE PROCEDURE modifier_premiere_ville
2 IS
3 cursor etape_cur is
4 SELECT * FROM Etape
5 WHERE ordre = 1;
6 etape_r Etape%ROWTYPE;
7
8 BEGIN
9 OPEN etape_cur;
9 OPEN etape_cur;
10 LOOP
11 FETCH etape_cur INTO etape_r;
12 UPDATE Circuit
13 SET VilleArrivee = Etape_r.ville
14 WHERE Circuit.identifiant = etape_r.identifiant;
15 EXIT WHEN etape_cur%NOTFOUND;
16 END LOOP;
17 CLOSE etape_cur;
18 END;
19 /
20
21 show errors procedure modifier_premiere_ville ;
22
23
TD1/06.sql
1 DROP TABLE ReservationLieu ;
2 DROP TABLE Reservation ;
3 DROP TABLE Client ;
4
5 CREATE TABLE Client(
6 idClient integer PRIMARY KEY,
7 nom varchar2(64) NOT NULL,
8 prenom varchar2(64) NOT NULL,
9 dateNaissance date NOT NULL
10 ) ;
11
12 CREATE TABLE Reservation(
13 identifiant integer ,
14 idClient integer ,
15 nbPlace integer NOT NULL,
16 dateReserv date DEFAULT SYSDATE NOT NULL,
17 CONSTRAINT pk_Reservation PRIMARY KEY (identifiant, idClient),
18 CONSTRAINT fk_ReservationCircuit FOREIGN KEY (identifiant) REFERENCES Circuit,
19 CONSTRAINT fk_ReservationClient FOREIGN KEY (idClient) REFERENCES Client,
20 ) ;
21
21
22
23 CREATE TABLE ReservationLieu(
24 identifiant integer ,
25 idClient integer ,
26 nom varchar2(256) ,
27 ville varchar2(256) ,
28 pays varchar2(256) ,
29 nbPlace integer NOT NULL,
30 CONSTRAINT pk_ReservationLieu PRIMARY KEY (identifiant, idClient, nom, ville, pays),
31 CONSTRAINT fk_ReservationLieuCircuit FOREIGN KEY (identifiant) references Circuit,
32 CONSTRAINT fk_ReservationLieuClient FOREIGN KEY (idClient) references Client,
33 CONSTRAINT fk_ReservationLieuLieuAvisiter FOREIGN KEY (nom, ville, pays) references LieuAvisiter,
34 ) ;
35
36
TD1/06+constraint.sql
1 DROP TABLE ReservationLieu ;
2 DROP TABLE Reservation ;
3 DROP TABLE Client ;
4
5 CREATE TABLE Client(
6 idClient integer PRIMARY KEY,
7 nom varchar2(64) NOT NULL,
8 prenom varchar2(64) NOT NULL,
9 dateNaissance date NOT NULL
10 ) ;
11
12 CREATE TABLE Reservation(
13 identifiant integer ,
14 idClient integer ,
15 nbPlace integer NOT NULL,
16 dateReserv date DEFAULT SYSDATE NOT NULL,
17 CONSTRAINT pk_Reservation PRIMARY KEY (identifiant, idClient),
18 CONSTRAINT fk_ReservationCircuit FOREIGN KEY (identifiant) REFERENCES Circuit,
19 CONSTRAINT fk_ReservationClient FOREIGN KEY (idClient) REFERENCES Client,
20 CONSTRAINT ck_nbPlaceResa CHECK (nbPlace > 0)
21 ) ;
22
23
24 CREATE TABLE ReservationLieu(
25 identifiant integer ,
26 idClient integer ,
27 nom varchar2(256) ,
28 ville varchar2(256) ,
29 pays varchar2(256) ,
30 nbPlace integer NOT NULL,
31 CONSTRAINT pk_ReservationLieu PRIMARY KEY (identifiant, idClient, nom, ville, pays),
32 CONSTRAINT fk_ReservationLieuCircuit FOREIGN KEY (identifiant) references Circuit,
33 CONSTRAINT fk_ReservationLieuClient FOREIGN KEY (idClient) references Client,
34 CONSTRAINT fk_ReservationLieuLieuAvisiter FOREIGN KEY (nom, ville, pays) references LieuAvisiter,
35 CONSTRAINT ck_nbPlaceResaLieu CHECK (nbPlace > 0)
36 ) ;
37
38
TD1/07.sql
1
2 CREATE OR REPLACE FUNCTION prix_circuit
3 (identifiant_p circuit.identifiant%TYPE)
4 RETURN INTEGER
5 IS
6 prixTotalEtape_v INTEGER ;
7 prixCircuitTotal_v INTEGER ;
8 BEGIN
9 SELECT prixInscription INTO prixCircuitTotal_v FROM circuit
10 WHERE identifiant = identifiant_p;
11
12 SELECT sum(prix) INTO prixTotalEtape_v FROM Etape E, LieuAVisiter L
13 WHERE E.identifiant = identifiant_p AND E.nomLieu = L.nomLieu
14 AND E.ville = L.ville AND E.pays = L.pays;
15
16 prixCircuitTotal_v := prixCircuitTotal_v + prixTotalEtape_v;
17
17
18 return prixCircuitTotal_v;
19 END;
20 /
21 -- SELECT identifiant,prix_circuit(identifiant) FROM circuit WHERE identifiant=2;
22
TD1/08.sql
1 -- Une personne souhaite consulter tous les circuits complets compatibles avec son budget, ses dates de vacances
2 -- (le client indique la date de début de ses vacances ainsi que la date de fin) et pour lesquels il reste au moins N
3 -- places disponibles. Écrire une procédure affichant l'identifiant du circuit, son prix, sa date de début et sa durée
4 -- pour tous les circuits satisfaisant les contraintes exprimées par le client.
5 set echo off
6 set verify off
7 set serveroutput on
8
9 CREATE OR REPLACE PROCEDURE circuits_selection
10 ( dateDeb_p DATE, dateFin_p DATE, budget_p INTEGER, place_p INTEGER )
11 IS
12 cursor circuit_select_cur IS
13 SELECT identifiant,
14 prix_circuit(circuit_r.identifiant) AS prix_circuit,
15 dateDepart,duree
16 FROM circuit
17 WHERE nbPlaceDisponible >= place_p
18 AND dateDepart > dateDeb_p
19 AND (dateDepart + duree) > dateFin_p
20 AND prix_circuit <= budget_p
21 ;
22
23 BEGIN
24 FOR circuit_r IN circuit_select_cur
25 LOOP
26 DBMS_OUTPUT.PUT_LINE(
27 'identifiant : '
28 || circuit_r.identifiant
29 || ', prix : '
29 || ', prix : '
30 || prix_circuit_v
31 || ', date debut : '
32 || circuit_r.dateDepart
33 || ', duree : '
34 || circuit_r.duree
35 ) ;
36 END LOOP ;
37 END ;
38 /
39
40 show errors procedure circuits_selection ;
41 -- EXECUTE circuits_selection('01-JAN-2017','31-DEC-2017',1000,1);
42
TD1/09.sql
1 -- Écrire une procédure permettant de supprimer une étape d’un circuit. Le numéro d’ordre de l’étape à supprimer
2 -- est donné en paramètre de la procédure. Le numéro d’ordre des autres étapes est modifié de telle sorte que la
3 -- numérotation soit continue (pour tout N>1, l’existence d’une étape d’ordre N implique qu’il existe une étape
4 -- d’ordre N-1 dans la table Etape).
5
6 -- Pose de verrou sur les n-uplets (ou colonne de n-uplets) pour empêcher les modifications par d’autres transactions
(FOR UPDATE …).
7 -- Modification du n-uplet actuellement pointé par le curseur (WHERE CURRENT OF)
8
9 CREATE OR REPLACE PROCEDURE suppressionEtape
10 ( idCirc_p Circuit.identifiant%TYPE, numEtape_p NUMBER )
11 IS
12 i INTEGER := 1 ;
13 CURSOR cur_ordre IS
14 SELECT ordre
15 FROM etape
16 WHERE etape.identifiant = idCirc_p
17 ORDER BY ordre ASC
18 FOR UPDATE OF ordre -- verrou (cf. SELECT ... FOR UPDATE)
19 ;
20 BEGIN
21 IF numEtape_p < 1 THEN
21 IF numEtape_p < 1 THEN
22 RAISE_APPLICATION_ERROR(-20000,'Numero d''etape incorrecte') ;
23 END IF;
24
25 FOR row IN cur_ordre
26 LOOP
27 IF row.ordre = numEtape_p -- s'il s'agit de l'élément à supprimer
28 THEN
29 DELETE FROM Etape
30 WHERE CURRENT OF cur_ordre ;
31 i := numEtape_p ;
32 ELSIF row.ordre > numEtape_p THEN
33 UPDATE etape
34 SET ORDRE = i
35 WHERE CURRENT OF cur_ordre ;
36 i := i + 1 ;
37 END IF ;
38 END LOOP ;
39 END ;
40 /
41
42 SHOW ERRORS procedure suppressionEtape ;
43
44 -- Remarques
45
46 -- WHERE CURRENT is used as a reference to the current row when
47 -- using a cursor to UPDATE or DELETE the current row.
48
49 -- The cursor must be based on SQL that selects 'FOR UPDATE'
50 -- http://stackoverflow.com/questions/10935850/when-to-use-select-for-update
51 -- select * from my_table where my_condition;
52 -- -> _cursor_ ... selects ... for update
53 -- update my_table set my_column = my_column where my_condition;
54 -- -> where current of _cursor_
55
TD1/10.sql
1 -- Utiliser un curseur paramétré (en Oracle) pour afficher pour chacun des futurs circuits touristiques la liste des
1 -- Utiliser un curseur paramétré (en Oracle) pour afficher pour chacun des futurs circuits touristiques la liste des
2 -- clients ayant déjà effectué une réservation (nom, prénom et nombre de place réservé pour chaque client).
3
4 -- Exemple de résultat que l’on pourra obtenir:
5 -- Circuit 9: Bodrum-Kusadasi, 25-OCT-08
6 -- King Richard: 1
7 -- Allen Tim: 4
8 -- ...
9 -- Circuit 4: Houston-San Antonio, 29-OCT-08
10 -- Tiger Scott: 5
11 -- Smith Adam: 5
12 -- ...
13
14
15 -- Utilisation d’un curseur paramétré (il est possible d’obtenir le même résultat avec un seul curseur utilisant un GROUP
BY)
16
17
18 -- Accepter les espaces en debut de ligne;
19 -- cf. http://www.dbasupport.com/forums/showthread.php?39223-How-do-I-print-space-in-the-beginning-of-a-line
20 set serveroutput on format wrapped;
21
22 CREATE OR REPLACE PROCEDURE aff_reserv_cli
23 IS
24 CURSOR cur_circ IS
25 SELECT * FROM circuit
26 WHERE dateDepart > SYSDATE
27 ORDER BY dateDepart ASC ;
28
29 CURSOR cur_cli(id_p INTEGER) IS -- curseur prends un paramètre
30 SELECT * FROM Reservation JOIN client ON Client.idClient = Reservation.idClient
31 WHERE identifiant = id_p ;
32 BEGIN
33 FOR row_circ IN cur_circ
34 LOOP
35 DBMS_OUTPUT.PUT_LINE('Circuit '
36 || row_circ.identifiant || ', '
37 || row_circ.villeDepart || '-'
38 || row_circ.villeArrivee || ', '
38 || row_circ.villeArrivee || ', '
39 || row_circ.dateDepart
40 ) ;
41
42 FOR row_cli IN cur_cli(row_circ.identifiant)
43 LOOP
44 DBMS_OUTPUT.PUT_LINE(' '
45 || row_cli.nom || ' '
46 || row_cli.prenom || ': '
47 || row_cli.nbplace
48 ) ;
49 END LOOP ;
50 END LOOP ;
51 END ;
52 /
53
54 SHOW ERRORS procedure aff_reserv_cli
55
56 -- Pour lancer cette procedure :
57 execute aff_reserv_cli();
58
TD1/11.sql
1 -- Écrire une procédure permettant à un client de réserver N places pour un circuit touristique ainsi que pour
2 -- toutes ses étapes.
3 set serverout on
4 CREATE OR REPLACE PROCEDURE reservation_circuit
5 ( idclient_p reservation.idClient%TYPE, idCircuit_p circuit.identifiant%TYPE, nbPlace_p INTEGER)
6 IS
7 circuit_v circuit%ROWTYPE;
8 cursor etape_cur IS -- Liste les étapes du circuit demandé
9 SELECT * FROM Etape
10 WHERE identifiant = idCircuit_p ;
11 LATE_EXCEPTION exception ;
12 WRONG_NUMBER_PLACE exception ;
13
14 BEGIN
15 SELECT * into circuit_v FROM circuit -- sélection du circuit demandé
16 WHERE identifiant = idCircuit_p;
17 IF ( SYSDATE < circuit_v.dateDepart AND nbPlace_p < circuit_v.nbPlaceDisponible AND nbPlace_p > 0 ) -- test si le
circuit n'est pas passé et s'il y a de la place
18 THEN
19 BEGIN
20 INSERT INTO Reservation VALUES (idCircuit_p, idclient_p, nbPlace_p, SYSDATE) ; -- Insertion d'une réservation
21 -- NB: suite à 1 réserv. un trigger doit décrémenter le nbre de place dispo dans la table circuit
22 FOR etape_r IN etape_cur -- Réservation de toutes les étapes
23 LOOP
24 INSERT INTO ReservationLieu
25 VALUES (idCircuit_p, idclient_p, etape_r.nomLieu, etape_r.ville, etape_r.pays, nbPlace_p) ;
26 END LOOP ;
27 END;
28 ELSIF SYSDATE > circuit_v.dateDepart -- si test raté car trop tard
29 THEN
30 RAISE LATE_EXCEPTION ;
31 ELSIF nbPlace_p > circuit_v.nbPlaceDisponible -- si test raté car plus de place
32 THEN
33 RAISE WRONG_NUMBER_PLACE;
34 END IF;
35
36 EXCEPTION
37 WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('circuit_indefini') ; -- Si circuit inexistant
38 WHEN LATE_EXCEPTION THEN DBMS_OUTPUT.PUT_LINE('trop tard') ;
39 WHEN WRONG_NUMBER_PLACE THEN DBMS_OUTPUT.PUT_LINE('plus de place') ;
40 END ;
41 /
42 SHOW ERRORS procedure reservation_circuit ;
43
TD1/create.sql
1 @dropTables
2 @tables
3 @data
4
TD1/data.sql
TD1/data.sql
1 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(1,'Amsterdam','Paris','France','Paris','France','01-JAN-2017',66,4,116);
2 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(2,'En Angleterre','Paris','France','Paris','France','01-FEB-2017',55,11,116);
3 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(3,'Voir Londre','Paris','France','Paris','France','01-MAR-2017',54,3,104);
4 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(4,'Encore Amsterdam','Paris','France','Paris','France','01-APR-
2017',52,4,127);
5 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(5,'de Lyon a Venise et retour','Lyon','France','Lyon','France','01-MAY-
2017',59,5,274);
6 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(6,'Paris-Venise-Paris','Paris','France','Paris','France','01-JUN-
2017',70,4,252);
7 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(7,'En Bretagne','Quiberon','France','Hoedic','France','01-JUL-2017',40,7,250);
8 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(8,'Auvergne et Cantal','Clermont Ferrand','France','Besse','France','01-AUG-
2017',30,6,214);
9 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(9,'En Irlande','Shannon','Irlande','Cork','Irlande','01-OCT-2017',19,10,617);
10 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(10,'Dans Paris 6','Paris','France','Paris','France','01-SEP-2017',59,3,570);
11 INSERT INTO Circuit( identifiant, descriptif, villeDepart, paysDepart, villeArrivee, paysArrivee, dateDepart, nbPlace↩
Disponible, duree, prixInscription) VALUES(11,'In Spain','Barcelone','Espagne','Madrid','Espagne','01-NOV-
2017',52,5,200);
12
13 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(1,1,'Canals','Amsterdam','Pays-
Bas','02-JAN-2017',3);
14 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,1,'Tower Bridge','Londres','Roy↩
aume Uni','02-FEB-2017',2);
15 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,1,'Elisabeth Gardens','Siss↩
inghurst','Royaume Uni','04-FEB-2017',2);
16 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,2,'Stonehenge Prehistoric
Spot','Salisbury','Royaume Uni','06-FEB-2017',2);
17 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,3,'Clock Tower','Exeter','Royaume
Uni','08-FEB-2017',1);
18 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,4,'Avon Castle','St Ives','Roy↩
18 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,4,'Avon Castle','St Ives','Roy↩
aume Uni','09-FEB-2017',1);
19 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,5,'Royal Crescent','Bath','Roy↩
aume Uni','10-FEB-2017',1);
20 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(2,6,'Madame Tussau','Londres','Roy↩
aume Uni','11-FEB-2017',1);
21 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(3,2,'British
Museum','Londres','Royaume Uni','01-MAR-2017',2);
22 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(4,1,'Medical
Center','Amsterdam','Pays-Bas','01-APR-2017',4);
23 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(5,1,'Le pont des
Soupirs','Venise','Italie','01-MAY-2017',5);
24 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(6,1,'Le palais des
Doges','Venise','Italie','01-JUN-2017',4);
25 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree)
VALUES(7,1,'Menhir','Quiberon','France','01-JUL-2017',2);
26 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(7,2,'Grotte de
lApothicairerie','Port Cotton','France','03-JUL-2017',2);
27 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(7,3,'Citadelle Vauban','Port
Maria','France','05-JUL-2017',1);
28 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(7,4,'Plage du
Gouret','Houat','France','06-JUL-2017',1);
29 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(7,5,'Fort Louis-
Philippe','Hoedic','France','07-JUL-2017',1);
30 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(8,1,'Etang de
Lachamp','Laschamps','France','01-AUG-2017',2);
31 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(8,2,'Basilique Notre-Dame','Orciv↩
al','France','03-AUG-2017',3);
32 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree)
VALUES(8,3,'Pigeonnier','Besse','France','06-AUG-2017',2);
33 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,1,'Bunratty
Castle','Shannon','Irlande','01-OCT-2017',1);
34 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,2,'Saint
Mary','Dingle','Irlande','02-OCT-2017',3);
35 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,3,'Ross Castle','Killarney','Ir↩
lande','05-OCT-2017',2);
36 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,4,'The Holy Cross','Kenmare','Ir↩
lande','07-OCT-2017',1);
37 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,5,'Glengarriff Forest','Glengar↩
iff','Irlande','08-OCT-2017',3);
iff','Irlande','08-OCT-2017',3);
38 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,6,'Bantry House','Bantry','Ir↩
lande','09-OCT-2017',2);
39 INSERT INTO Etape( identifiant, ordre, nomLieu, ville, pays, dateEtape, duree) VALUES(9,7,'Church of St Anne','Cork','Ir↩
lande','10-OCT-2017',1);
40
41 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Tower Bridge','Londres','Royaume Uni','',5);
42 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Madame Tussau','Londres','Royaume Uni','',5);
43 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('The Tower','Londres','Royaume Uni','',6);
44 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('British Museum','Londres','Royaume Uni','',4);
45 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Loydd Building','Londres','Royaume Uni','',0);
46 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Canals','Amsterdam','Pays-Bas','',9);
47 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Medical Center','Amsterdam','Pays-Bas','',0);
48 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Madurodam','Amsterdam','Pays-Bas','',12);
49 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Plaza San Marco','Venise','Italie','',0);
50 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Reserve ornithologique','Port
Cotton','France','',0);
51 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Grotte de lApothicairerie','Port
Cotton','France','',2);
52 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Citadelle Vauban','Port Maria','France','',0);
53 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Elisabeth Gardens','Sissinghurst','Royaume
Uni','',5);
54 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Stonehenge Prehistoric Spot','Salisbury','Roy↩
aume Uni','',5);
55 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Roman baths','Bath','Royaume Uni','',3);
56 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Piazza San Marco','Venise','Italie','',0);
57 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('La Basilique San Marco','Venise','Italie','',3);
58 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Le palais des Doges','Venise','Italie','',3);
59 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Le pont des Soupirs','Venise','Italie','',15);
60 INSERT INTO LieuAvisiter(nomLieu, ville, pays, descriptif, prix) VALUES('Le grand Canal','Venise','Italie','',4);
61
62 INSERT INTO Client(idClient,nom,prenom,dateNaissance) VALUES(1,'Jacques','Dupond','01-JAN-1970');
63
TD1/dropTables.sql
1 DROP TABLE ReservationLieu ;
2 DROP TABLE Reservation ;
3 DROP TABLE Client ;
4
4
5 DROP TABLE Etape ;
6 DROP TABLE LieuAvisiter ;
7 DROP TABLE Circuit ;
TD1/sup.sql
1
2 ACCEPT nomLieu_g PROMPT 'Lieu ? : '
3 ACCEPT ville_g PROMPT 'Ville ? : '
4 ACCEPT pays_g PROMPT 'Pays ? :'
5
6 variable mess_g varchar2(100) ;
7
8 DECLARE
9 numVisite_v INTEGER;
10 BEGIN
11 SELECT count(*) INTO numVisite_v FROM etape
12 WHERE nomLieu = '&nomLieu_g' AND ville='&ville_g' AND pays='&pays_g';
13
14 IF numVisite_v = 0 THEN
15 DELETE FROM LieuAVisiter
16 WHERE nomLieu = '&nomLieu_g' AND ville='&ville_g' AND pays='&pays_g';
17 ELSE
18 :mes := 'Suppression impossible';
19 END IF;
20 END;
21 /
22
23 print mes;
24
25
TD1/tables.sql
1 CREATE TABLE Circuit(
2 identifiant integer PRIMARY KEY,
3 descriptif varchar2(128) ,
4 villeDepart varchar2(128) NOT NULL,
4 villeDepart varchar2(128) NOT NULL,
5 paysDepart varchar2(128) NOT NULL,
6 villeArrivee varchar2(128) NOT NULL,
7 paysArrivee varchar2(128) NOT NULL,
8 dateDepart date NOT NULL,
9 nbPlaceDisponible integer NOT NULL,
10 duree integer NOT NULL,
11 prixInscription integer NOT NULL,
12 CONSTRAINT ck_nbPlaceDisponible CHECK (nbPlaceDisponible >= 0),
13 CONSTRAINT ck_dureeCircuit CHECK (duree >= 0),
14 CONSTRAINT ck_prixInscription CHECK (prixInscription > 0)
15 ) ;
16
17 CREATE TABLE LieuAvisiter(
18 nomLieu varchar2(128) ,
19 ville varchar2(128) ,
20 pays varchar2(128) ,
21 descriptif varchar2(128) ,
22 prix integer NOT NULL,
23 CONSTRAINT pk_LieuAvisiter PRIMARY KEY(nomLieu, ville, pays),
24 CONSTRAINT ck_prix CHECK (prix >= 0)
25 ) ;
26
27 CREATE TABLE Etape(
28 identifiant integer ,
29 ordre integer ,
30 nomLieu varchar2(128) ,
31 ville varchar2(128) ,
32 pays varchar2(128) ,
33 dateEtape date NOT NULL,
34 duree integer NOT NULL,
35 -- CONSTRAINT pk_etape PRIMARY KEY (identifiant, ordre),
36 -- CONSTRAINT fk_etapeId FOREIGN KEY (identifiant) REFERENCES Circuit,
37 -- CONSTRAINT fk_etapeLieuAVisiter FOREIGN KEY (nomLieu,ville,pays) REFERENCES LieuAvisiter,
38 CONSTRAINT ck_dureeEtape CHECK (duree >= 0)
39 ) ;
40
41 CREATE TABLE Client(
41 CREATE TABLE Client(
42 idClient integer PRIMARY KEY,
43 nom varchar2(64) NOT NULL,
44 prenom varchar2(64) NOT NULL,
45 dateNaissance date NOT NULL
46 ) ;
47
48 CREATE TABLE Reservation(
49 identifiant integer ,
50 idClient integer ,
51 nbPlace integer NOT NULL,
52 dateReserv date DEFAULT SYSDATE NOT NULL,
53 CONSTRAINT pk_Reservation PRIMARY KEY (identifiant, idClient),
54 CONSTRAINT fk_ReservationCircuit FOREIGN KEY (identifiant) REFERENCES Circuit,
55 CONSTRAINT fk_ReservationClient FOREIGN KEY (idClient) REFERENCES Client,
56 CONSTRAINT ck_nbPlaceResa CHECK (nbPlace > 0)
57 ) ;
58
59 CREATE TABLE ReservationLieu(
60 identifiant integer ,
61 idClient integer ,
62 nom varchar2(256) ,
63 ville varchar2(256) ,
64 pays varchar2(256) ,
65 nbPlace integer NOT NULL,
66 CONSTRAINT pk_ReservationLieu PRIMARY KEY (identifiant, idClient, nom, ville, pays),
67 CONSTRAINT fk_ReservationLieuCircuit FOREIGN KEY (identifiant) references Circuit,
68 CONSTRAINT fk_ReservationLieuClient FOREIGN KEY (idClient) references Client,
69 CONSTRAINT fk_ReservationLieuLieuAvisiter FOREIGN KEY (nom, ville, pays) references LieuAvisiter,
70 CONSTRAINT ck_nbPlaceResaLieu CHECK (nbPlace > 0)
71 ) ;
72