Les curseurs
Le curseur explicite et son cycle (déclarer, ouvrir, lire une ligne, tester la fin, fermer), la boucle FOR sur une requête, le curseur à paramètres, la ligne courante et le traitement ligne à ligne face au traitement ensembliste.
- 32 cartes
- 6 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Les étapes
- Mises en situation
- Comprendre
Quelques cartes du deck
Curseur explicite : de quoi s'agit-il ?
Voir la réponse
Objet que le programme déclare lui-même pour une requête qui rend plusieurs lignes, et qu'il pilote ligne par ligne : ouvrir, lire, fermer.
Une variable ordinaire ne contient qu'une ligne. Le curseur garde la position dans le résultat et avance à chaque lecture.
La table livre contient deux lignes, 'Dune' puis 'Emma' (ordre d'id). Que montre ce bloc ?
```sql
DO $$
DECLARE
c CURSOR FOR SELECT titre FROM livre ORDER BY id;
v_titre text;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_titre;
EXIT WHEN NOT FOUND;
RAISE NOTICE '%', v_titre;
END LOOP;
CLOSE c;
END $$;`- Deux lignes :
DunepuisEmma - Trois lignes :
Dune,Emmapuis<NULL> - Une seule ligne :
Dune - Une erreur au troisième FETCH, faute de ligne
Voir la réponse
Deux lignes :
DunepuisEmmaLes deux premiers FETCH lisent une ligne. Le troisième n'en trouve plus : FOUND est faux,
EXIT WHEN NOT FOUNDsort de la boucle avant le RAISE, et aucune erreur n'est levée.- Deux lignes :
Un curseur explicite se …, s'… avec OPEN, se lit avec … et se ferme avec CLOSE.
Voir la réponse
Un curseur explicite se déclare, s'ouvre avec OPEN, se lit avec FETCH et se ferme avec CLOSE.
La requête du curseur ne s'exécute qu'à l'ouverture. Oublier CLOSE garde les ressources jusqu'à la fin de la transaction, et un second OPEN du même curseur échoue.
Curseur implicite : de quoi s'agit-il ?
Voir la réponse
Curseur que le moteur ouvre et ferme seul pour un ordre SQL ou une boucle FOR sur une requête, sans que le code le déclare.
FOR r IN SELECT … LOOPest la forme courte : elle fait OPEN, FETCH, le test de fin et CLOSE à la place du programmeur.Parcourir un résultat avec un curseur explicite : quelle étape vient après « Déclarer le curseur et sa requête dans DECLARE » ?
- FETCH c INTO : lire la ligne suivante
- OPEN c : la requête s'exécute
- EXIT WHEN NOT FOUND : sortir s'il n'y a plus de ligne
- Traiter la ligne lue, puis revenir au FETCH
Voir la réponse
OPEN c : la requête s'exécute
Le test de fin suit immédiatement le FETCH, avant le traitement ; le CLOSE vient après la sortie de boucle. Le curseur ne peut être lu qu'une fois ouvert.