Vous êtes sur la page 1sur 5

Année Universitaire : 2012-2013

EXAMEN PRATIQUE
Session : Principale

Documents autorisés : OUI


Module : Système de Gestion des Bases de données
Enseignants : MME S.YEKKEN, MME J.HKIMI, M. A.HOSNI Nombre de pages : 2

Date : 04/06/2013 Heure : 11h15


Durée : 1h30
Classes: 3A3, 3A4, 3A7, 3A8, 3A12, 3A18

REMARQ Remarque importante : Enregistrez toutes vos réponses dans un fichier TXT selon
la dénomination suivante : CLASSE_NOM_PRENOM.TXT

Soit le schéma relationnel suivant :

CLIENTS (idClient, prenomClient, nomClient)

PRODUITS (idProduit, nomProduit, categorie, prixProduit)

La catégorie du produit peut être soit ALIMENT, VETEMENT ET ACCESSOIRE ou MEDIA.


Le PRIXPRODUIT est en Dinars
COMMANDES (idClient#, DateCommande , idProduit#, montant)

idClient et idProduit sont des clés étrangères qui font respectivement référence aux relations
CLIENTS et PRODUITS
NB : une commande concerne un seul produit.

Rq : Les clés primaires sont en gras et soulignées et les clés étrangères sont suivies par un #.

1. Ecrire les requêtes SQL permettant de créer les 3 tables CLIENTS, PRODUITS et
COMMANDES et d’insérer les lignes suivantes : (3 PTS)

CLIENTS IDCLIENT NOMCLIENT PRENOMCLIENT


101 Ben Salah Salah
102 Ben Salem Ahmed

PRODUITS IDPRODUIT NOMPRODUIT CATEGORIE PRIXPRODUIT


P01 Produit 1 ALIMENT 14.500
P02 Produit 2 MEDIA 150.000

1/2
2. Ecrire une procédure stockée « proc_insertion_cmd » ayant les paramètres suivants :
idC, idP, dateCmd et qte, et permettant d’insérer une ligne dans la table COMMANDES
et de retourner le nombre de lignes existant dans la table. Le montant de la
commande est calculée selon la formule suivante : qte * prix du produit.
Cette procédure doit prendre en considération les exceptions suivantes :
a. idC représente un identifiant d’un client qui existe dans la table CLIENTS,
b. idP représente un identifiant d’un produit qui existe dans la table PRODUITS,
c. idC et idP et dateCmd représentent une clé primaire unique dans la table
COMMANDES. (4 PTS)
3. Ecrire un bloc anonyme permettant d’insérer deux commandes en utilisant la
procédure stockée « proc_insertion_cmd ». (2 PTS)

COMMANDES IDCLIENT IDPRODUIT DATECOMMANDE QTE


101 P02 To_date(‘04/05/2013’,’dd/mm/yyyy’) 250
102 P02 Aujourd’hui 150

4. Ecrire une fonction stockée « fn_nb_cmd » ayant comme paramètres l’identifiant du


client et une date donnée et permettant de retourner le nombre de commandes
réalisées par ce client à cette date. (2 PTS)
5. Ecrire une procédure stockée ayant comme paramètre l’identifiant d’un client et
permettant d’afficher la liste de ces commandes pour la journée d’hier. La liste doit
inclure les informations suivantes : le nom et la catégorie de chaque produit. Cette
procédure doit prendre en considération les exceptions suivantes : (4 PTS)
a. Vérifier si l’identifiant du client existe dans la table CLIENTS
b. Vérifier si le client a au moins une commande.
6. Ajouter une colonne nommée « DateLivraison » à la table COMMANDES de type date.
Ecrire une requête SQL permettant de mettre à jour cette colonne sachant que la date
de livraison est calculée à partir de la date de commande selon la formule suivante :
DateLivraison = DateCommande + 2 mois. (3 PTS)
7. Ecrire un trigger qui se déclenche après chaque insertion dans la table COMMANDES.
Si la valeur de la colonne « DateLivraison» est NULL lors de son insertion, le trigger la
met à jour selon la formule : DateLivraison = DateCommande + 2 mois (2 PTS)

2/2
Correction :

1.

Create table clients (idclient number primary key, prenomclient varchar2(15), nomclient
varchar2(15));
Create table produits (idproduit varchar2(5) primary key, nomProduit varchar2(15), categorie
varchar2(50), constraint ck_categorie check (UPPER(categorie) IN (‘ALIMENT’, ‘VETEMENT ET
ACCESSOIRE’,’MEDIA’)), prixProduit number );
Create table commandes ( idclient number , idproduit varchar2(5), datecommande date ,
constraint pk_cmd primary key(idclient,idproduit, datecommande), constraint
fk_cmd_patient foreign key(idclient) references clients(idclient), constraint fk_cmd_produit
foreign key(idproduit) references produits(idproduit), prixCommande number);

Insert into clients values (101,’Salah’, ‘Ben Salah’);


Insert into clients values (102,’Ahmed’, ‘Ben Salem’);
Insert into produits values (‘P01’,’Produit 1’,’ALIMENT’,14.500) ;
Insert into produits values (‘P02’,’Produit 2’,’MEDIA’,150.000) ;

2.
create or replace procedure
proc_insertion_cmd (idC number, idP varchar2, dateCmd date, qte in out number)
is
prix number; nb number:=0;
test1 boolean :=true; test2 boolean :=true;
a number; b varchar2(5);
begin
BEGIN
select idC into a from Clients where idClient=idC;
EXCEPTION
WHEN no_data_found THEN dbms_output.put_line(‘client inexistant’); test1:=false;
END;
BEGIN
select idP into b from Produits where idProduit=idP;
EXCEPTION
WHEN no_data_found THEN dbms_output.put_line(‘produit inexistant’); test2:=false;
END;
If(test1 and test2) then
select prixProduit into prix from produits where idproduit=idP;
insert into commandes values(idC,idP, datecmd, qte*prix);
commit;
end if;
select count(*) into nb from commandes;
qte:=nb;
exception
WHEN dup_val_on_index then dbms_output.put_line(‘commande déjà existante’);
end;
/

3/2
3.
Declare
A number;
Begin
A:=250;
proc_insertion_cmd(101,’P02’, To_date(‘03/05/2013’,’dd/mm/yyyy’),A);
dbms_output.put_line(A);
A:=150;
proc_insertion_cmd(102,’P02’,to_date(sysdate,’dd/mm/yyyy’),A);
dbms_output.put_line(A);

End;
/
4.

Create or replace function fn_nb_cmd(idC number, d date)


Return number
Is
Nb number:=0;
Begin
Select count(*) into nb from commandes where idClient=idC and dateCommande=d;
Return nb;
end;
/
5.
Create or replace procedure proc_liste_cmd(idC number)
Is
Test exception; A Boolean :=true; b number; t number :=0;
Begin
Begin
Select idC into b from clients where idclient=idC;
Exception
When no_data_found then dbms_output.put_line(‘client inexistant’); A:=false;
End;
If (A) then
For I in (select nomproduit,categorie from produits P inner join commandes C on
(P.idProduit=C.idProduit) where dateCommande=to_date(sysdate-1,’dd/mm/yyyy’)and
(c.idClient=idC))
Loop
t:=t+1;
Dbms_output.put_line(I.nomProduit||’ ‘||I.categorie);
End loop;
End if;
If (t=0) then raise test; end if;
Exception

4/2
When test then dbms_output.put_line(‘pas de commande’);
End;
/
6.
Alter table commandes add (datelivraison date);
Update commandes C set dateLivraison= add_months(
(select datecommande from commandes where idproduit= C.idproduit and idClient=C.idclient
and datecommande=C.dateCommande),2 );
7.
Create or replace trigger trig_MAJ_DateLivraison
after insert
on commandes
for each row
begin
if :new.datelivraison is null then
update commandes set datelivraison=add_months(datecommande,2) where
idclient=:new.idclient and idproduit=:new.idproduit and
datecommande=:new.datecommande;
end if;
end;
/

5/2

Vous aimerez peut-être aussi