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 ServerDECLARE 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.
ExemplesCLOSE nom_curseur; -- Exemple SQL Server DESALLOCATE nom_curseur; -- Exemple Oracle DESALLOCATE CURSOR nom_curseur;
-- 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; |