Curseur (base de données)
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.
Principe
    
L'utilisation consiste à :
- Déclarer le curseur définissant le jeu d'enregistrement (DECLARE).
- Ouvrir le curseur pour établir le jeu d'enregistrement (OPEN).
- Récupérer les données des variables locales (FETCH).
- Fermer le curseur (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
Exemples
    
    XQuery
    
On utilise la fonction subsequence() :
let $displayed-sequence := subsequence($result, $start, $item-count)
MySQL
    
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 ;
MsSQL
    
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;
Notes et références
    
- (en) Zohra Bellahsène, Database and XML Technologies: First International XML Database Symposium, XSYM 2003, Berlin, Germany, September 8, 2003, Proceedings, Springer Science & Business Media, (lire en ligne)
- Kevin Kline, SQL en concentré, O'Reilly Media, Inc., (lire en ligne)
- Frédéric Brouard, Rudi Bruchez et Christian Soutou, SQL, Pearson Education France, (lire en ligne)
- (en) Kevin Gashyna et Michael Kyprianou, DB2 Universal Database V.8 Application Development Certification Guide, Prentice Hall Professional, (lire en ligne)
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Cursor (databases) » (voir la liste des auteurs).
Voir aussi
    
- Portail des bases de données
