Académique Documents
Professionnel Documents
Culture Documents
EXAMEN PRATIQUE
Session : Principale
REMARQ Remarque importante : Enregistrez toutes vos réponses dans un fichier TXT selon
la dénomination suivante : CLASSE_NOM_PRENOM.TXT
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)
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)
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);
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.
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