Un curseur est une structure de données d'un langage de requête de base de données relationnelle[1], consistant en un pointeur de données permettant d'effectuer des calculs de variables à travers plusieurs enregistrements.
Il introduit un itérateur, qui peut effectuer des opérations, par exemple : ne traiter qu'une ligne sur deux lors de son parcours.
L'utilisation consiste à :
DECLARE
).OPEN
).FETCH
).CLOSE
).Un curseur par défaut traite les données ligne par ligne, mais un curseur scroll[2] n'est pas limité et peut tenir compte des lignes précédentes. En effet ce dernier peut faire appel à des données de façon absolue, à partir du début des enregistrements (FETCH ABSOLUTE
), ou relativement à sa position (FETCH RELATIVE
).
De plus, un curseur peut être SENSITIVE
ou INSENSITIVE
si on veut qu'il puisse modifier les enregistrements qu'il contient, ou pas[3].
Enfin, un curseur peut être déclaré WITH HOLD
pour éviter qu'il ne soit fermé par une transaction informatique[4].
Par ailleurs, un curseur peut être utilisé dans une clause WHERE
avec la syntaxe :
UPDATE table1
SET champ1 = 0
WHERE CURRENT OF curseur1
On utilise la fonction subsequence()
:
let $displayed-sequence := subsequence($result, $start, $item-count)
DELIMITER $$
CREATE PROCEDURE curseur1()
BEGIN
DECLARE resultat varchar(100) DEFAULT "";
DECLARE c1 CURSOR FOR
SELECT page_title
FROM wiki1.wiki1_page
WHERE page_namespace = 0;
OPEN c1;
FETCH c1 INTO resultat;
CLOSE c1;
SELECT resultat;
END;$$
DELIMITER ;
USE Base1
declare @Nom varchar(20)
DECLARE curseur1 CURSOR FOR SELECT Prenom FROM Table1
OPEN curseur1
/* Premier enregistrement de la sélection */
FETCH NEXT FROM curseur1 into @Nom
print 'Salut ' + @Nom
/* Traitement de tous les autres enregistrements dans une boucle */
while @@FETCH_STATUS = 0
begin
FETCH NEXT FROM curseur1 into @Nom
print 'Salut ' + @Nom
end
CLOSE curseur1;
DEALLOCATE curseur1;