Croix-Rouge Française Aidez.org Hit-Parade des sites francophones
Aidez.org

Un curseur SQL représente une zone de mémoire de la base de données où la dernière instruction SQL est stockée.

Syntaxe sous SQL Server
DECLARE nom_curseur [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR instruction_sélection
[ FOR { READ ONLY | UPDATE [ OF nom_colonne [ ,...n ] ] } ]
Syntaxe sous Oracle
DECLARE CURSOR nom_curseur [(paramètre[, paramètre]...)]
[RETURN return_type] IS instruction_sélection;

Il est également possible de passer des paramètres à un curseur.

-- Exemple Oracle
DECLARE
  employe_nom employe.eNom%TYPE;
  salaire employe.eSalaire%TYPE;
  CURSOR curseur1 (nom VARCHAR2, sal NUMBER) 
      IS SELECT e.eNum, e.eNom, e.ePoste, r.eSalaire 
         FROM employe AS e, remuneration AS r
         WHERE e.eNom = nom AND r.eSalaire = sal;
BEGIN
    OPEN curseur1('DUPONT', 3000);
     LOOP
       FETCH curseur1 INTO @employe, @salaire;
       EXIT WHEN curseur1%NOTFOUND;
    END LOOP;
END;
...

-- Exemple SQL Server
DECLARE @employe_nom VARCHAR(11), @numero INT, @salaire INT

DECLARE curseur1 CURSOR 
  FOR SELECT eNum, eNom FROM employe

OPEN curseur1

FETCH curseur1 INTO @numero, @employe_nom
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH curseur1 INTO @numero, @employe_nom
    DECLARE curseur2 CURSOR 
      FOR SELECT eSalaire, eNom FROM remuneration
          WHERE eNum = @numero

    OPEN curseur2
    FETCH NEXT FROM curseur2 INTO @salaire
    WHILE @@FETCH_STATUS = 0
    BEGIN
      PRINT @numero + ' ' + @employe_nom + ' ' + @salaire
      FETCH NEXT FROM curseur2 INTO @salaire
   END
END
...

Un curseur s'ouvre par l'intermédiaire de la commande OPEN suivi du nom du curseur et de ses éventuels arguments.

OPEN nom_curseur[(liste_arguments...)];

La commande FETCH permet de parcourir un enregistrement du curseur ouvert. L'ensemble des enregistrements d'un curseur peut être parcouru à l'aide d'une structure itérative.

-- Exemple Oracle
LOOP
  FETCH CurseurEmploye INTO sal;
        EXIT WHEN nom_curseur%NOTFOUND;
  i = i + 1;
END LOOP;

-- Exemple SQL Server
FETCH NEXT FROM nom_curseur
  WHILE @@FETCH_STATUS = 0
  BEGIN
  FETCH NEXT FROM nom_curseur;
  END

La fonction SQLServer @@FETCH_STATUS retourne l'état de la dernière instruction FETCH appliquée au curseur en cours d'utilisation. Les valeurs 0, -1 et -2 indiquent respectvement si l'instruction FETCH a réussi ou a échouée et si la ligne recherchée n'a pas été trouvée.

L'attribut Oracle %NOTFOUND retourne FALSE si la dernière instruction FETCH renvoie un enregistrement ou TRUE en cas d'échec.

Suite à la fin de son utilisation, le curseur peut être fermé afin de ne plus consommer de ressources. Il est également possible de désallouer le curseur.

CLOSE nom_curseur;

-- Exemple SQL Server
DESALLOCATE nom_curseur;
-- Exemple Oracle
DESALLOCATE CURSOR nom_curseur;
Exemples
-- Exemple Oracle
DECLARE 
  sal employe.eSalaire%TYPE;
  i INTEGER := 0;
  CURSOR CurseurEmploye 
      IS SELECT eNum, eNom, ePoste, eSalaire FROM employe
        WHERE eSalaire > 1600;
BEGIN
  OPEN CurseurEmploye;
  LOOP
  FETCH CurseurEmploye INTO sal;
        EXIT WHEN CurseurEmploye%NOTFOUND;
      i = i + 1;
  END LOOP;

  CLOSE CurseurEmploye;
  DEALLOCATE CURSOR CurseurEmploye;
END;

-- Exemple SQL Server
DECLARE CURSOR CurseurEmploye FOR
SELECT eNum, eNom, ePoste, eSalaire FROM employe
      WHERE eSalaire > 1600;
BEGIN
  OPEN CurseurEmploye;
END

FETCH NEXT FROM CurseurEmploye
  WHILE @@FETCH_STATUS = 0
  BEGIN
  FETCH NEXT FROM CurseurEmploye;
  END

CLOSE CurseurEmploye;
DEALLOCATE CurseurEmploye;