Maison >base de données >tutoriel mysql >MySQL utilisant un exemple de didacticiel de données de curseur

MySQL utilisant un exemple de didacticiel de données de curseur

巴扎黑
巴扎黑original
2017-05-18 14:35:122020parcourir

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;
Analyse : Dans cet exemple, nous avons ajouté une autre variable appelée t (pour stocker le total de chaque commande). Cette procédure stockée crée également une nouvelle table à la volée (si elle n'existe pas déjà) nommée ordertotals . Cette table contiendra les résultats générés par la procédure stockée. FETCH prend chaque order_num comme auparavant, puis utilise CALL pour exécuter une autre procédure stockée (que nous avons créée dans le chapitre précédent) afin de calculer le total taxé pour chaque commande (le résultat est stocké dans t ). Enfin, utilisez INSERT pour enregistrer le numéro de commande et le total de chaque commande.

Cette procédure stockée ne renvoie pas de données, mais elle est capable de créer et de remplir une autre table, qui peut être visualisée avec une simple instruction SELECT :

Entrée :

select * from ordertotals;
Sortie :

MySQL utilisant un exemple de didacticiel de données de curseur

De cette façon, nous obtenons un exemple fonctionnel complet de procédures stockées, de curseurs, de traitement ligne par ligne et de procédures stockées appelant d'autres procédures stockées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn