Académique Documents
Professionnel Documents
Culture Documents
----------------------------------------------------------------------------------------------------------------------------- ---------------------------
Identifiant secret (réservé à l’administration )
Matière : Ingénierie des BD
Q1 Des objets créés par le noyau du SGBD afin de traiter les CURSEURS IMPLICITES
instructions LMD.
Page1|6
Ne rien écrire ICI
----------------------------------------------------------------------------------------------------------------------------- ---------------------------
Exercice 2 :
Soit la table suivante :
EMPLOYE (Matricule, Nom, Prénom, Ville, Age, Salaire , #Departement).
On considère le bloc PL/SQL suivant :
Questions :
1. À quoi sert ce bloc ? (1pt)
Le but de ce bloc est de calculer et afficher la moyenne des salaires des employés dont l’âge
est entre 30 et 40 ans.
Page2|6
2. À quoi sert la commande %ROWCOUNT (dans la ligne 14 du bloc). (1pt)
Nombre de lignes traitées par le curseur.
Quelles modifications nécessaires afin de changer le curseur en un curseur paramétrable.
(1.5pt)
DECLARE
CURSOR curs1 (AgeMax NUMBER, AgeMin NUMBER) IS
SELECT Salaire FROM emp
WHERE Age <= AgeMax and Age >=AgeMin;
3. Ajouter une exception qui permet de vérifier si aucun résultat renvoyé par le curseur et
afficher un message approprié à l’écran. (2.5pt)
Declare
empty_cursor exception;
BEGIN
…
LOOP
FETCH curs1 INTO salaireEmp;
IF curs1%FOUND THEN
Somme salaires := sommeSalaires + salaireemp ;
ELSE IF curs1%NOTFOUND THEN
RAISE empty_cursor END IF;
END IF;
END LOOP;
EXCEPTION
WHEN empty_cursor THEN
dbms_output.put_line (‘NO DATA FOUND’);
END;
Exercice 3 :
Soit le schéma relationnel suivant :
CLIENT (idClient, Prenom, Nom, Tel, Ville)
PRODUIT (idProduit, Designation, Categorie, Prix)
COMMANDE (idClient#, DateCommande , idProduit#, montant)
Remarques :
– Les clés primaires sont soulignées et les clés étrangères sont précédées par un #.
– Une commande concerne un seul client et un seul produit.
– La catégorie du produit peut être soit MOBILE, INFORMATIQUE, ou
ACCESOIRES.
Page3|6
Questions :
1. Écrire les requêtes SQL permettant de créer les 3 tables CLIENTS, PRODUITS et
COMMANDES et d’insérer les lignes suivantes : (1pt)
CLIENT
IdClient Prenom Nom Tel Ville
120 Mohamed Tounsi 8542114214 TUNIS
PRODUIT
2. (3pt) Ecrire une procédure stockée " proc_insertion_cmd" ayant les paramètres sui-
vants : idC, idP, dateCmd et qte, qui permettant d’insérer une ligne dans la table CO-
MANDE et de retourner le nombre de lignes existant dans la table. Le montant de la
commande est calculé selon la formule suivante : qte * prix du produit.
Cette procédure doit prendre en considération les exceptions suivantes :
– idC représente un identifiant d’un client qui existe dans la table CLIENTS,
– idP représente un identifiant d’un produit qui existe dans la table PRODUITS,
– idC et idP et dateCmd représentent une clé primaire unique dans la table
COMMANDES.
Solution 1:
Create or replace procedure proc_insertion_cmd (idC number, idP varchar2, dateCmd date, qte
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;
Page4|6
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 prix into prixproduit from produits where idproduit=idP;
insert into commandes values(idC , datecmd, idP, qte*prixproduit);
commit;
end if;
select count(*) into nb from commandes;
dbms_output.put_line(‘nombre de commande=’|| nb);
exception
WHEN dup_val_on_index then
dbms_output.put_line(‘commande déjà existante’);
end;
Solution 2:
Create or replace procedure proc_insertion_cmd (idC number, idP varchar2, dateCmd date, qte
number) IS
prixproduit number;
nb number:=0;
Eclient EXCEPTION ;
Eproduit EXCEPTION ;
a number;
b varchar2(5);
BEGIN
select idC into a from Clients where idClient=idC;
if sql%notfound then
raise Eclient;
Page5|6
select prix into prixproduit from produits where idproduit=idP;
insert into commandes values(idC , datecmd, idP, qte*prixproduit);
select count(*) into nb from commandes;
dbms_output.put_line(‘nombre de commande=’|| nb);
EXCEPTION
WHEN Eclient THEN
dbms_output.put_line(‘client inexistant’)
WHEN Eproduit THEN
dbms_output.put_line(‘produit inexistant’);
Page6|6