MYSQL Cursor (Exemples de curseurs)
Les curseurs permettent dans une procédure stockée de récupérer un résultat en SQL qu’il s’agisse d’une valeur ou d’un jeu d’enregistrements. Le post qui suit donne quelques explications et exemples de manipulation des curseurs dans MYSQL.
Le premier cas consiste à vouloir récupérer le résultat d’une requête SQL dans une variable :
# ... déclaration de la procédure
# déclare une variable pour stocker le résultat
DECLARE i_num_cmd INTEGER;
# déclare un curseur pour récupérer le résultat
# (pour rappel toutes les déclarations doivent se situer en début de procédure)
DECLARE c_num_cmd CURSOR FOR
SELECT COUNT(*)
FROM orders
WHERE customers_id=in_id_personne;
# ouvre le curseur et place le résultat dans la variable i_num_cmd
OPEN c_num_cmd;
# place le résultat dans la variable i_num_cmd
FETCH c_num_cmd INTO i_num_cmd;
CLOSE c_num_cmd;
# ... fin de la procédure
Une autre situation typique consiste à vouloir parcourir un jeu de résultats afin de réaliser un traitement. Un petit exemple très simpliste et inutile puisque la fonction qui suit permet de récupérer le nom d’un client dont on a passé en paramètre l’identifiant.
delimiter//
CREATE FUNCTION get_customer_name(in_id_personne INTEGER)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
DECLARE done INT DEFAULT 0;
# déclare les variables qui vont accueillir les données retournées par la requête
DECLARE i_customer_id INTEGER;
DECLARE s_customer_name VARCHAR(255);
# déclare le curseur
DECLARE ccustomers CURSOR FOR SELECT customers_id, customers_firstname
FROM customers;
# déclare un handler pour détecter la fin du jeu d'enregistrements
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
# ouvre le curseur
OPEN ccustomers;
REPEAT
FETCH ccustomers INTO i_customer_id, s_customer_name;
IF i_customer_id = in_id_personne THEN
RETURN s_customer_name;
END IF;
UNTIL done END REPEAT;
END
//
Les curseurs peuvent être très utiles lors de traitements qui nécessite un développement procédural.
