Les curseurs en PL/SQL
Il existe deux types de curseurs :
Curseurs implicite : c’est un curseur SQL généré et géré par le noyau d’Oracle
pour chaque ordre SQL d’un bloc. Toutes les requêtes SQL sont associées à un
curseur : Un curseur est un pointeur vers un résultat d’une requête. Le curseur
implicite n’est pas déclaré par l’utilisateur.
Curseur explicite : c’est un curseur SQL généré et géré par l’utilisateur pour
traiter un ordre SELECT qui ramène plus d’une ligne.
Curseur explicite : 4 étapes
1. Déclaration du curseur
2. Ouverture du curseur
3. Traitement des lignes
4. Fermeture du curseur
I) Manipulation des curseurs explicite
1. Déclaration du curseur :
Se fait dans la partie DECLARE.
Syntaxe :
DECLARE
CURSOR Nom_Cursseur IS SELECT Attribut1,…….,Attributn
FROM TAble WHERE condition;
…
BEGIN
….
END;
2. Ouverture du curseur :
L’ouverture du curseur lance l’exécution de l’ordre
SELECT associé au curseur. L’ouverture se fait dans la section BEGIN du
bloc.
Syntaxe :
OPEN nom_curseur
Exemple :
DECLARE
CURSOR cur_emp IS SELECT empno, ename, sal FROM EMP WHERE deptno = 10;
BEGIN
OPEN cur_emp;
….
END;
1
3. Traitement de lignes du curseur :
Après l’exécution du SELECT, les lignes ramenées sont traitées une par une, la valeur
de chaque colonne du SELECT doit être stockée dans une variable réceptrice.
Syntaxe:
FETCH Nom_cursseur INTO liste_variables;
Exemple:
DECLARE
CURSOR cur_emp IS SELECT empno,ename, sal FROM EMP WHERE
deptno = 10;
v_empno EMP.emp%type;
v_ename EMP.ename%type;
v_sal EMP.sal%type;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO v_empno, v_ename, v_sal;
DBMS_OUTPUT.PUT_LINE (‘No Emp : ‘||v_empno);
DBMS_OUTPUT.PUT_LINE (‘Nom Emp : ‘||v_ename);
DBMS_OUTPUT.PUT_LINE (‘Sal Emp : ‘||v_sal);
END LOOP;
CLOSE cur_emp; /*partie 4*/
END;
Syntaxe FOR/IN:
Declare
CURSOR c_moncurseur IS SELECT attribut1, attribut2, ... FROM
relations;
BEGIN
FOR c_montuple IN c_moncurseur LOOP
instructions
END LOOP;
END;
Exemple
CURSOR cIntervenants IS SELECT pknom, prenom FROM tIntervenant;
BEGIN
DBMS_OUTPUT.PUT_LINE('** Liste des intervenants **');
FOR i IN cIntervenants LOOP
DBMS_OUTPUT.PUT_LINE('-' || INITCAP(TRIM(i.prenom)) || ' ' ||
INITCAP(TRIM(i.pknom)));
END LOOP;
END;
2
4. Fermeture du curseur :
Il est important de fermer le curseur une fois qu’on en a plus besoin, cela permet de
libérer la mémoire occupée par ce dernier.
Syntaxe :
CLOSE nom_curseur; /* voir l’exemple précédent*/
II) Attributs des curseurs
Tous les curseurs ont des attributs que l’utilisateur peut utiliser :
%ROWCOUNT : Nombre de lignes traitées par le curseur.
%FOUND : Vrai si au moins une ligne a été traitée par la requête ou le dernier fetch.
%NOTFOUND : Vrai si aucune ligne n’a été traitée par la requête ou le dernier fetch.
%ISOPEN : Vrai si le curseur est ouvert (utile seulement pour les curseurs explicites)
III) Curseurs paramétrés
Un curseur paramétré peut servir plusieurs fois avec des valeurs des paramètres
différentes. On doit fermer le curseur entre chaque utilisation de paramètres différents
si on n’utilise pas la boucle FOR dédiée.
Exemple
DECLARE
CURSOR c ( p_dep EMP. dep%TYPE) IS SELECT dep , nom FROM emp
WHERE dep = p_dep ;
BEGIN
FOR v_employe IN c ( 1 )
LOOP
DBMS_output .put_Line ( ’ Dep␣1␣ : ␣ ’ | | v_employe . nom ) ;
END LOOP;
FOR v_employe IN c ( 2 )
LOOP
DBMS_output . put_Line ( ’ Dep␣2␣ : ␣ ’ | | v_employe . nom ) ;
END LOOP;
END;