TD2 PLSQL
TD2 PLSQL
TD2 PLSQL
2015/2016
TD2. PL/SQL
Exercices 1:
Structure et Donnes des Tables
SQL>desc departements
SQL>desc Commandes
SQL>desc employes
-1-
SGBD
2015/2016
Parmi les dclarations de variables suivantes, dterminer celles qui sont incorrectes :
AB-
DECLARE
v_id NUMBER(4);
DECLARE
v_x,v_y,v_z VARCHAR2(10);
C - DECLARE
v_date_naissance DATE NOT NULL;
DE-
DECLARE
v_en_stock
BOOLEAN := 1;
DECLARE
emp_record
emp_record_type;
F-
DECLARE
TYPE
type_table_nom IS TABLE OF
VARCHAR2(20)
INDEX BY BINARY_INTEGER;
dept_table_nom type_table_nom;
Exercice 2 :
2.1. Crer un bloc PL/SQL qui cherche et affiche le salaire le plus lev.
2.2. Crer un bloc PL/SQL qui dtermine les employs qui ont les plus haut salaires.
Exercices 3 :
Soit le schma relationnel de la base de donnes GESCOM suivant :
Articles (Refart, Libart, Coulart, Pvart, Qstart, Paart)
Clients (Codeclt, Nomclt, Prenonclt, Cateclt, Adrclt, Cpclt, Villeclt)
Commandes (Numcom, Datecom, #Codeclt)
LigCom (#Numcom, #Refart, Qtecom)
Refart :la reference de larticle ; Nomart : le libell de larticle; Coulart :la couleur de larticle ; Pvart, le prix de larticle;
Qstart, la quantit en stock de larticle ; Paart : le prix dachat de larticle.
Codeclt : le code client; Nomclt : le nom du client; Prenonclt : le prnom du client; Cateclt : catgorie du client; adrclt : la rue o
habite le client; Cpclt : le code postal de la ville du client; Villeclt : la ville ou habite le client.
Numcom : le numro de la commande; Datecom : La date de la cration de la commande; Qtecom : La quantit commande pour
un article.
-2-
SGBD
2015/2016
Travail faire :
1. Crer un bloc PL/SQL qui retourne la liste des numros des commandes dans lesquelles la quantit commande de
larticle A200 est suprieure 4.
2. Transformer le Bloc PL/SQL de la question 1 en procdure.
3. Crer un bloc PL/SQL qui retourne le nombre de commandes dans lesquelles la quantit commande de larticle
A200 est suprieure 4.
4. Transformer le Bloc PL/SQL de la question 3 en fonction.
5. Crer un bloc PL/SQL qui donne la liste des articles les moins chers lachat (rfrence, libell, prix dachat). Le
bloc PL/SQL doit faire appel une fonction qui retourne le prix dachat le moins cher.
6. Ecrire une procdure en PL/SQL procnbrCat qui cherche pour chaque catgorie de client le nombre total de clients
et retourne celles qui sont suprieures 50 clients.
7. Ecrire une procdure procMajpv (valdif Articles.pvart%TYPE, paugt NUMBER(2)) qui cherche les produits
dont la diffrence entre le prix de vente et le prix dachat est inferieur ou gale la variable valdif. Pour les produits
slectionns, le prix de vente doit augmenter de (paugt/100).
Exercices 4 :
Soit la table PERSONNEL (Nom, Role) qui rassemble les membres du personnel dun cirque. On souhaite dterminer
la proportion de jongleurs parmi eux.
1. crire un bloc PL/SQL anonyme permettant de :
Compter le nombre de n-uplets dans la table PERSONNEL et stocker le rsultat dans une variable ;
Compter le nombre demploys dont le rle est Jongleur dans la table PERSONNEL et stocker le rsultat
dans une deuxime variable ;
Calculer la proportion (en pourcentage), stocker le rsultat dans une troisime variable et afficher le rsultat
lcran.
2. Inclure dans le programme prcdent un traitement dexception permettant de dtecter si la table PERSONNEL est
vide, cest--dire, que le nombre total de n-uplets dans PERSONNEL est gal zro.
Exercices 5 :
Soit le schma suivant.
AVION (AvNum, AvNom, Capacite, Localisation)
PILOTE (PlNum, PlNom, PlPrenom, Ville, Salaire)
VOL (VolNum, #PlNum, #AvNum, VilleDep, VilleArr, HeureDep, HeureArr)
Les performances des avions de marque Airbus voluent, aussi souhaite t-on faire des mises jour de la table VOL.
Les temps de vol des avions de type A300 (avions n 1 et 4) doivent tre rduits de 10 % et ceux des avions de type
A310 (avions n 2 et 8) de 15 %. Il sagit de dfinir un programme PL/SQL permettant ces modifications.
1. Dans un bloc PL/SQL anonyme, dclarer un curseur permettant de lire les donnes suivantes : numro de vol,
numro davion, heure de dpart et heure darrive des vols pour lesquels lavion utilis est le n 1, 2, 4 ou 8. Pour
chaque vol lu par le curseur, calculer le temps de vol, le rduire dans la proportion voulue selon lavion utilis, puis
mettre jour lattribut HEUREARR de ce vol dans la table VOL.
-3-
SGBD
2015/2016
Exercices 6 :
----------------- Cration des Tables --------------------CREATE TABLE grade(legrade char(10) PRIMARY KEY, nomgrade char(30), hstat number(3));
CREATE TABLE enseignant(noinsee char(10) primary key, nomp char(10), prenomp char(10), legrade char(10)
REFERENCES grade(legrade), ville char(10));
CREATE TABLE type(letype number(2) PRIMARY KEY, nomtype char(10));
CREATE TABLE filiere(codef char(10) PRIMARY KEY, nomf char(30));
CREATE TABLE UNITE(codef char(10) REFERENCES filiere(codef), nunite char(30), coef number(2), PRIMARY
KEY(codef,nunite));
CREATE TABLEservice(noinsee char(10) references enseignant(noinsee), codef char(10), nunite char(30), letype
number(2) REFERENCES type(letype), heures number(3), PRIMARY KEY(noinsee,codef,nunite,letype));
ALTER TABLE service ADD CONSTRAINT fk_service FOREIGN KEY(codef,nunite) REFERENCES
UNITE(codef,nunite);
1. Ecrire une procdure en PL/SQL pour remplacer les horaires statutaires 192h par 200h.
2. Ecrire une procedure en PL/SQL pour rechercher les infos partir d'un grade.
Exercices 7 :
Soit la base de donnes suivante:
Immeuble (adresse, nbEtages, dateConstruction, nomPropritaire)
Appartement (adresse, nappartement, nomOccupant, type, superficie, tage)
Personne (nom, adresse, nappartement, dateArrive, dateDpart, ge, profession)
Ecrire les programmes suivants en Pl/SQL sous forme de procdures ou de fonctions:
a) Donner ladresse et le nom du propritaire pour les immeubles ayant plus de 5 tages et construits avant 1950.
b) Donner le nombre de personnes qui habitant un immeuble dont elles sont propritaires.
c) Donner les noms et adresses des personnes qui ne sont pas propritaires.
d) Donner le nom et la profession des propritaires dimmeubles o il y a des appartements vides.
Exercices 8 :
crire une procdure stocke PL/SQL qui permet de vrifier, avant lajout dune personne dans la base, si les contraintes suivantes
sont vrifies : dateConstruction de lappartement occup dateArrive occupant < dateDpart occupant (la dateDpart peut avoir
la valeur NULL).
Si une contrainte nest pas vrifie, la procdure doit lindiquer par un message spcifique. Si les contraintes sont vrifies, la
personne est ajoute dans la base.
La procdure prendra comme paramtres les attributs de la table Personne correspondant la personne ajouter (nom, adresse,
nappartement, dateArrive, dateDpart, ge, profession).
Remarques :
1. Dautres solutions peuvent tre correctes.
2. Ladresse est cl primaire de Immeuble et ne peut donc prendre plusieurs fois une mme valeur !
3. Un traitement spcifique est prvu seulement pour lexception NO_DATA_FOUND.
-4-
SGBD
2015/2016
Exercices 9 :
Soit la table employer:
-5-
Les dclencheurs sur VUE
Nous mettons la disposition de certains utilisateurs une vue permettant de slectionner les employs qui ont le
job CLERK
SQL> CREATE OR REPLACE VIEW VW_EMP_CLERK AS
2 Select empno "Numro", ename "Nom", deptno "Dept.", sal "Salaire"
3 From EMP
4 Where JOB = 'CLERK';
Vue cre.
SQL> select * from VW_EMP_CLERK ;
Numro Nom
Dept. Salaire
---------- ---------- ---------- ---------7369 SMITH
20
880
7876 ADAMS
20
1210
7900 JAMES
30
1045
7934 MILLER
10
1430
9991 Dupontont
9992 Duboudin
6 ligne(s) slectionne(s).
A travers cette vue, ces utilisateurs peuvent insrer des lignes
SQL> Insert into VW_EMP_CLERK values( 9994, 'Schmoll', 20, 2500 ) ;
Insertion dans la table EMP
1 ligne cre.
Cependant, ils ne peuvent pas voir leurs insertions car la colonne job (inutile dans ce cas) ne fait pas partie de la
vue et donc de l'insertion !
SQL> select * from VW_EMP_CLERK ;
Numro Nom
Dept. Salaire
---------- ---------- ---------- ---------7369 SMITH
20
880
7876 ADAMS
20
1210
7900 JAMES
30
1045
7934 MILLER
10
1430
9991 Dupontont
9992 Duboudin
6 ligne(s) slectionne(s).
4. Crer un dclencheur sur vue qui va rsoudre ce problme
5. Excuter la slection (b)
(a)
SQL> Insert into VW_EMP_CLERK values( 9994, 'Schmoll', 20, 2500 ) ;
Insertion dans la table EMP
1 ligne cre.
(b)
SQL> select * from VW_EMP_CLERK ;
O.Lamouchi
Exercices 10 :
I.
La
modlisation
relationnelle
suivante
reprsente
la
structure
statique
de
la
base
de
donnes
de
la
bibliothque.
ADHERENT(noAdh,nom,
prnom,
adresse,
dateAdh)
CATALOGUE(titre,
nomAut,
prnomAut,
anEd)
FONDS(cote,
#titre)
RESERVATION(#titre,
#noAdh,
dateRes,
dateEmp)
EMPRUNT(#cote,
dateEmp,
#noAdh,
dateRet)
II.
Les
rgles
dintgrit
:
Tous
les
attributs
dun
adhrent
ne
peuvent
prendre
des
valeurs
inconnues.
Tous
les
attributs
dun
catalogue
ne
peuvent
prendre
des
valeurs
inconnues.
Lan
ddition
doit
aprs
1950.
Tous
les
attributs
dun
fonds
ne
peuvent
prendre
des
valeurs
inconnues.
Toute
rservation,
la
date
de
rservation
doit
tre
prcdente
de
celle
demprunt.
Tout
emprunt,
la
date
demprunt
doit
tre
prcdente
de
celle
de
retour.
On
ne
peut
rserver
ou
emprunter
un
titre
quaprs
avoir
adhr
la
bibliothque.
(La
date
dadhrent
est
prcdente
de
celle
de
rservation
ou
demprunt)
Un
emprunt
ne
doit
pas
dpasser
un
mois.
Un
adhrent
ne
peut
emprunter
quau
plus
5
titres
la
fois
et
un
seul
exemplaire
pour
chaque
titre.
Lorsquun
emprunt
est
fait
partir
dune
rservation,
on
enregistre
la
date
demprunt
la
rservation.
(La
date
demprunt
dans
une
rservation
est
claire,
alors
il
existe
un
emprunt
tel
que
la
cote
est
un
exemplaire
du
titre
rserv
et
lemprunteur
est
ladhrent
qui
rserve
ce
titre)
III.
Exemples
dinsertion
des
donnes:
insert
into
ADHERENT
values
('A001','RENAULT','Robert','Lausanne','08/04/01');
insert
into
ADHERENT
values
('A002','VOLVO','Robert','Geneve','01/01/02');
insert
into
ADHERENT
values
('A003','AQUA','Robert','Sion','25/06/01');
insert
into
CATALOGUE
values
('Base
de
donnees','ADIBA','Michel',1995);
insert
into
CATALOGUE
values
('Base
des
objets','COLLAND','Rollet',1990);
insert
into
CATALOGUE
values
('OO
DMBS','ADIBA','Michel',1998);
insert
into
CATALOGUE
values
('ORACLE
SQL','LINDEN','Brian',2000);
insert
into
CATALOGUE
values
('SQL*Plus
reference','LINDEN','Brian',2001);
insert
into
CATALOGUE
values
('Web
Database','BUYENS','Jim',2000);
insert
into
FONDS
values('BDD_01','Base
de
donnees');
insert
into
FONDS
values('BDD_02','Base
de
donnees');
insert
into
FONDS
values('BD0_01','Base
des
objets');
insert
into
FONDS
values('OOMS_01','OO
DMBS');
insert
into
FONDS
values('OOMS_02','OO
DMBS');
insert
into
FONDS
values('ORA.SQL_01','ORACLE
SQL');
insert
into
FONDS
values('SQLP_01','SQL*Plus
reference');
insert
into
FONDS
values('WDB_00','Web
Database');
insert
into
RESERVATION
values('Base
de
donnees','A001','09/04/11,NULL);
insert
into
RESERVATION
values('Base
de
donnees','A002','10/01/12',
NULL);
insert
into
RESERVATION
values('OO
DMBS','A002','02/01/02',NULL);
insert
into
EMPRUNT
values('BDD_02','21/04/11','A001',
'03/05/11');
insert
into
EMPRUNT
values('BDD_01','01/06/12','A001',
NULL);
insert
into
EMPRUNT
values('BD0_01','03/06/12','A001',
NULL);
insert
into
EMPRUNT
values('OOMS_02','03/06/12','A001',
NULL);
insert
into
EMPRUNT
values('ORA.SQL_01','01/06/12','A001',
NULL);
insert
into
EMPRUNT
values('SQLP_01','01/06/12','A001',
NULL);
insert
into
EMPRUNT
values('OOMS_02','05/06/12','A002',
NULL);
O.Lamouchi
insert
into
EMPRUNT
values('OOMS_01','05/01/12','A002',
'10/01/12');
update
RESERVATION
set
dateEmp='21/04/11'
where
titre='Base
de
donnees'
and
noAdh='A001'
and
dateRes='09/04/11';
update
RESERVATION
set
dateEmp='05/01/12'
where
titre='OO
DMBS'
and
noAdh='A002'
and
dateRes='02/01/12';
IV.
Triggers:
Inter-relations
:
ADHERENT,
RESERVATION,
EMPRUNT
ADHERENT
:
1.
Modifier
la
date
dadhsion
(dateAdh)
:
Refuser
la
modification
et
afficher
une
erreur
sil
existe
dj
des
rservations
ou
des
emprunts
de
cet
adhrent
dont
la
date
est
antrieure
la
nouvelle
date.
RESERVATION
:
2.
Crer
une
rservation
:
Si
la
date
de
rservation
(dateRes)
est
antrieure
la
date
dadhsion
(dateAdh),
affecter
dateAdh
dateRes.
EMPRUNT
3.
Crer
un
emprunt
:
Si
la
date
demprunt
(dateEmp)
est
antrieure
la
date
dadhsion
(dateAdh),
affecter
dateAdh
dateRes.
4.
Modifier
le
numro
dadhrent
:
Refuser
la
modification
et
afficher
une
erreur
si
le
nouveau
numro
dadhrent
ne
satisfait
pas
la
rgle.
Intra-relation
(EMPRUNT),
Ensembliste
EMPRUNT
:
5.
Crer
un
emprunt
:
Refuser
cette
insertion
et
afficher
une
erreur
si
le
nombre
des
emprunts
qui
ne
sont
pas
encore
rendus
est
dj
5.
6.
Modifier
la
date
de
retour
:
Refuser
la
modification
et
afficher
une
erreur
si
elle
transgresse
la
rgle.
Inter-relations
(EMPRUNT,
FONDS)
EMPRUNT
:
7.
Crer
un
emprunt
:
Refuser
cette
insertion
et
afficher
une
erreur
si
cet
adhrent
a
emprunt
(pas
encore
rendu)
un
exemplaire
du
mme
titre.
8.
Modifier
la
date
de
retour
:
Refuser
la
modification
et
afficher
une
erreur
si
elle
transgresse
la
rgle.
FONDS
:
9.Modifier
le
titre
:
Refuser
la
modification
et
afficher
une
erreur
sil
existe
dj
des
emprunts
de
cet
exemplaire.
Inter-relations
(FONDS,
RESERVATION,
EMPRUNT)
FONDS
:
10.
Modifier
le
titre
:
Refuser
la
modification
et
afficher
une
erreur
sil
existe
dj
des
emprunts
de
cet
exemplaire.
11.
Supprimer
un
fonds
:
Refuser
la
suppression.
(Cette
opration
est
dj
vrifie
grce
la
cl
trangre)
RESERVATION
:
12.
Crer
une
rservation
:
la
date
demprunt
doit
tre
inconnue
lorsquune
nouvelle
rservation
est
faite
(insre).
13.
Modification
la
date
demprunt
:
refuser
la
modification
et
afficher
une
erreur
si
elle
transgresse
la
rgle.
EMPRUNT
:
14.
Modifier
ladhrent
:
Refuser
la
modification
et
afficher
une
erreur
si
elle
transgresse
la
rgle.
15.
Supprimer
un
emprunt
:
Si
cet
emprunt
concerne
une
rservation,
refuser
la
suppression
et
afficher
une
erreur.
V.
Tester
les
triggers
RI.2.
INSERT
INTO
catalogue
VALUES
('Constraint
database','REVESZ','Peter',
1949);
RI.4.
INSERT
INTO
reservation
VALUES('SQL*Plus
reference','A002','28/06/01','26/06/11');
RI.5.
INSERT
INTO
emprunt
VALUES('SQLP_01','27/05/02','A003','20/05/12');
O.Lamouchi
RI.6.
ADHERENT
:
maj
dateAdh
UPDATE
adherent
SET
dateAdh='10/04/11'
WHERE
noAdh
='A001';
RESERVATION
:
crer
INSERT
INTO
reservation
VALUES('SQL*Plus
reference','A001','08/03/11',NULL);
EMPRUNT
:
crer
INSERT
INTO
emprunt
VALUES('SQLP_01','24/06/11','A003',NULL);
EMPRUNT
:
maj
noAdh
UPDATE
emprunt
SET
noAdh='A003'
WHERE
noAdh='A001'
AND
cote='BDD_02';
RI.7.
INSERT
INTO
emprunt
VALUES('SQLP_01','27/04/12','A003','28/05/12');
RI.8.1.
EMPRUNT
:
crer
INSERT
INTO
emprunt
VALUES('WDB_00','10/06/12',
'A001',
NULL);
EMPRUNT
:
maj
dateRet
UPDATE
emprunt
SET
dateRet=NULL
WHERE
cote='BDD_02'
AND
noAdh='A001';
RI.8.2.
EMPRUNT
:
crer
INSERT
INTO
emprunt
VALUES('OOMS_01','10/06/12',
'A002',
NULL);
EMPRUNT
:
maj
dateRet
UPDATE
emprunt
SET
dateRet=NULL
WHERE
cote='OOMS_01'
AND
noAdh='A002';
FONDS
:
maj
titre
UPDATE
fonds
SET
titre='Base
de
donnees
1'
WHERE
titre='Base
de
donnees';
RI.9.
FONDS
:
maj
titre
UPDATE
fonds
SET
titre='Base
de
donnees
1'
WHERE
titre='Base
de
donnees';
RESERVATION
:
crer
INSERT
INTO
reservation
VALUES('SQL*Plus
reference','A002','28/06/11','30/06/01');
RESERVATION
:
maj
dateEmp
UPDATE
reservation
SET
dateEmp='30/06/11'
WHERE
titre='SQL*Plus
reference'
AND
noAdh='A002';
EMPRUNT
:
maj
noAdh
UPDATE
emprunt
SET
noAdh='A003'
WHERE
cote='OOMS_01'
AND
dateEmp='05/01/12';
EMPRUNT
:
supprimer
DELETE
FROM
emprunt
WHERE
cote='OOMS_01'
AND
dateEmp='05/01/12';
O.Lamouchi