Vous êtes sur la page 1sur 5

SGBD 2023/2024

TD2. PL/SQL
Exercices 1:

Soit le schéma relationnel de la base de données GESTCOM suivant :

Articles (Refart, Libart, Coulart, Pvart, Paart, Qstock)


Clients (Codeclt, Nomclt, Prenomclt, Cateclt, Adrclt, Cpclt, Villeclt, telclt)
Commandes (Numcom, Datecom, #Codeclt)
LigCom (#Numcom, #Refart, Qtecom)

Travail à faire :
1.
1.1. Créer un bloc PL/SQL qui cherche et affiche le prix de vente le plus élevé de la table Article.
1.2. Vérifier si le prix de vente de l’article, référence 6, est supérieur à la moyenne des prix de vente de tous les
articles.
1.3. Chercher la date de la commande numéro 100, passée par le client numéro clt2.
2.
2.1. Créer un bloc PL/SQL qui détermine les articles qui ont le prix de vente le plus élevé. (Une version avec la
boucle LOOP et une version avec la boucle WHILE).
2.2. Créer un bloc PL/SQL qui réduit de 2% le prix de vente de tous les articles de couleur rouge et afficher le
nombre d’article mis à jour. (Une version avec un curseur implicite et une version avec un curseur for update).

3. Créer un bloc PL/SQL qui retourne la liste des numéros des commandes dans lesquelles la quantité commandée de
l’article 9 est supérieure à 4. (Une version avec la boucle LOOP et une version avec la boucle FOR).

4. Transformer le Bloc PL/SQL de la question 3 en procédure.

5. Transformer le Bloc PL/SQL de la question 1 en fonction.

6. Créer un bloc PL/SQL qui donne la liste des articles les plus chers à l’achat (référence, libellé, prix d’achat). Le bloc
PL/SQL doit faire appel à une fonction qui retourne le prix d’achat le plus cher. Il ne faut pas oublier de traiter les
exceptions.

7. Ecrire une procédure en PL/SQL procnbrCat qui cherche pour chaque catégorie de client le nombre total de clients
et retourne celles qui sont supérieures à 50 clients. Il ne faut pas oublier de traiter les exceptions.

8. Ecrire une procédure procMajpv (valdif Articles.pvart%TYPE, paugt NUMBER(2)) qui cherche les articles dont
la différence entre le prix de vente et le prix d’achat est inferieur ou égale à la variable valdif. Pour les articles
sélectionnés, le prix de vente doit augmenter de (paugt/100). Il ne faut pas oublier de traiter les exceptions.
SET SERVEROUTPUT ON
© O.Lamouchi -1-
SGBD 2023/2024

8.
CREATE OR REPLACE PROCEDURE procMajpv (
valdif IN Articles.pvart%TYPE,
paugt IN NUMBER
) AS
Errrvp EXCEPTION;
BEGIN
UPDTAE Article SET
pvart=pvart*(1+pvart/100)
where pvart-pvachat<valdif;
IF( sql.rowcount=0) then
raise errvp
else
p_message(package.message)
endif
EXCEPTION
whhen err then
p_message (package.).....

© O.Lamouchi -2-
SGBD 2023/2024

Exercice 2:

Soit le schéma relationnel de la base de données GESTAPPART suivant :

Immeuble (idimm, adresse, codep, nbEtages, dateConstr)


Appartement (idapp, numapp, #idOccupant, type, superficie, etage, #idimm)
PropAppart(#idapp, dateAchat, #idpers, datevente, Prixachat)
LocatAppart(#idapp, dateloc, #idpers, datedepart, datedepR, loyer, caution)
Personne (idpers, nom, adrofficielle, codep, dateN, profession, tel)
Travail à faire :
Ecrire les programmes suivants en Pl/SQL sous forme de procédures ou de fonctions:

1. Donner l’adresse et le nom du propriétaire pour les immeubles ayant plus de 5 étages et construits avant 1950.
Procedure p_info_proprio (appart appartement.idapp%TYPE)
- un curseur avec les immeubles ayant plus de 5 étages et construits avant 1950.
- un curseur ou une procedure avec les appartements d’un immeuble donné.

2. Donner la liste des appartements dont la durée de location prévue est dépassé.

3. Donner les noms et adresses des personnes qui ne sont pas propriétaires.
4. Donner la liste des appartements qui se trouvent dans l’immeuble numero 5 du propriétaire numero 18.

© O.Lamouchi -3-
SGBD 2023/2024

Annexe A : BD GESTCOM
******************************* Articles *******************************
CREATE TABLE Articles (refart VARCHAR(7) NOT NULL CONSTRAINT art_refart_pk PRIMARY KEY,
libart VARCHAR(25)NOT NULL,
coulart VARCHAR(10) NOT NULL,
pvart NUMERIC(9,3) NOT NULL,
paart NUMERIC(9,3) NOT NULL,
qstock NUMERIC(6) NOT NULL);
******************************* Clients *******************************
CREATE TABLE Clients (codeclt NUMERIC(7) NOT NULL,
nomclt VARCHAR(25)NOT NULL,
prenomclt VARCHAR(10) NOT NULL,
cateclt VARCHAR(25) NOT NULL CHECK (cateclt IN ('fidele','occasionnel', 'divers')),
adrclt VARCHAR(50),
cpclt NUMERIC(6) NOT NULL,
Villeclt VARCHAR(10) NOT NULL,
telclt NUMERIC(8),
CONSTRAINT clt_codeclt_pk PRIMARY KEY(codeclt));
******************************* Commandes *******************************
CREATE TABLE Commandes( Numcom NUMERIC(7) NOT NULL,
codeclt NUMERIC(7)NOT NULL, datecom DATE NOT NULL,
CONSTRAINT com_numcom_pk PRIMARY KEY(numcom),
CONSTRAINT com_codeclt_fk FOREIGN KEY (codeclt) REFERENCES clients(codeclt));
******************************* LigCom **************************************
CREATE TABLE LigCom (numcom NUMERIC(7) NOT NULL, refart VARCHAR(7) NOT NULL,
qtecom NUMERIC(6) NOT NULL,
CONSTRAINT ligcom_numcom_fk FOREIGN KEY (numcom) REFERENCES commandes (numcom),
CONSTRAINT ligcom_refart_fk FOREIGN KEY (refart) REFERENCES articles(refart),
CONSTRAINT ligcom_id_pk PRIMARY KEY (numcom,refart));

© O.Lamouchi -4-
SGBD 2023/2024

Annexe B : BD GESTAPPART
******************************* Table immeuble *******************************
CREATE TABLE Immeuble (idimm NUMERIC(7) NOT NULL CONSTRAINT imm_id_pk PRIMARY KEY,
adresse VARCHAR(25)NOT NULL,
codep NUMERIC(6)NOT NULL,
nbrEtages NUMERIC(3),
dateConstr DATE NOT NULL);
******************************* Table Personne *******************************
CREATE TABLE Personne (idpers NUMERIC(7) NOT NULL CONSTRAINT pers_id_pk PRIMARY KEY,
nom VARCHAR(25) NOT NULL,
prenom VARCHAR(25) NOT NULL,
adrOfficielle VARCHAR(60)NOT NULL,
codep NUMERIC(6)NOT NULL,
dateN DATE,
profession VARCHAR(10),
tel NUMERIC(8) NOT NULL);
******************************* Table Appartement *******************************
CREATE TABLE Appartement (idapp NUMERIC(7) NOT NULL CONSTRAINT app_id_pk PRIMARY KEY,
numapp NUMERIC(3) NOT NULL,
type VARCHAR(3),
superficie NUMERIC(6,2)NOT NULL,
etage NUMERIC(2) NOT NULL,
idoccupant NUMERIC(7),
idimm NUMERIC(7) NOT NULL,
CONSTRAINT pers_id_fk FOREIGN KEY (idoccupant) REFERENCES personne(idpers),
CONSTRAINT immeuble_id_fk FOREIGN KEY (idimm) REFERENCES Immeuble(idimm));
******************************* Table PropAppart *******************************
CREATE TABLE PropAppart (idapp NUMERIC(7) NOT NULL,
dateAchat DATE NOT NULL,
idpers NUMERIC(7) NOT NULL,
dateVente Date,
PrixAchat NUMERIC(10,3)NOT NULL,
CONSTRAINT appart_id_fk FOREIGN KEY (idapp) REFERENCES Appartement(idapp),
CONSTRAINT perso_id_fk FOREIGN KEY (idpers) REFERENCES personne(idpers),
CONSTRAINT propApp_id_pk PRIMARY KEY (idapp,dateAchat));
******************************* Table LocAppart *******************************
CREATE TABLE LocAppart (idapp NUMERIC(7) NOT NULL,
dateLoc DATE NOT NULL, idpers NUMERIC(7) NOT NULL,
datedepart Date NOT NULL,datedepR Date,
loyer NUMERIC(8,3) NOT NULL, caution NUMERIC(8,3)DEFAULT 0.0,
CONSTRAINT appartl_id_fk FOREIGN KEY (idapp) REFERENCES Appartement(idapp),
CONSTRAINT persl_id_fk FOREIGN KEY (idpers) REFERENCES personne(idpers),
CONSTRAINT locApp_id_pk PRIMARY KEY (idapp,dateLoc));

© O.Lamouchi -5-

Vous aimerez peut-être aussi