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 ServerSyntaxe sous OracleDECLARE nom_curseur [ INSENSITIVE ] [ SCROLL ] CURSOR FOR instruction_sélection [ FOR { READ ONLY | UPDATE [ OF nom_colonne [ ,...n ] ] } ]
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; |