Les curseurs sont des zones tampon utilisés pour tout SELECT multiligne.
A chaque ordre SELECT on associe un curseur nommé et on y fait référence dans
la suite du programme pour traiter les lignes les unes après les autres jusqu'à
la fin de la table.
On peut utiliser des types de variables prédéfinis et des attributs de curseur prédéfinis pour faciliter le codage :
types de variables prédéfinis utiles
type prédéfini | Signification | Exemple |
%ROWTYPE | le type enregistrement d'une table | DECLARE ligne fournisseur%ROWTYPE (fournisseur est un nom de table...) |
%TYPE | le type d'une colonne | DECLARE v_nom nom_fournisseur%TYPE (nom_fournisseur est une colonne de la table fournisseur...) |
attributs de curseurs prédéfinis utiles
Attribut | TYPE | Signification |
SQL%NOTFOUND | booléen | renvoie TRUE lorsque l'ordre SQL précédent n'a affecté aucune ligne. |
SQL%ROWCOUNT | entier | renvoie le nombre de lignes traitées par l'ordre SQL précédent. |
SQL%FOUND | booléen | négation logique de SQL%NOTFOUND, donc vrai dès qu'une ligne a été affectée par l'ordre SQL. |
SQL%ISOPEN | booléen | vrai si curseur ouvert |
Les différentes étapes nécessaires sont les suivantes :
- déclaration, où l'on associe, dans la zone de déclaration un curseur avec
un ordre SQL (CURSOR nom_curseur IS ordre_select)
- ouverture du curseur, où l'on analyse l'ordre et l'on identifie les lignes
candidates (OPEN nom_curseur )
- rapatriement des valeurs dans les variables de réception ( FETCH nom_curseur
INTO liste_variables )
- fermeture du curseur, ( CLOSE nom_curseur )
Exemple : SQL> DECLARE nom_fournisseur fournisseur.nom%TYPE; ca_fournisseur fournisseur.ca%TYPE; CURSOR C1 IS SELECT nom,ca FROM fournisseur; BEGIN OPEN C1; LOOP FETCH C1 INTO nom_fournisseur, ca_fournisseur; EXIT WHEN C1%NOTFOUND; dbms_output.put_line( nom_fournisseur||' '||ca_fournisseur); END LOOP; CLOSE C1; END; . SQL> SET SERVEROUTPUT ON SQL> R DiDier 1000 Daredevil 2000 Procedure PL/SQL terminee avec succes. SQL>
|