解析MySQL存储过程的游标执行过程

MySQL 8.0 存储过程实战:3种参数模式(IN/OUT/INOUT)与5个典型业务场景 本文深入解析MySQL 8.0存储过程的3种参数模式(IN/OUT/INOUT)及其在5个典型业务场景中的实战应用。通过详细代码示例,展示如何利用存储过程提升数据库操作效率,包括数据校验、批量更新、动态SQL构建等高级技巧,帮助开发者优化数据库性能并确保业务逻辑安全。 阅读详情
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

内容提纲

一、测试环境搭建

二、执行过程解析

三、注意事项

一、测试环境搭建

首先创建一张表,并插入几行数据字段:

CREATE TABLE t (s1 INT, s2 char(100),PRIMARY KEY (s1));
INSERT INTO t values(1,'aaa');
INSERT INTO t values(2,'bbb');
INSERT INTO t values(3,'ccc');

接着创建存储过程,这里的v_total用于判断数据行数。

因为MySQL游标获取完后,最后一行没有退出机制。所以不进行判断是否取完最后一行,就继续取数会发生报错。

DELIMITER ;;
  CREATE PROCEDURE test_mysql_cursor_loop()
    BEGIN
      declare v_total int default 0; 
      declare i int default 0; 
      declare str1 int;
      declare str2 varchar(255);
      DECLARE stuCursor CURSOR FOR SELECT s1,s2 FROM t;
      select count(s2) into v_total from t;
      OPEN stuCursor;
      stuLoop:LOOP
        IF i = v_total THEN LEAVE stuLoop; end if;
        FETCH stuCursor INTO str1,str2;
          SELECT str1,str2;
          set i = i+1;
      end loop stuLoop;
    END;;
DELIMITER ;

二、执行过程解析

这个存储过程在MySQL内部转化为存储过程指令如下:

mysql> show PROCEDURE code test_mysql_cursor_loop;
+-----+---------------------------------------------+
| Pos | Instruction                                 |
+-----+---------------------------------------------+
|   0 | set v_total@0 0                             |
|   1 | set i@1 0                                   |
|   2 | set str1@2 NULL                             |
|   3 | set str2@3 NULL                             |
|   4 | cpush stuCursor@0: SELECT s1,s2 FROM t      |
|   5 | stmt "select count(s2) into v_total from t" |
|   6 | copen stuCursor@0                           |
|   7 | jump_if_not 9(9) (i@1 = v_total@0)          |
|   8 | jump 13                                     |
|   9 | cfetch stuCursor@0 str1@2 str2@3            |
|  10 | stmt "SELECT str1,str2"                     |
|  11 | set i@1 (i@1 + 1)                           |
|  12 | jump 7                                      |
|  13 | cclose stuCursor@0                          |
|  14 | cpop 1                                      |
+-----+---------------------------------------------+
15 rows in set (0.00 sec)

其中:

  • v_total@0的 @0 代表这是第一个自定义变量。

  • stuCursor@0的 @0 代表这是第一个cursor变量。

从指令可以看出cursor的运行需要经过几个过程:

1、cpush

这个用于注册一个cursor,初始化堆栈。

2、copen

这里会先运行SELECT s1,s2 FROM t指令,让cursor获得表的列信息,然后调用cpush,经过cpush->open来打开一个cursor,用于后续获取表数据。

3、cfetch

这个用于从cursor获取的数据赋值给自定义变量str1,str2,然后传递给client端显示。注意到这里用了jump 7来循环取数据。

4、cclose

关闭cursor。

5、cpop

把当前cursor从堆栈释放掉。

上面循环取数和退出机制如下:

jump_if_not 9(9) (i@1 = v_total@0)用于判断i@1是否等于v_total@0,如果不等于的话当前指令就跳转到第9个指令,继续执行cfetch。

如果i@1等于v_total@0的话就继续执行下一条jump 13关闭cursor退出当前循环。set i@1 (i@1 + 1)用于计数,jump 7用于继续循环取数。

三、注意事项

str1和str2的类型和数量必须与declare cursor的一致,如果声明不正确就会导致cfetch出错。

因为declare str1和str2之后,mysql就会对这两个列建立一张临时表,当cfetch数据之后就会把数据存入这张表,后续用户select的时候就从这张临时表取数据来显示,所以就必须进行正确的变量声明。

Enjoy MySQL :)

文章推荐:

GreatSQL MGR FAQ https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA

万答#12,MGR整个集群挂掉后,如何才能自动选主,不用手动干预 https://mp.weixin.qq.com/s/07o1poO44zwQIvaJNKEoPA

『2021数据技术嘉年华·ON LINE』:《MySQL高可用架构演进及实践》 https://mp.weixin.qq.com/s/u7k99y6i7riq7ScYs7ySnA

一条sql语句慢在哪之抓包分析 https://mp.weixin.qq.com/s/AYibbzl860D90rOeyjB6IQ

万答#15,都有哪些情况可能导致MGR服务无法启动 https://mp.weixin.qq.com/s/inSGpd0Q_XIl2Mb-VsvNsA

技术分享 | 为什么MGR一致性模式不推荐AFTER https://mp.weixin.qq.com/s/rNeq479RNsklY1BlfKOsYg

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili: https://space.bilibili.com/1363850082/video

微信&QQ群: 可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697 微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署) 🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨ 阅读详情

相关推荐

车辆TBOX科普 第64次 TBOX系统集成测试与文档编写

汽车电子开发中,TBOX作为核心网关面临独特挑战:需处理多网络接口、满足严苛安全标准并确保10年以上可靠性。项目文档是开发流程的核心资产,必须与编码同步更新,构建从需求到测试的完整闭环。系统集成测试需分层进行,结合硬件在环测试和自动化工具,并严格管理缺陷。文档与测试深度协同,通过追溯矩阵确保每个需求都被覆盖验证。最终交付不仅是软件包,更是一套包含完整验证报告的信任体系。这种严谨的工程纪律,是将代码转化为车规级可靠产品的关键保障。

IT深耕十余载,大道之简 1324

Mysql游标执行异常中断,没有执行完全部数据问题原因

Mysql游标执行中断,mysql游标遍历异常

猿人源码 1053

高效打卡系统设计:从行为心理学到实践工具

打卡系统作为现代时间管理的重要工具,其核心原理植根于行为心理学中的即时反馈机制和习惯养成理论。通过科学设计的打卡周期和可视化反馈,能有效提升个人自律性和目标达成率。在技术实现上,从纸质记录到数字化工具(如Notion、Excel自动化模板)的演进,为不同场景提供了灵活解决方案。特别在习惯追踪和进度管理领域,结合热力图生成、数据统计等技巧,打卡系统能转化为强大的自我监督工具。本文通过实践案例,详解如何构建兼顾弹性和约束力的个性化打卡方案,帮助读者突破'三天打鱼两天晒网'的常见困境。

weixin_30047059的博客 337

MySQL游标

MySQL游标

wgchen 1万+

核磁干货 | RESTplus实战:静息态fMRI预处理全流程解析

本文详细解析了使用RESTplus工具包进行静息态fMRI数据预处理的完整流程,包括数据准备、环境配置、预处理步骤及高级分析技巧。RESTplus作为基于SPM的批处理工具,以其图形化界面和智能化参数设置显著提升了核磁静息态数据分析的效率,特别适合新手和临床研究人员。文章还分享了实战中的常见问题解决方案和性能优化技巧。

wine的专栏 883

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2341

mysql 游标没循环完就退出了

在mysql存储过程中,当select a into b 时候,如果select出来的结果为null,游标就会停止,解决办法: select count(1) into xx from ... 然后判断xx是否为0,再继续自己的业务逻辑,就不会出现select 为null时进行into了。 ...

徐海兴的专栏 2376

3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)

3.1 计算机视觉的发展和卷积神经网络(百度架构师手把手带你零基础实践深度学习原版笔记系列) 概要 计算机视觉作为一门让机器学会如何去“看”的科学学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场景和故事,以此来模拟人脑视觉系统。因此,计算机视觉也通常被叫做机器视觉,其目的是建立能够从图像或者视频中“感知”信息的人工系统。 计算机视觉技术经过几十年的发展,已经在交通(车牌识别、道路违章抓拍)、安防(人脸闸机.

aiAI 691

【MySQL】游标查不出数据

这个问题在很多的案例中都没有注意这个事情 这个问题的所在是在设置游标的时候需要设置别名

咔咔博客 1468

非机动车闯红灯检测与自动录像系统实战(YOLO+追踪+红绿灯感知)

本文聚焦非机动车(如电动车、自行车)闯红灯行为的智能识别系统构建,结合 YOLO 检测模型、追踪算法(如 DeepSORT)、红绿灯状态感知与区域判断逻辑,构建完整的违章行为识别与证据录像系统。文章涵盖数据采集、模型选型、红绿灯触发机制、闯红逻辑判定、视频自动保存等核心环节,辅以 Jetson/RK3588 平台部署与工程实测,适用于城市交通监控、智慧路口管控等真实场景。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1285

把入库交货单的 GOS 附件自动带进审批 Work Item:用 SOFM 对象打通 SAP Workflow 附件链路

本文介绍了一种在SAP ECC系统中将入库交货单的GOS附件自动附加到Workflow审批项中的解决方案。通过使用BOR对象引用列表和SOFM业务对象,审批人可直接在Work Item中查看附件,无需返回原单据界面。文章详细阐述了从BUS2015业务对象获取附件连接、转换LOIO_ID为SOFM对象引用,并将附件列表绑定到User Decision步骤的具体实现方法。该方案适用于经典SAP Business Workflow+BOR架构,核心ABAP代码可直接复用,有效解决了审批流程中的附件可见性问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

关于mysql游标遍历数据不全问题

声明游标时候有这么一条语句: DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 它是对全局的select有效的,只要有一条select语句返回空,那么就是触发该语句,从而导致游标提前退出。 问题解决办法: 在判断查询结果为null后,set done=0即可 这问题我排了快一天真是泪崩,主要还是mysq...

m0_37840000的博客 1810

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析 openGauss学习笔记-280 ope

超哥的博客 309

mysql 存储过程学习

存储过程框架 DEMILITER$$ --重定义符 DROPPROCEDUREIFEXISTSstore_procedure$$ --如果存在此名的存储过程,先删除 CREATEPROCEDUREstore_procedure() --创建名为store_procedure的存储过程 BEGIN --开始 --内容 END$$ --结束 ...

166

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

解决MySQL游标循环多执行一次的问题 MySQL存储过程使用游标时,多执行一次的问题

解决MySQL游标循环多执行一次的问题 MySQL存储过程使用游标时,多执行一次的问题 一、问题描述 1、在写MySQL存储过程,使用到游标遍历数据时,遇到一个问题:游标的循环比数据集填充到游标要多执行1次。 2、表述不清,这样理解:填充到游标时,select 查询到10条, 实际循环会执行 11次。 即永远 n+1 多一次。 二、问题重现 1、如下,存储过程 pro_...

HaHa_Sir的博客 4996

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL存储过程语法全解析

MySQL存储过程语法摘要:存储过程需用DELIMITER指定结束符。变量分为系统变量(如@@autocommit)、用户变量(无需声明)和局部变量。支持IF条件判断和CASE结构。提供多种循环:WHILE、REPEAT(类似do-while)、LOOP(需配合LEAVE/ITERATE控制)。游标用于处理查询结果集,包含声明、OPEN、FETCH和CLOSE操作。参数默认IN类型。注意用户变量未初始化时为NULL,LOOP不加控制条件会形成死循环。

weixin_63583875的博客 296

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mysql存储过程基本教程

mysql存储过程详细教程 什么是mysql存储过程? 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 为什么要使用mysql存储过程? 我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工...

定格空间 179

MySql入门学习:存储过程、游标及触发器

一、存储过程 大多数SQL语句都是针对一个或多个表的单条语句。但是,并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成。例如,如下情形: 为了处理订单,需要核对以保证库存中有相应的物品。 如果库存有物品,这些物品需要预定以便不将它们再卖给别的人,并且要减少可用的物品数量以反映正确的库存量。 库存中没有的物品需要订购,这需要与供应商进行某种交互。 关于哪些物品入库(并且可以立即发货)和哪些物品退订,需要通知相应的客户。 执行这个处理需要针对许多表的多条MySQ...

sssxlxwbwz的博客 955

项目6 创建与使用存储过程

【任务6.1】 创建简单存储过程 1.PL/SQL的变量 变量是指在程序运行过程中其值可以改变的量,包括用户变量、系统变量和局部 变量。 (1)用户变量。用户可以在 PL/SQL 中使用自己定义的变量,这样的变量称为用 户变量。可以先在用户变量中保存一个数据,然后在以后的语句中引用该变量,这样 就可以将数据从一条语句传递到另一条语句。用户变量在使用前必须定义和初始化。 如果使用没有初始化的变量,其值为 NULL。 定义和初始化一个用户变量可以使用 SET 语句,其语法格式为: SET @<变量名1..

weixin_61961397的博客 389

mysql 存储过程学习 汇总

存储过程框架 DEMILITER $$ -- 重定义符 DROP PROCEDURE IF EXISTS store_procedure$$ -- 如果存在此名的存储过程,先删除 CREATE PROCEDURE store_procedure() -- 创建名为store_procedure的存储过程 BEGIN -- 开始 -- 内容 END$$ -- 结束 DEMIL...

150

调试mysql语句_Mysql sql 语句调试

一. 执行报错内容不是真实的报错内容 存储过程和关联的存储过程都不存在'value_1_'这个字段可以使用navicat的命令窗口执行 反馈出真实的报错原因由于customer_po_no_ 变量设置了长度2000 ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加IF LENGTH(customer_po_no_) >= 1950 THENLEAVE arc...

weixin_34615710的博客 679

mysql 怎么调试_Mysql sql 语句调试

一. 执行报错内容不是真实的报错内容 存储过程和关联的存储过程都不存在'value_1_'这个字段可以使用navicat的命令窗口执行 反馈出真实的报错原因由于customer_po_no_ 变量设置了长度2000 ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加IF LENGTH(customer_po_no_) >= 1950 THENLEAVE arc...

weixin_39608300的博客 841

MySQL存储过程运行出错怎么排查_使用DECLARE HANDLER捕获错误

另一个高频问题是 handler 类型和错误不匹配:CONTINUE 和 EXIT 行为差异大,而错误条件写成 SQLSTATE '45000' 却去捕获一个主键冲突(SQLSTATE '23000'),自然失效。DECLARE HANDLER 必须紧跟在 BEGIN 后、首个可执行语句前优先用 SQLSTATE 值捕获,比 MYSQL_ERRNO 更稳定(例如主键冲突是 SQLSTATE '23000',不是 1062)若 handler 内部再出错(比如写入日志表失败),默认会中断整个过程;

m0_51509842的博客 219

escape在oracle中和mysql中的区别,MySQL与Oracle的语法区别详细对比

这篇文章主要为大家详细介绍了MySQL与Oracle的语法区别详细对比,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!Oracle和mysql的一些简单命令对比1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;SQL> select to_char(sysdate,'hh24-...

weixin_35816790的博客 262

学习SQL知识总结之基础篇

SQL 基础知识整理 SQL语句是怎么执行的? SQL语句在oracle中的执行过程: 1.语法检查,检查语句的语法是否存在问题。 2.语义检查,检查语句的寓意是否存在问题。 3.权限检查,检查当前用户是否有访问权限。 4.共享池 若存在共享池中->优化器(软解析) 若不存在共享池中->解析器->执行器(硬解析) 共享池是oracle中的术语,主要包括了库缓存以及数据字典缓冲区。 库缓存存储了SQL语句以及执行计划,数据字段缓冲区存储的是Oracle对对象的定义,比如表、视图、索引等。

开开心心,努力生活 548

别再只会用SELECT了!MySQL存储过程里的LOOP、WHILE、REPEAT到底怎么选?实战避坑指南

本文深入解析MySQL存储过程中LOOP、WHILE和REPEAT三种循环结构的核心差异与实战应用场景,提供性能对比和优化策略,帮助开发者根据业务需求选择最佳循环方案,避免常见陷阱并提升代码效率。

weixin_30553777的博客 449
上一篇: 在docker中出现的僵尸进程怎么处理
下一篇: 参考MySQL Internals手册,使用Golang写一个简单解析binlog的程序
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值