Vous êtes sur la page 1sur 5

TP2 SGBD : Les curseurs en PL/SQL

Objectifs :

L’objectif de ce TP est de maitriser les curseurs en PL/SQL. A la fin de ce TP, l’étudiant sera
capable de :

 Comprendre le concept des curseurs,


 Gérer et utiliser les curseurs implicites,
 Définir, parcourir et exploiter les curseurs explicites en PL/SQL,
 Utiliser les attributs associés aux curseurs.

I. Rappel:

Il existe deux types de curseur :

 Curseurs implicites : les curseurs implicites sont créés et gérés par le serveur Oracle.
Vous n'y avez pas accès. Le serveur Oracle crée un tel curseur lorsqu'il doit exécuter
une instruction SQL LMD:

• Une instruction Select retournant une seule ligne


• Une instruction Insert, Update, Delete

 Curseurs explicites : Ils sont créés et gérés par l'utilisateur pour traiter un ordre Select
qui ramène plusieurs lignes. Le traitement du select se fera ligne par ligne.

Les étapes d'utilisation d'un curseur explicite:

1. Déclaration du curseur
2. Ouverture du curseur
3. Traitement des lignes
4. Fermeture du curseur.

1
TP2 SGBD : Les curseurs en PL/SQL

 La déclaration d'un curseur: Le curseur se définit dans la partie DECALRE d'un bloc PL/SQL.

Cursor nomcurseur [(nompararn type [,nomparam type, .. )] IS Commande_SELECT

 L'ouverture et la fermeture d’un curseur :

OPEN nomcurseur [(nomparam1[,nomparam2 , . .)]


/* traitement des lignes */
CLOSE nomcurseur

 Le traitement des lignes :

Dans la partie traitement du bloc PL/QLl, il faut commencer par ouvrir le curseur puis:

FETCH nomcurseur INTO nomvariable |nomrecord

L’ordre fetch ne ramène qu’une seule ligne à la fois. De ce fait il faut recommencer l’ordre fetch pour
traiter la ligne suivante.

 Les attributs de curseur:

Exemple: Ecrire un bloc PL/SQL permettant d'afficher les noms et les salaires des employés
travaillant dans le département n°10

2
TP2 SGBD : Les curseurs en PL/SQL

Declare

Cursor DEPT_10 is select nome, salaire from emp where deptno =10;

Vnom emp.nome%TYPE ;

Vsalaire emp.salaire%TYPE ;

Begin

OPEN DEPT_10;

LOOP

FETCH DEPT_10 into vnom, vsalaire ;

EXIT WHEN DEPT_10%NOTFOUND;

Dbms_output.put_line('nom : '|| vnom || 'salaire: ' || vsalaire);

END LOOP ;

CLOSE DEPT_10;

End;

II. Exercices :

On utilisera la base de données suivante:

DEPT(NumDept : number(4), NomDept : varchar2(15), Lieu : varchar2(15))

EMP(Matr : number(4), NomE : varchar2(15), Poste : varchar2(15), DatEmb : Date, Salaire :


float, Commission : number(4), #NumDept : number(4))

Exercice 1 : Les curseurs implicites

1) Ecrire un bloc PL/SQL anonyme permettant d'afficher le nombre total des employés de la
société. Afficher également la proportion des manager dans le total des employés. L'affichage se
fera comme suit:

3
TP2 SGBD : Les curseurs en PL/SQL
Le nombre total des employés est 50 dont 4 sont des manager ce qui présente une proportion de
12.5%

Prévoir les exceptions possibles (Zero_Divide)

2) Ecrire un bloc PL/SQL anonyme permettant de supprimer tous les départements de 'Sousse'.
Dans le cas où il n'y a aucun département à 'Sousse', afficher 'Aucun département à la ville de
Sousse' sinon afficher le nombre de département supprimés.

3) Créer une nouvelle table Historique_MAJ permettant de stocker l'historique des mises à jour
faites sur la table Dept:

Historique_MAJ( Num_dept : number, Date_MAJ : Date, nbr_enreg : number,)

- Ecrire un bloc PL/SQL anonyme permettant de mettre à jour les salaires des employés du
département n°20 et qui utilise le dernier curseur implicite pour afficher le nombre
d'enregistrements mis à jour. Le message 'Aucune mise à jour' sera affiché si aucune ligne n'est
mise à jour.
- Insérer dans la table Historique_MAJ le nombre d'enregistrement mis à jour dans la question
précédente. Si l'insertion a échoué, afficher le message 'Insertion impossible'.

4) Ecrire un bloc PL/SQL anonyme permettant d'afficher le salaire de l'employé 'Ben Sassi'. Si
l'employé n'existe pas, Afficher le message : Ben Sassi n'est pas un employé de la société.

Exercice 2 : Les curseurs explicites

1) Ecrire un bloc PL/SQL permettant d'afficher les Noms et les postes de tous les employés
travaillant aux départements situés à 'Tunis' ou 'Ben Arous'.

2) Ecrire un bloc PL/SQL anonyme permettant d’afficher les informations des trois qui employés
ayant les salaires les plus élevés. L'affichage se fera comme suit :

Ayari – PDG – Récruté le : 12/05/2014 – touche 2500 dinars.

3) Ecrire un bloc PL/SQL permettant d'afficher pour chaque département, le nombre total
d’employés, le salaire le plus bas et le salaire le plus élevé. L'affichage se fera comme suit:

Département Ressources humaines – 54 Employés – Salaire max : 5200 – salaire min : 650

4
TP2 SGBD : Les curseurs en PL/SQL
Département Informatique -- 60 Employé – Salaire max : 6250 – salaire min : 850..

4) Ecrire un bloc PL/SQL permettant d'afficher les noms, les postes et les salaires des employés du
département n°10.

 Modifier ce bloc en utilisant un curseur paramétré avec comme paramètre le numéro


du département.
 On souhaite éditer la liste des employés de chaque département de la manière suivante :

Département (Informatique)

Matricule Nom

12 Ben Sassi
……… ……

Département (Financier)

Matricule Nom

15 Ben Yahya
……… ……

Les départements doivent être triés par ordre Croissant de numdept. Les employés d’un même
département seront triés par ordre croissant de matr.

Exercice 3 : Les curseurs explicites

On considère la base de données suivante :

COMPETITION(CODC, NOMC)

PARTICIPANT(NO_PART, NOM_PART, DATENAISSANCE, ADRESSE, EMAIL)

SCORE(#NO_PAR,#CODEC, NO_JUGE, NOTE)

1) Écrire un bloc PLSQL qui lit à la console le nom d'une compétition et qui affiche les participants
avec leur score total (la somme de tous les scores par tous les juges). Utilisez un curseur
paramétré.
5

Vous aimerez peut-être aussi