Les curseurs dans MySQL

Dans ce tutoriel nous allons découvrir comment comment déclarer un curseur dans MySQL.
 

Qu’est-ce qu’un curseur?

Un curseur ne peut pas être utilisé seul dans MySQL. C’est un composant essentiel des procédures stockées. On pourrait traiter un curseur comme un « pointeur » en C/C++ ou comme un itérateur dans une boucle foreach en PHP.
 
 
Avec les curseurs, nous pouvons parcourir des données et manipuler chaque enregistrement pour accomplir certaines tâches.

L’utilisation de curseurs implique plusieurs étapes:

  • Avant qu’un curseur puisse être utilisé, il doit être déclaré. Ce processus ne récupère réellement aucune donnée; il définit simplement l’instruction SELECT à utiliser.
  • Après la déclaration, le curseur doit être ouvert pour être utilisé. Ce processus récupère les données à l’aide de l’instruction SELECT définie précédemment.
  • Maintenant le curseur contient des données, des lignes individuelles peuvent être extraites selon les besoins.
  • Quand c’est fait, le curseur doit être fermé.

 

Créer des curseurs

Les curseurs sont créés à l’aide de l’instruction DECLARE.

DECLARE nomme le curseur et prend une instruction SELECT complète avec WHERE et d’autres clauses si nécessaire. Par exemple, l’instruction suivant définit un curseur nommé client_cursor à l’aide de l’instruction SELECT qui extrait toutes les noms des clients à partir de la table client:

DECLARE client_cursor CURSOR
FOR
SELECT nom FROM clients;

Maintenant que le curseur est défini, il est prêt à être ouvert.
 
 

Ouverture, récupération et fermeture des curseurs

Les curseurs sont ouverts à l’aide de l’instruction OPEN CURSOR, comme ceci:

OPEN client_cursor;

Lorsque l’instruction OPEN est traitée, la requête est exécutée et les données extraites sont stockées dans le curseur.

Ensuite, utilisez l’instruction FETCH pour récupérer la ligne suivante pointée par le curseur et déplacez le curseur sur la ligne suivante dans le jeu de résultats.

FETCH client_cursor INTO my_variables;

Une fois le traitement du curseur terminé, le curseur doit être fermé à l’aide de l’instruction CLOSE, comme suit:

CLOSE client_cursor;

CLOSE libère la mémoire interne et les ressources utilisées par le curseur. Tous les curseurs doivent donc être fermés lorsqu’ils ne sont plus nécessaires.

Une fois qu’un curseur est fermé, il ne peut pas être réutilisé sans être rouvert. Cependant, un curseur n’a pas besoin d’être déclaré à nouveau pour être utilisé; une déclaration OPEN suffit.

Si vous ne fermez pas explicitement un curseur, MySQL le fermera automatiquement lorsque il arrive à l’instruction END.

Lorsque vous travaillez avec des curseurs MySQL, vous devez également déclarer un gestionnaire(handler) NOT FOUND pour gérer la situation où le curseur n’a trouvé aucune ligne.

Parce que chaque fois que vous appelez l’instruction FETCH, le curseur tente de lire la ligne suivante dans le jeu de résultats. Lorsque le curseur atteint la fin du jeu de résultats, il ne pourra pas obtenir les données et une erreur est levée. Le gestionnaire est utilisé pour gérer cette erreur.

Pour déclarer le gestionnaire NOT FOUND, vous utilisez la syntaxe suivante:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

« finished » est une variable pour indiquer que le curseur a atteint la fin du jeu de résultats. Notez que la déclaration du gestionnaire doit apparaître après la déclaration du variable et de curseur dans les procédures stockées.

Le diagramme suivant illustre le fonctionnement du curseur MySQL.
 

 

Exemple complet du curseur:

Étape 1: Ouvrez la base de données et afficher la table.
 

 
 
Étape 2: Créez maintenant le curseur.

DELIMITER $
CREATE PROCEDURE get_list_name (INOUT name_list varchar(800))
BEGIN
	-- déclarer la variable pour le gestionnaire NOT FOUND.
	DECLARE is_done INTEGER DEFAULT 0;

	-- déclarer la variable qui va contenir les noms des clients récupérer par le curseur .
	DECLARE c_name varchar(100)  DEFAULT "";

	-- déclarer le curseur
	DECLARE client_cursor CURSOR FOR
		SELECT nom FROM clients;

	-- déclarer le gestionnaire NOT FOUND
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done = 1;
	
	-- ouvrir le curseur
	OPEN client_cursor;

	-- parcourir la liste des noms des clients et concatèner tous les noms où chaque nom est séparé par un point-virgule(;)
	get_list: LOOP
	FETCH client_cursor INTO c_name;
	IF is_done = 1 THEN
	LEAVE get_list;
	END IF;
	SET name_list = CONCAT(c_name,";",name_list);
	END LOOP get_list;

	-- fermer le curseur
	CLOSE client_cursor;
END$


 
Étape 3: Appelez maintenant le curseur.

DELIMITER ;
SET @name_list ="";
CALL get_list_name(@name_list);
SELECT @name_list;


Questions techniques sur MYSQLQuestions techniques sur MYSQL – Partie 1Nous avons divisé cette collection de questions techniques sur MYSQL sous sept chapitres là, c’est la premiere, puis vous trouverez la deuxième partie, la troisième…Lire plus

Partagez cet article

3 réflexions sur “Les curseurs dans MySQL

  • Avatar
    mai 6, 2020 à 8:26
    Permalien

    Bonjour,

    Dommage l’explication commencait bien, progressivement et d’un coup beaucoup d’instructions, pas d’explication de contaxte ni rien… On balance 100 lignes de code et débrouilles toi.

    Merci pour l’effort quand même.

    Répondre
    • Thomas Clavet
      mai 6, 2020 à 12:25
      Permalien

      Bonjour, et merci pour votre commentaire. Nous avons ajouté des explications ainsi des commentaires dans le code. Si vous avez d’autres remarques n’hésitez pas 🙂

      Répondre
  • Avatar
    mai 10, 2020 à 6:49
    Permalien

    Bonsoir Thomas,

    Merci beaucoup pour votre retour, la modification apporte vraiment une clarté en plus !
    Pardon pour la formulation de mon dernier commentaire qui aujourd’hui à la lecture peut paraître un peu « piquant ».

    Et un bon tuto dans mes favoris en plus,
    merci beaucoup !

    Sam

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *