Utilisation des données du curseur
Après l'ouverture d'un curseur, vous pouvez utiliser l'instruction FETCH pour accéder à chacune de ses lignes individuellement. FETCH spécifie quelles données (colonnes obligatoires) récupérer et où les données récupérées sont stockées. Il déplace également le pointeur de ligne interne du curseur vers l'avant afin que l'instruction FETCH suivante récupère la ligne suivante (sans lire la même ligne de manière répétée).
Le premier exemple récupère une seule ligne (la première ligne) du curseur :
Entrée :
create procedure processorders() BEGIN -- declare local variables declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: -- open the cursor open ordernumbers; -- get order number fetch ordernumbers into o; -- close the cursor close ordernumbers; end;
Analyse : où FETCH est utilisé pour récupérer le numéro de commande de les colonnes de la ligne actuelle (qui commenceront automatiquement à la première ligne) dans une variable déclarée localement nommée o. Aucun traitement n'est effectué sur les données récupérées.
Dans l'exemple suivant, les données sont récupérées en boucle, de la première à la dernière ligne :
Entrée :
create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: --declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- open the cursor open ordernumbers; --loop through all rows repeat -- get order number fetch ordernumbers into o; -- end of loop until done end repeat; -- close the cursor close ordernumbers; end;
Analyse : Comme pour le précédent exemple, cet exemple Utilisez FETCH pour récupérer le numéro de commande actuel dans la variable déclarée nommée o. Mais contrairement à l'exemple précédent, le FETCH dans cet exemple se trouve à l'intérieur d'un REPEAT, il est donc exécuté à plusieurs reprises jusqu'à ce que done soit vrai (comme spécifié par UNTILdone END REPEAT;). Pour que cela fonctionne, définissez la variable done avec un DEFAULT 0 (faux, pas fini). Alors, comment done peut-il être défini sur true à la fin ? La réponse est d'utiliser l'instruction suivante :
declare continue handler for sqlstate '02000' set done = 1;
Cette instruction définit un CONTINUE HANDLER, qui est du code qui est exécuté lorsque la condition se produit. Ici, il est indiqué que lorsque SQLSTATE '02000' se produit, SET done=1. SQLSTATE '02000' est une condition introuvable qui se produit lorsque REPEAT ne peut pas continuer car il n'y a plus de lignes à parcourir pour la boucle.
Codes d'erreur MySQL Pour une liste des codes d'erreur MySQL utilisés par MySQL 5, voir http://dev.mysql.com/doc/mysql/en/error-handling.html.
Ordre des déclarations DECLARE Il existe un ordre spécifique dans lequel les déclarations DECLARE sont émises. Les variables locales définies avec l'instruction DECLARE doivent être définies avant la définition d'un curseur ou d'un handle, et les handles doivent être définis après le curseur. Le non-respect de cet ordre produira un message d’erreur.
Si cette procédure stockée est appelée, elle définira plusieurs variables et un CONTINUE HANDLER, définira et ouvrira un curseur, lira à plusieurs reprises toutes les lignes, puis fermera le curseur. Si tout va bien, vous pouvez placer tout traitement nécessaire dans la boucle (après l'instruction FETCH, mais avant la fin de la boucle).
Répéter ou boucler ? En plus de l'instruction REPEAT utilisée ici, MySQL prend également en charge les instructions de boucle, qui peuvent être utilisées pour exécuter du code à plusieurs reprises jusqu'à ce qu'il soit quitté manuellement à l'aide de l'instruction LEAVE. Généralement, la syntaxe de l'instruction REPEAT la rend plus adaptée au bouclage sur les curseurs.
Pour organiser cela, voici une version encore modifiée de notre exemple de procédure stockée de curseur, effectuant cette fois un traitement réel des données récupérées : Entrée :create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; declare t decimal(8,2); -- declare the cursor declare ordernumbers cursor for select order_num from orders; -- declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- create a table to store the results create table if not exists ordertotals (order_num int, total decimal(8,2)); -- open the cursor open ordernumbers; -- loop through all rows repeat -- get order number fetch ordernumbers into o; -- get the total for this order call ordertotal(o,1,t); -- insert order and total into ordertotals insert into ordertotals(order_num,total) values(o,t); -- end of loop until done end repeat; -- close the cursor close ordernumbers; END;
select * from ordertotals;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!