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.

Laisser un commentaire

Enter the following characters/numbers into the box below, please!
Sample verification