Il vaut d'ailleurs mieux éviter tout UPDATE sur une table sur laquelle un curseur est ouvert, même sans faire de référence à celuici. Le résultat d'un tel UPDATE serait imprévisible.
Ces restrictions sur les requêtes UPDATE sont bien entendu également valables pour les suppressions (DELETE).
Parcourir intelligemment tous les résultats d'un curseur
Pour récupérer une ligne de résultats, on utilise donc FETCH. Dans la procédure parcours_deux_clients(), on voulait récupérer
les deux premières lignes, on a donc utilisé deux FETCH.
Cependant, la plupart du temps, on ne veut pas seulement utiliser les deux premières lignes, mais toutes ! Or, sauf exception, on
ne sait pas combien de lignes seront sélectionnées.
On veut donc parcourir une à une les lignes de résultats, et leur appliquer un traitement, sans savoir à l'avance combien de fois
ce traitement devra être répété.
Pour cela, on utilise une boucle ! WHILE, REPEAT ou LOOP. Il n'y a plus qu'à trouver une condition pour arrêter la boucle une
fois tous les résultats parcourus.
Condition d'arrêt
Voyons ce qui se passe lorsque l'on fait un FETCH alors qu'il n'y a plus, ou pas, de résultats.
Voici une procédure qui sélectionne les clients selon une ville donnée en paramètre. Les lignes sont récupérées et affichées grâce
au FETCH, placé dans une boucle LOOP. Je rappelle que cette boucle ne définit pas de condition d'arrêt : il est nécessaire
d'ajouter une instruction LEAVE pour l'arrêter. Ici, pour tester, on ne mettra pas d'instruction LEAVE.
Code : SQL
DELIMITER |
CREATE PROCEDURE test_condition(IN p_ville VARCHAR(100))
BEGIN
DECLARE v_nom, v_prenom VARCHAR(100);
DECLARE curs_clients CURSOR
FOR SELECT nom, prenom
FROM Client
WHERE ville = p_ville;
OPEN curs_clients;
LOOP
FETCH curs_clients INTO v_nom, v_prenom;
SELECT CONCAT(v_prenom, ' ', v_nom) AS 'Client';
END LOOP;
CLOSE curs_clients;
END|
DELIMITER ;
Voyons donc ce que ça donne pour une ville dans laquelle quelques clients habitent.
Code : SQL
CALL test_condition('Houtsiplou');
Client
Jean Dupont
Client
Partie 5 : Sécuriser et automatiser ses actions
303/414
www.openclassrooms.com
Précédent

- 303/413

Suivant