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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Les étapes
  5. Mises en situation
  6. 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 : Dune puis Emma
    • Trois lignes : Dune, Emma puis <NULL>
    • Une seule ligne : Dune
    • Une erreur au troisième FETCH, faute de ligne
    Voir la réponse

    Deux lignes : Dune puis Emma

    Les deux premiers FETCH lisent une ligne. Le troisième n'en trouve plus : FOUND est faux, EXIT WHEN NOT FOUND sort de la boucle avant le RAISE, et aucune erreur n'est levée.

  • 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 … LOOP est 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.