Vous êtes sur la page 1sur 5

Ministère de l’Enseignement Supérieur et de la Recherche Scientifique

Université de Carthage
Institut Supérieur des Technologies de l’Informations et de la Communication de Borj Cédria

Module d’enseignement Ingénierie des Bases de Données


Niveau Licence Génie Logiciel et Classe LGLSI -2
Système d’Information
TP n° 2
Objectif PL/SQL
Boite à outils logiciels Oracle Express – SQL developer
Elaboré par S.Slama

Nous considérons le schéma relationnel suivant modélisant les activités d’un hôtel.
Client (NumClient, Nom, Prenom, Nationalite)
Chambre (NumChambre , #IdType, Etage, Equipement, Poste_Tel)
Type ( IdType, Nom, Tarif)
Reservation (#NumClient, #NumChambre, DateDebut, DateFin, Nb_Pers)

1. Ecrire un bloc PL/SQL qui permet d’accorder la nationalité tunisienne aux clients du
numéro 1 au numéro 6.
BEGIN
For i in 1..6 Loop
Update Client set Nationalite= 'Tunisienne' where Num_Client= i ;
End loop ;
END ;
/
2. Ecrire une fonction PL/SQL retournant le nombre des chambres qui n’ont pas été
réservés depuis 10 Juin 2022.
Create or replace function NB_CH return number is
N number ;
Begin
Select count(*) into N from chambre
Where NumChambre not in (select distinct NumChambre From Reservation Where
DateFin> '10/06/2022' ) ;
Return N ;
End ;
Exécution de la fonction
declare
nb number;
begin
nb:=NB_CH;
dbms_output.put_line(nb || ‘ chambres non réservés depuis 10 Juin 2022’) ;
end;

1
3. Ecrire une procédure qui affiche les noms des quatre premiers clients qui ont effectué
le plus grand nombre des réservations.
Create or replace procedure Premiers_Res is
Cursor C is
select C.NumClient, C.Nom
From Client C, Reservation R
Where C.NumClient= R.NumClient
Group by C.NumClient, C.Nom
Order by count(*) desc ;
V_Num Client.NumClient%type ;
V_Nom Client.Nom%type ;
Begin
Open C ;
Loop
Fetch C into V_Num, V_Nom ;
Exit when (C%notfound) or(C%rowcount)>4 ;
Dbms_output.put_line(V_Nom) ;
End Loop ;
Close C ;
End ;
Execute Premiers_Res () ;
4. Ecrire une fonction PL/SQL qui permet de savoir si deux clients ont réservé des
chambres de même type.
Create or replace FUNCTION Verification (C1 Client.NumClient%type, C2
Client.NumClient%type) RETURN varchar IS
N1 Type.IdType%type ;
N2 Type.IdType%type ;
Begin
Select C.IdType into N1
From Reservation R , Chambre C
Where R.NumChambre =C.NumChambre and R.NumClient = C1 ;
Select C.IdType into N2
From Reservation R , Chambre C
Where R.NumChambre = C.NumChambre and R.NumClient = C2 ;
If (N1=N2) then
Return 'True' ;
Else
Return 'False' ;
End if ;
End ;
Exécution de la fonction sous SQL Plus
Variable V char(5) ;
Execute :V :=Verification(5,7) ;
Print V ;

2
5. Ecrire le script PL/SQL permettant de :
 prendre en entrée une date d’un jour (saisie utilisateur).
 fournir en sortie l’occupation de l’hôtel pour cette date.
Set serveroutput on
Accept d Prompt 'Donner une date dun jour' ;
Declare
S number ;
Begin
Select sum(Nb_Pers) into S
From Reservation
Where dateDebut= '&d' or dateFin='&d' ;
DBMS_output.put_line('Total : ' || S || ' clients pour la date de ' || '&d') ;
End ;
6. Ecrire le script PL/SQL permettant de :
 prendre en entrée une année (saisie utilisateur).
 fournir en sortie les noms et les nationalités des clients ayant fait une réservatio n
en cette année.
Set serveroutput on
Accept annee Prompt 'Donner une année' ;
Declare
Cursor CL IS
Select C.NumClient from Client C, Reservation R
where C.NumClient= R.NumClient and EXTRACT(YEAR FROM R.DateDebut)=
'&annee'
group by C.NumClient ;
v_NumClient Client.NumClient%type;
v_Nom Client.Nom%type ;
v_Nat Client.Nationalite%type;
Begin
open CL ;
loop
fetch CL into v_NumClient ;
exit when CL%NOTFOUND ;
select Nom, Nationalite into v_Nom, v_Nat
from Client
where NumClient = v_NumClient;
DBMS_output.put_line(‘Nom ’ || v_Nom || ‘ Nationalite : ’ || v_Nat) ;
end loop ;
close CL;
End;
/
7. Définir une procédure PL/SQL permettant d’afficher pour chaque chambre le nom du
client qui a effectué la dernière réservation.
Create or replace procedure Derniere_Res is
Cursor C is

3
Select NumChambre , max(DateDebut) as maxdate
From Reservation
Group by NumChambre ;
v_Nom Client.Nom%type ;
Begin
For i in C loop
Select C.Nom into v_Nom
From Client C, Reservation R
Where C.NumClient= R.NumClient
And R.NumChambre=i.NumChambre
And R.dateDebut=i.maxdate ;
dbms_output.put_line(i.NumChambre || ‘ ‘ || v_Nom) ;
End loop ;
End ;
8. Ecrire un bloc PL/SQL nommé qui affiche les numéros des clients qui ont réservé des
chambres de tous les types. (Afficher un message s’il n’y pas des clients réservant des
chambres de tous les types.)
Create or replace procedure TYPES is
Cursor C is
Select R.NumClient , count(distinct C.IdType) as Nb
From Reservation R, Chambre C
Where R.NumChambre =C.NumChambre
Group by R.NumClient ;
N number ;
Begin
Select count(*) into N from Type ;
For i in C loop
If (i.Nb = N) then
Dbms_output.put_line(i.NumClient) ;
Else
Dbms_output.put_line('Non') ;
End if ;
End loop ;
End ;
9. Définir un tableau dynamique Nb_Reservation qui contiendra le nombre de réservations
par client.
L’indice du tableau est le Num_Client.
Exemple : Nb_Reservation (1)=3 signifie que le joueur ayant NumClient=1 a effectué
3 réservation dans l’hôtel.
 Afficher le nombre d’éléments du tableau.
 Afficher le premier et le dernier indice du tableau.
 A partir du dernier indice du tableau, supprimer tous les éléments du tableau tant
que l’indice est > 4.
 Afficher le nombre d’éléments restants du tableau.

4
set serveroutput on
Declare
TYPE Nb_Reservation IS TABLE OF number
index by binary_integer;
T Nb_Reservation;
Cursor C is
SELECT NumClient , count(*) as Nb
FROM Reservation
GROUP BY NumClient;
Begin
For i in C loop
T(i.NumClient) := i.Nb ;
dbms_output.put_line( 'T(' || i.NumClient ||')=' || i.Nb);
End loop ;
dbms_output.put_line('Le nbre déléments du tableau est:' || T.COUNT);
dbms_output.put_line('Le premier indice du tableau est:' || T.FIRST);
dbms_output.put_line('Le dernier indice du tableau est:' || T.LAST);
T.delete(5, T.LAST);
dbms_output.put_line('Le nombre déléments restants du tableau est : ' || T.count);
End;

Vous aimerez peut-être aussi