暂无图片
分享
ktcloud
2019-06-06
mysql5.7 游标疑问

 CREATE PROCEDURE StatisticStore3()
 BEGIN
     declare _n varchar(20);
     declare done int default false;
     declare cur cursor for select name from store group by name;
     declare continue HANDLER for not found set done = true;
     open cur;
     read_loop:loop
     fetch cur into _n;
     if done then
         leave read_loop;
     end if;
     begin
         declare c int;
         declare n varchar(20);
         declare total int default 0;
         declare done int default false;
         declare cur cursor for select name,count from store where name = 'iphone';
         declare continue HANDLER for not found set done = true;
         set total = 0;
         open cur;
         iphone_loop:loop
         fetch cur into n,c;
         if done then
             leave iphone_loop;
         end if;
         set total = total + c;
         end loop;
         close cur;
         select _n,n,total;
     end;
     begin
             declare c int;
             declare n varchar(20);
             declare total int default 0;
             declare done int default false;
             declare cur cursor for select name,count from store where name = 'android';
             declare continue HANDLER for not found set done = true;
             set total = 0;
             open cur;
             android_loop:loop
             fetch cur into n,c;
             if done then
                 leave android_loop;
             end if;
             set total = total + c;
             end loop;
             close cur;
         select _n,n,total;
     end;
     begin
     
     end;
     end loop;
     close cur;
 END;//
mysql> call StatisticStore3()//
+---------+--------+-------+
| _n      | n      | total |
+---------+--------+-------+
| android | iphone |    47 |
+---------+--------+-------+
1 row in set (0.01 sec)

+---------+---------+-------+
| _n      | n       | total |
+---------+---------+-------+
| android | android |    33 |
+---------+---------+-------+
1 row in set (0.01 sec)

+--------+--------+-------+
| _n     | n      | total |
+--------+--------+-------+
| iphone | iphone |    47 |
+--------+--------+-------+
1 row in set (0.01 sec)

+--------+---------+-------+
| _n     | n       | total |
+--------+---------+-------+
| iphone | android |    33 |
+--------+---------+-------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

我想请教一下mysql5.7 ,使用嵌套游标,但是他显示多循环了1次的结果...求解
这是Mysql 5.7.19 版本

最开始的时候我定义了 游标的语句是使用group by name的结果来循环
那正常是不是应显示 android 和 iphone 各一次的结果才是对的呢 

调用时如下结果输出

mysql> select @@tx_isolation//

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)


mysql> call StatisticStore3()//

+---------+--------+-------+

| _n      | n      | total |

+---------+--------+-------+

| android | iphone |    47 |

+---------+--------+-------+

1 row in set (0.01 sec)


+---------+---------+-------+

| _n      | n       | total |

+---------+---------+-------+

| android | android |    33 |

+---------+---------+-------+

1 row in set (0.01 sec)


+--------+--------+-------+

| _n     | n      | total |

+--------+--------+-------+

| iphone | iphone |    47 |

+--------+--------+-------+

1 row in set (0.01 sec)


+--------+---------+-------+

| _n     | n       | total |

+--------+---------+-------+

| iphone | android |    33 |

+--------+---------+-------+

1 row in set (0.01 sec)


Query OK, 0 rows affected (0.01 sec)


收藏
分享
4条回答
默认
最新
Cui Hulong

mysql游标我本人测试的时候也是这样。

因为逻辑是:每当循环的时候 ,要进行数据对象的判断,所以会有现象 多跑一次。

【对于这方面,就看怎么理解,因为有些处理需要执行完最后进行,最后总结的处理】

对于这种情况,需要代码里使用if 之类进行处理。

像轻量级mysql 建议不要用游标,内存的性能消耗非常大。偶尔有些统计的时候用用,还好。

暂无图片 评论
暂无图片 有用 0
ktcloud

mysql游标我本人测试的时候也是这样。

因为逻辑是:每当循环的时候 ,要进行数据对象的判断,所以会有现象 多跑一次。

【对于这方面,就看怎么理解,因为有些处理需要执行完最后进行,最后总结的处理】

对于这种情况,需要代码里使用if 之类进行处理。

像轻量级mysql 建议不要用游标,内存的性能消耗非常大。偶尔有些统计的时候用用,还好。


我有用 if 之类判断跳出循环的,只是感觉好像没生效

暂无图片 评论
暂无图片 有用 0
Cui Hulong

1)提供的存储构成,外层第一个游标 就是每条数据循环,没有把第一层游标返回的值 带到 第二层里使用。纯循环作用。 

所以 第一层 循环2次 ,内层 有2个 游标  总共 得到结果集 4次。


2)是不是实现这样的功能:


DELIMITER $$


CREATE PROCEDURE StatisticStore4()

 BEGIN

     declare _n varchar(20);

     declare done int default false;

     declare cur cursor for select name from store group by name;

     declare continue HANDLER for not found set done = true;

     open cur;

     read_loop:loop

     fetch cur into _n;

     if done then

         leave read_loop;

     end if;


     begin

         declare c int;

         declare n varchar(20);

         declare total int default 0;

         declare done int default false;

         declare cur cursor for select name,count from store where name = _n; ##参数加到这里 

         declare continue HANDLER for not found set done = true;

         set total = 0;

         open cur;

         iphone_loop:loop

         fetch cur into n,c;

         if done then

             leave iphone_loop;

         end if;

         set total = total + c;

         end loop;

         close cur;

         select _n,n,total;

     end;


     end loop;

     close cur;

END $$

DELIMITER ;


暂无图片 评论
暂无图片 有用 0
ktcloud
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏