0% ont trouvé ce document utile (0 vote)
45 vues18 pages

TD1C

Transféré par

Kylian gerard
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
45 vues18 pages

TD1C

Transféré par

Kylian gerard
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi