les curseurs en pl/sql
Un des plus grandes forces du langage pl/sql, c’est bien les curseurs. En effet il permet de récupérer et de traiter le données de la base d’oracle ligne par ligne.
Les types de curseurs
· Le curseur explicite
Le curseur explicite est géré pas l’utilisateur (sur un SELECT).
· Le curseur implicite
Le curseur implicite est généré et géré par le noyau.
l’utilisation du curseur pl/sql
On peut diviser le vie d’un curseur en 4 parties
- déclaration (DECLARE)
- ouverture (OPEN)
- utilisation (FETCH)
- fermeture (CLOSE)
Déclaration d’un curseur
CURSOR nom_curseur IS ordre_select
Exemple:
DECLARE CURSOR cUtilisateur IS SELECT NOM, PRENOM FROM UTILISATEUR;
Ouverture d’un curseur
OPEN nom_curseur
L’ouverture du curseur engendre l’exécution de la requête.
Il faut savoir aussi que le curseur se place automatiquement à la première ligne du tableau.

exemple-curseur-pl-sql
Dans cet illustration on voit que le curseur est positionné dans le premier enregistrement qui est « dupond jean ».
Voici comment on ouvre un curseur en pl/sql :
DECLARE CURSOR cUtilisateur IS SELECT NOM, PRENOM FROM UTILISATEUR; BEGIN OPEN cUtilisateur; ... CLOSE cUtilisateur; END; /
Fetch
La commande Fetch permet de lire la ligne en cours (la ligne ou est positionné le curseur).
Après la lecture de la ligne, il positionne automatiquement le curseur à la ligne suivante.
Attention, si le curseur est en fin de tableau, la commande Fetch ne quitte pas automatiquement le tableau,
il reste « bloqué » sur le dernier enregistrement.
Voici la syntaxe :
Pour parcourir un tableau il faut ainsi utiliser une boucle sur la commande fetch
FETCH nom_curseur INTO ligne_tableau;
ligne_tableau doit être une variable dynamique à partir du curseur:
voici la syntaxe :
ligne_tableau nom_curseur%ROWTYPE;
DECLARE CURSOR cUtilisateur IS SELECT NOM, PRENOM FROM UTILISATEUR; lUtilisateur cUtilisateur%ROWTYPE; BEGIN OPEN cUtilisateur; LOOP FETCH cUtilisateur INTO lUtilisateur; EXIT WHEN cUtilisateur%NOTFOUND; DBMS_OUTPUT.PUT_LINE( lUtilisateur.NAME ) ; END LOOP; CLOSE cUtilisateur; END; /
Attributs
On peux vérifier l’état d’un curseur grasse à ces attributs :
%FOUND
vérifie si le fetch renvoi bien une ligne
%NOTFOUND
vérifie si le fetch ne renvoi aucune une ligne
%ROWCOUNT
compte le nombre de ligne que le curseur à lu
%ISOPEN
vérifie si le curseur est ouvert


(12 votes, moyenne: 4,25 max : 5)
juin 2nd, 2010 at 17 h 30 min
Bonjour,
Votre tutoriel est super.
Une seule remarque :
faudrait’il faire
DBMS_OUTPUT.PUT_LINE( lUtilisateur.NOM ) ;
au lieu de
DBMS_OUTPUT.PUT_LINE( lUtilisateur.NAME ) ;
Je suppose que cette une faute de frappe (rien de méchant)
Cordialment.
juillet 16th, 2010 at 13 h 04 min
Salut,
Je viens juste de trouver la solution a mon probleme.
Il est magnifique ce tutorielle.
Suis debutant en PL/SQL
mai 4th, 2011 at 8 h 39 min
Très bon tutoriel, facile à comprendre pour les débutant
mai 13th, 2011 at 14 h 04 min
Bjr,
J’ai un petit souci, je veux utiliser un curseur pour inserer les données d’une table ‘tab1′ dans une autre table ‘tab2′ vide de même structure que la première en ne prenant qu’une seule fois les personnes en double.
exemple de table
matricule Nom Prenom Telephone mail
0001 Yao Koffi 01050214 yaokoff@yyy
0002 Yao Koffi 08254789 koffyao@yyy
0003 Abib Honore 45123642 abibhono@ppp
0004 Kata Serge 78451201 kata@kkkk
mai 23rd, 2011 at 20 h 43 min
j’ai trouvé vtr resume de cours e superrrrrrrrr
février 1st, 2012 at 17 h 12 min
Vraiment bien fait. Facile à comprendre pour les néophytes, merci!