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

深刻理解MySQL8游标处理中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 。

相关文章:

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

深刻理解MySQL8游标处理中not found 最近使用MySQL的游标&#xff0c;在fetch循环过程中&#xff0c;程序总是提前退出 &#xff0c;百思不得其解&#xff0c;经过测试&#xff0c;原来是对于游标处理中not found的定义理解有误&#xff0c;默认是视同Oracle的游标not found定…...

甄知燕千云与SAP、EBS、TC、NS等应用深度集成,智能提单一键畅通,效能一键提升

当今全球化时代下&#xff0c;全球商业环境面临前所未有的机遇和挑战&#xff0c;企业需要持续的业务变革、组织优化来进行降本增效&#xff0c;企业管理软件已成为中小企业、大型企业数字化转型不可或缺的管理工具&#xff0c;企业内管理软件系统也越来越多。 为了适应当前企业…...

第99步 深度学习图像目标检测:SSDlite建模

基于WIN10的64位系统演示 一、写在前面 本期&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;SSD&#xff08;Single Shot MultiBox Detector&#xff09;模型的后续版本&#xff0c;SSDlite模型。 二、SSDlite简介 SSDLite 是 SSD 模型的一个变种&#xff0c…...

用EasyAVFilter将网络文件或者本地文件推送RTMP出去的时候发现CPU占用好高,用的也是vcodec copy呀,什么原因?

最近同事在用EasyAVFilter集成在EasyDarwin中做视频拉流转推RTMP流的功能的时候&#xff0c;发现怎么做CPU占用都会很高&#xff0c;但是视频没有调用转码&#xff0c;vcodec用的就是copy&#xff0c;这是什么原因呢&#xff1f; 我们用在线的RTSP流就不会出现这种情况&#x…...

Vatee万腾科技的独特力量:Vatee数字时代创新的新视野

在数字化时代的浪潮中&#xff0c;Vatee万腾科技以其独特而强大的创新力量&#xff0c;为整个行业描绘了一幅崭新的视野。这不仅是一场科技创新的冒险&#xff0c;更是对未来数字时代发展方向的领先探索。 Vatee万腾将创新视为数字时代发展的引擎&#xff0c;成为推动行业向前的…...

【JavaSE】基础笔记 - 异常(Exception)

目录 1、异常的概念和体系结构 1.1、异常的概念 1.2、 异常的体系结构 1.3 异常的分类 2、异常的处理 2.1、防御式编程 2.2、异常的抛出 2.3、异常的捕获 2.3.1、异常声明throws 2.3.2、try-catch捕获并处理 3、自定义异常类 1、异常的概念和体系结构 1.1、异常的…...

QTableWidget——编辑单元格

文章目录 前言熟悉QTableWiget&#xff0c;通过实现单元格的合并、拆分、通过编辑界面实现表格内容及属性的配置、实现表格的粘贴复制功能熟悉QTableWiget的属性 一、[单元格的合并、拆分](https://blog.csdn.net/qq_15672897/article/details/134476530?spm1001.2014.3001.55…...

编译QT Mysql库并集成使用

安装MSVC编译器与Windows 10 SDK 打开Visual Studio Installer&#xff0c;如果已经安装过内容了可能是如下页面&#xff0c;点击修改&#xff08;头一回打开的话不需要这一步&#xff09;&#xff1a; 然后在工作负荷中勾选使用C的桌面开发&#xff0c;它会帮我们勾选好一些…...

利用企业被执行人信息查询API保障商业交易安全

前言 在当今竞争激烈的商业环境中&#xff0c;企业为了保障商业交易的安全性不断寻求新的手段。随着技术的发展&#xff0c;利用企业被执行人信息查询API已经成为了一种强有力的工具&#xff0c;能够帮助企业在商业交易中降低风险&#xff0c;提高合作的信任度。 企业被执行人…...

【深度学习】P1 深度学习基础框架 - 张量 Tensor

深度学习基础框架 张量 Tensor 张量数据操作导入创建张量获取张量信息改变张量张量运算 张量与内存 张量 Pytorch 是一个深度学习框架&#xff0c;用于开发和训练神经网络模型。 而其核心数据结构&#xff0c;则是张量 Tensor&#xff0c;类似于 Numpy 数组&#xff0c;但是可…...

vue2 识别页面参数中的html

在Vue 2中&#xff0c;你可以使用v-html指令来识别页面参数中的HTML内容。v-html指令允许你将HTML代码作为Vue模板的一部分进行渲染。 以下是一个示例&#xff0c;演示了如何在Vue 2中使用v-html指令来识别页面参数中的HTML内容&#xff1a; <template><div v-html&…...

matlab 一些画图法总结(持续更新)

*****************************************画Dmd_L极坐标表示法**************************************** if(~exist(Dmd_L_array)) Dmd_L_array []; end Dmd_L_array [Dmd_L_array; Dmd_L]; thetaangle(Dmd_L_array); rabs(Dmd_L_array); polarplot(theta,r,o); *****…...

MDK AC5和AC6是什么?在KEIL5中添加和选择ARMCC版本

前言 看视频有UP主提到“AC5”“AC6”这样的词&#xff0c;一开始有些不理解&#xff0c;原来他说的是ARMCC版本。 keil自带的是ARMCC5&#xff0c;由于ARMCC5已经停止维护了&#xff0c;很多开发者会选择ARMCC6。 在维护公司“成年往事”项目可能就会遇到新KEIL旧版本编译器…...

杰发科技AC7801——EEP内存分布情况

简介 按照文档进行配置 核心代码如下 /*!* file sweeprom_demo.c** brief This file provides sweeprom demo test function.**//* Includes */ #include <stdlib.h> #include "ac780x_sweeprom.h" #include "ac780x_debugout.h"/* Define …...

【mybatis注解实现条件查询】

文章目录 步骤1: 引入MyBatis依赖步骤2: 创建数据模型步骤3: 创建Mapper接口步骤4: 配置MyBatis步骤5: 执行条件查询 步骤1: 引入MyBatis依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.x.…...

【广州华锐互动】VR线上课件制作软件满足数字化教学需求

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在教学领域的应用逐渐成为趋势。其中&#xff0c;广州华锐互动开发的VR线上课件制作软件更是备受关注。这种工具为教师提供了便捷的制作VR课件的手段&#xff0c;使得VR教学成为可能&#xff0c;极大地丰…...

MySQL 中 DELETE 语句中可以使用别名么?

某天&#xff0c;正按照业务的要求删除不需要的数据&#xff0c;在执行 DELETE 语句时&#xff0c;竟然出现了报错&#xff01; 作者&#xff1a;林靖华&#xff0c;开源数据库技术爱好者&#xff0c;擅长MySQL和Redis的运维 爱可生开源社区出品&#xff0c;原创内容未经授权不…...

flutter创建不同样式的按钮,背景色,边框,圆角,圆形,大小都可以设置

在ui设计中&#xff0c;可能按钮会有不同的样式需要你来写出来&#xff0c;所以按钮的不同样式&#xff0c;应该是最基础的功能&#xff0c;在这里我们赶紧学起来吧&#xff0c;web端可能展示有问题&#xff0c;需要优化&#xff0c;但是基本样式还是出来了 我是将所有的按钮放…...

【C++】标准模板库STL作业(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

基于SpringBoot+Redis实现点赞/排行榜功能,可同理实现收藏/关注功能,可拓展实现共同好友/共同关注/关注推送功能

前言 简单记录一下在SpringBoot项目中&#xff0c;使用Redis实现点赞/排行榜功能&#xff0c;可同理实现收藏/关注功能&#xff0c;可拓展实现共同好友/共同关注/关注推送功。主要用到了Redis中的Set集合和ZSet集合。 一、指定使用某个索引的数据库 在Redis中&#xff0c;可…...

TMSpeech终极指南:5分钟配置Windows本地实时语音转文字工具

TMSpeech终极指南&#xff1a;5分钟配置Windows本地实时语音转文字工具 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否厌倦了需要联网才能使用的语音转文字工具&#xff1f;担心会议内容被上传到云端泄露隐私…...

Display Driver Uninstaller终极指南:三步彻底告别显卡驱动残留烦恼

Display Driver Uninstaller终极指南&#xff1a;三步彻底告别显卡驱动残留烦恼 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

Windows系统优化终极指南:Chris Titus Tech WinUtil一键搞定所有系统管理

Windows系统优化终极指南&#xff1a;Chris Titus Tech WinUtil一键搞定所有系统管理 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil Windows…...

揭秘书匠策AI:毕业论文写作的“全能魔法师”现身!

在学术的广阔天地里&#xff0c;毕业论文就像是一场盛大的探险&#xff0c;既充满挑战也蕴含无限可能。每一位踏上这场探险之旅的学子&#xff0c;都渴望拥有一位得力的向导&#xff0c;让前行的道路更加顺畅。今天&#xff0c;就让我带你走进书匠策AI的世界&#xff0c;这位毕…...

AdaBoost算法原理与实践:从基础到优化

1. 集成学习与Boosting基础概念在机器学习领域&#xff0c;Boosting是一类强大的集成学习方法&#xff0c;它的核心思想是通过组合多个弱学习器来构建一个强学习器。与Bagging类方法&#xff08;如随机森林&#xff09;不同&#xff0c;Boosting采用序列化的方式训练基学习器&a…...

3步实现CentOS-WSL高效部署方案:Windows开发环境深度整合实战

3步实现CentOS-WSL高效部署方案&#xff1a;Windows开发环境深度整合实战 【免费下载链接】CentOS-WSL A GitHub Actions automated CentOS RootFS to use with WSL 项目地址: https://gitcode.com/gh_mirrors/ce/CentOS-WSL CentOS-WSL项目通过GitHub Actions自动化将C…...

3步解锁Cursor Pro完整功能:免费享受AI编程高级特性

3步解锁Cursor Pro完整功能&#xff1a;免费享受AI编程高级特性 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial…...

Cherry MX键帽3D模型库:机械键盘定制化的技术架构与制造方案

Cherry MX键帽3D模型库&#xff1a;机械键盘定制化的技术架构与制造方案 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 在机械键盘定制化领域&#xff0c;Cherry MX键帽3D模型库为…...

G1垃圾收集器四大关键机制原理详细描述

目录 G1垃圾收集器四大关键机制原理详细描述 一、Region分区化(核心基础机制) 1. 核心设计原理 2. 关键角色划分及作用 3. 核心作用 二、记忆集(Remembered Set,RSet) 1. 核心设计背景 2. 原理详细描述 3. 工作流程(结合GC场景) 4. 核心作用 三、卡表(CardT…...

3分钟解锁微信网页版:浏览器插件让你轻松访问网页微信

3分钟解锁微信网页版&#xff1a;浏览器插件让你轻松访问网页微信 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版无法登录而烦恼吗&…...