当前位置: 首页 > news >正文

怎样做一元购网站广告网站建设与制作公司

怎样做一元购网站,广告网站建设与制作公司,关于做网站建设公司你应该知道的,wordpress变404深刻理解MySQL8游标处理中not found 最近使用MySQL的游标,在fetch循环过程中,程序总是提前退出 ,百思不得其解,经过测试,原来是对于游标处理中not found的定义理解有误,默认是视同Oracle的游标not found定…

深刻理解MySQL8游标处理中not found

最近使用MySQL的游标,在fetch循环过程中,程序总是提前退出 ,百思不得其解,经过测试,原来是对于游标处理中not found的定义理解有误,默认是视同Oracle的游标not found定义,结果思考测试了两天,终于走出了思维定式。

1. 问题描述

MySQL版本,8.0.16 。

存储过程如下:

CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_nofound_cursor`()
begindeclare v_done int default 1 ;declare v_name varchar(10);declare v_date date;declare v_string text;declare v_for_nofound varchar(10);declare v_counter int default 0;declare cur_stud1 cursor for select t.name ,t.birthday from tb_student t where t.grade >= 70 and t.grade < 80 order by t.grade desc limit 3;declare continue handler for not found set v_done = 0;#使用游标前打开游标open cur_stud1 ;set v_string = '';cur_loop: loopfetch next from cur_stud1 into v_name ,v_date;set v_counter = v_counter + 1;if v_done = 0 then leave cur_loop;end if;-- 此查询无结果,是空。	select t.name  into v_for_nofound 	from tb_student t where t.grade >= 101  order by t.grade desc limit 1;set v_string = concat(v_string,' stud1:',v_name , ' :',v_date);end loop cur_loop;close cur_stud1 ;select v_string;select v_counter;end

游标记录是3条记录,但是查询结果,只反馈一条记录值。
游标理解应该循环3次!!!,但是只返回了一条记录。
为什么 ???

结果如下:

mysql> call pro_test_nofound_cursor();
+-------------------------------+
| v_string                      |
+-------------------------------+
|  stud1:CJXBCEXCOF :2023-09-18 |
+-------------------------------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> call pro_test_nofound_cursor();
+-------------------------------+
| v_string                      |
+-------------------------------+
|  stud1:CJXBCEXCOF :2023-09-18 |
+-------------------------------+
1 row in set (0.00 sec)+-----------+
| v_counter |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)

结果说明:
记录返回:只有1条
计数器:是2

2. 问题分析

MySQL文档:
MySQL定义not found的说明

NOT FOUND: Shorthand for the class of SQLSTATE values that begin with ‘02’. This is relevant within the context of cursors and is used to control what happens when a cursor reaches the end of a data set. If no more rows are available, a No Data condition occurs with SQLSTATE value ‘02000’. To detect this condition, you can set up a handler for it or for a NOT FOUND condition.

DECLARE CONTINUE HANDLER FOR NOT FOUND   BEGIN-- body of handler   END; 

For another example, see Section 13.6.6, “Cursors”. The NOT FOUND condition also occurs for SELECT … INTO var_list statements that retrieve no rows.

说明:
SQLSTATE value ‘02000’ 和 NOT FOUND 是等价的,那么NOT FOUND 就不是cursor所专属的状态值。因此在循环中,如果出现了查询没有结果的情况,那么将直接 触发v_done = 0 ,并非cursor的fetch 触发的结果。

注意:与Oracle游标访问的notfound状态值是不同的,oracle是专用于cursor,而MySQL是notfound状态是所有SQL共用的!!!

惯性思维,困扰了两天。

declare continue handler for not found set v_done = 0;

3. 问题解决

在游标循环中最后增加一行,强制设置为1 ;

set v_done = 1;

程序只有在fetch的时候,产生的v_done状态,才能触发退出循环。
修改后的程序如下:

CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_nofound_cursor`()
begindeclare v_done int default 1 ;declare v_name varchar(10);declare v_date date;declare v_string text;declare v_for_nofound varchar(10);declare v_counter int default 0;declare cur_stud1 cursor for select t.name ,t.birthday from tb_student t where t.grade >= 70 and t.grade < 80 order by t.grade desc limit 3;declare continue handler for not found set v_done = 0;#使用游标前打开游标open cur_stud1 ;set v_string = '';cur_loop: loopfetch next from cur_stud1 into v_name ,v_date;set v_counter = v_counter + 1;if v_done = 0 then leave cur_loop;end if;-- 此查询无结果,是空。	select t.name  into v_for_nofound 	from tb_student t where t.grade >= 101  order by t.grade desc limit 1;set v_string = concat(v_string,' stud1:',v_name , ' :',v_date);set v_done = 1;end loop cur_loop;close cur_stud1 ;select v_string;select v_counter;end

执行结果:

mysql> call pro_test_nofound_cursor();
+-----------------------------------------------------------------------------------------+
| v_string                                                                                |
+-----------------------------------------------------------------------------------------+
|  stud1:CJXBCEXCOF :2023-09-18 stud1:FIDLSJAYFS :2023-11-08 stud1:KEVQMOCIEW :2023-09-06 |
+-----------------------------------------------------------------------------------------+
1 row in set (0.01 sec)+-----------+
| v_counter |
+-----------+
|         4 |
+-----------+
1 row in set (0.01 sec)Query OK, 0 rows affected (0.01 sec)

执行结果正确,返回了3条记录,计数器值是4 。

http://www.yayakq.cn/news/75580/

相关文章:

  • 接网站 建设微信公众平台设计
  • 卖服务器建网站搜索量最高的网站
  • 网站建设公司重庆淘宝客网站开发定制
  • 网站建设收费标准信息网站规划有哪些内容
  • 网站文件内容多少与虚拟主机空间大小的关系重庆市建设工程施工安全信息网
  • 网站设计管理方向那个网站可以做域名跳转的
  • 网站样版风格排版龙岗商城网站建设
  • 做图片视频的网站有哪些制作网页软件教程
  • jsp 数据库做网站九创 wordpress
  • 描述网站开发的广告词莱芜上汽大众4s店
  • 推广链接网站企业宣传片广告公司
  • 建设网站的产品规划多开商城
  • 网站绩效营销网站建设公司扬州
  • 网站做后怎么可以在百度搜索到网站建设东北
  • 动效h5网站广州联享品牌网站建设
  • 品牌网站制作网站公司北京上海网站建设公司
  • 二手表网站中山软件开发项目管理
  • 凡科做网站好吗wordpress备份坚果云
  • 搞一个公司网站得多少钱小型购物网站模板
  • 易名网站备案网页设计说明万能模板
  • 企业网站主页设计图网站建设与规划结论
  • 保山市城市建设网站深圳做网站推广的公司哪家好
  • 番禺营销型网站建设网站网站怎么做
  • 网站建设宝安jw网站设计
  • 长沙大型网站设计公司大型科技网站建设
  • 手机网站建设项目asp网站添加背景音乐
  • 双语版网站怎么做外卖网站建设价钱
  • 模板网站建设哪家专业微信是哪个公司开发的软件
  • 做网站技术小白怎样建设公司网站
  • 江苏建设工程信息网网址网站关键词优化遇到的情况和解决方法