Vous êtes sur la page 1sur 6

Année : 2022 – 2023

Matière : Ingénierie des bases de données


☒Semestre 1 ☐Semestre 2
Enseignant(es) : Dr. CHERNI I., Dr. DRIDI A., Mr. MESSAOUDI C., Mr. ☒Session principale ☐Session de rattrapage
CHAABOUNI I.
Filière : GL Niveau L2 ☐Devoir surveillé ☒Examen

Nombre de pages : 04 Durée : 1h30

Documents ☐Autorisés ☒Non autorisés


Barème de notation : EX1 : 4pts, EX2 : 6pts, EX3 : 10pts
Calculatrices ☐Autorisées ☒Non autorisées

Nom : …………………………….………… Prénom : ………………………………… Identifiant :…………………………. Salle N° : ……………

Identifiant secret (réservé à l’administration)

----------------------------------------------------------------------------------------------------------------------------- ---------------------------
Identifiant secret (réservé à l’administration )
Matière : Ingénierie des BD

Exercice 1 : (4pts : 0.5*8)


Question Réponse

Q1 Des objets créés par le noyau du SGBD afin de traiter les CURSEURS IMPLICITES
instructions LMD.

Q2 Sur quel type d’instructions, les curseurs explicites SELECT


retournent plus d’une ligne.

Q3 Quelle instruction utilisée pour récupérer les lignes d’un FETCH


curseur ?

Q4 Quelle instruction de contrôle garantit qu'un ensemble LOOP .. EXIT WHEN


d'instructions est exécuté au moins une fois avant la fin
de la boucle.

Q5 Quelle commande est utilisée pour lever une exception RAISE


de manière explicite ?

Q6 Combien de façons y a-t-il de passer les paramètres dans UN SEUL MODE : IN


une fonction PL/SQL, lesquels ?

Q7 Quelle exception est déclenchée lorsqu'un programme DUP_VAL_ON_INDEX


tente de stocker des valeurs en double dans une colonne
défini avec un index unique ?

Q8 Fonctions génériques PL/SQL qui renvoient le numéro SQLERRM


de la dernière erreur rencontrée et son libellé associé. SQLCODE

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

IdProduit Designation Categorie Prix


PC-124 PC Portable Dell INFORMATIQUE 959,000
Vostro 3400

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;

select idP into b from Produits where idProduit=idP;


if sql%notfound then
raise Eproduit;

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’);

WHEN dup_val_on_index then


dbms_output.put_line(‘commande déjà existante’);
END ;
3. Écrire un bloc anonyme permettant d’insérer deux commandes en utilisant la procé-
dure stockée "proc_insertion_cmd". (2pt)
Begin
insertion_cmd(120, ’10-11-2022’, ‘PC-124’, 20) ;
insertion_cmd(130, ’10-11-2022’, ‘PC-124’, 12) ;
End ;
4. Écrire 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. (3pt)
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. Écrire un bloc PL/SQL permettant de majorer de 3% le prix des produits du catégorie


MOBILE. (1pt)
Begin
UPDATE PRODUIT
SET Prix=Prix+(Prix*0.03)
WHERE Catégorie=’MOBILE’ ;
END ;

Page6|6

Vous aimerez peut-être aussi