📌 Qu’est-ce qu’un curseur en PL/SQL ?
Un curseur est un mécanisme qui permet de parcourir ligne par ligne le résultat d’un
SELECT dans un programme PL/SQL.
🎯 Pourquoi utilise-t-on un curseur ?
-On utilise un curseur quand une requête retourne plusieurs lignes, et qu’on a besoin de :
-Lire chaque ligne séparément.
-Faire un traitement personnalisé sur chaque ligne (affichage, calcul, insertion,
vérification...).
-Avoir un contrôle précis sur le parcours des résultats.
✅ Quand doit-on utiliser un curseur ?
-Situation Utiliser un curseur ? Pourquoi ?
-La requête retourne plusieurs lignes ✅ Oui Pour les lire une à une.
-Tu dois afficher, traiter ou modifier chaque ligne séparément ✅ Oui Boucle nécessaire.
-Tu veux utiliser %ROWCOUNT, %FOUND, etc. ✅ Oui (curseur explicite) Ces attributs
donnent des infos utiles.
❌ Quand NE PAS utiliser un curseur ?
-Situation Utiliser un curseur ? Pourquoi pas ?
-La requête retourne une seule ligne (ex: SELECT COUNT(*), MAX(...)) ❌ Non SELECT INTO
est suffisant.
-Tu veux juste retourner une valeur simple (ex: nombre, total...) ❌ Non Plus rapide sans
curseur.
-Tu n’as pas besoin de parcourir ligne par ligne ❌ Non Inutile de compliquer le code.
📦 Types de curseurs
-Curseur implicite :
-Quand tu fais FOR i IN (SELECT ...) LOOP → Oracle crée automatiquement un curseur.
Simple à utiliser.
-Curseur explicite :
-Tu déclares le curseur toi-même avec CURSOR nom IS SELECT ...
-Tu peux l’ouvrir, le lire, le fermer manuellement → plus de contrôle.
🧠 Exemple concret
Cas où le curseur est utile :
DECLARE
CURSOR c IS SELECT nom, salaire FROM employes;
BEGIN
FOR i IN c LOOP
dbms_output.put_line(i.nom || ' - ' || i.salaire);
END LOOP;
END;
→ On traite chaque employé individuellement.
Cas où le curseur n’est pas utile :
DECLARE
total NUMBER;
BEGIN
SELECT COUNT(*) INTO total FROM employes;
dbms_output.put_line('Total employés : ' || total);
END;
→ Une seule valeur → pas besoin de curseur.
🎓 Résumé rapide
Cas Curseur ?
Plusieurs lignes à lire/traiter ✅ Oui
Une seule valeur à récupérer ❌ Non
Boucle de traitement ligne par ligne ✅ Oui
Juste une requête simple avec INTO ❌ Non