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;