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
[modifier | modifier le code]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
[modifier | modifier le code]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;
Notes et références
[modifier | modifier le code]- (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).