mysql存储过程遍历数据(Mysql 存储过程中使用游标循环读取临时表)
mysql存储过程遍历数据
Mysql 存储过程中使用游标循环读取临时表游标
游标(Cursor)是用于查看或者处理结果集中的数据的一种方法。游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
游标的使用方式
定义游标:Declare 游标名称 CURSOR for table;(table也可以是select出来的结果集)
打开游标:Open 游标名称;
从结果集获取数据到变量:fetch 游标名称 into field1,field2;
执行语句:执行需要处理数据的语句
关闭游标:Close 游标名称;
|
BEGIN # 声明自定义变量 declare c_stgId int ; declare c_stgName varchar (50); # 声明游标结束变量 declare done INT DEFAULT 0; # 声明游标 cr 以及游标读取到结果集最后的处理方式 declare cr cursor for select Name ,StgId from StgSummary limit 3; declare continue handler for not found set done = 1; # 打开游标 open cr; # 循环 readLoop:LOOP # 获取游标中值并赋值给变量 fetch cr into c_stgName,c_stgId; # 判断游标是否到底,若到底则退出游标 # 需要注意这个判断 IF done = 1 THEN LEAVE readLoop; END IF; SELECT c_stgName,c_stgId; END LOOP readLoop; -- 关闭游标 close cr; END |
声明变量Declare语句注意点:
- Declare语句通常用来声明本地变量、游标、条件或者handler
- Declare语句只允许出现在BEGIN...END语句中而且必须出现在第一行
- Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
自定义变量命名注意点:
自定义变量的名称不要和游标的结果集字段名一样。若相同会出现游标给变量赋值无效的情况。
临时表
临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
与普通创建语句的区别就是使用 TEMPORARY 关键字
|
CREATE TEMPORARY TABLE StgSummary( Name VARCHAR (50) NOT NULL , StgId INT NOT NULL DEFAULT 0 ); |
临时表使用限制
- 在同一个query语句中,只能查找一次临时表。同样在一个存储过程中也不能多次查询临时表。但是不同的临时表可以在一个query中使用。
- 不能用RENAME来重命名一个临时表,但是可以用ALTER TABLE代替
|
ALTER TABLE orig_name RENAME new_name; |
- 临时表使用完以后需要主动Drop掉
|
DROP TEMPORARY TABLE IF EXISTS StgTempTable; |
存储过程中使用游标循环读取临时表数据
|
BEGIN ## 创建临时表 CREATE TEMPORARY TABLE if not exists StgSummary( Name VARCHAR (50) NOT NULL , StgId INT NOT NULL DEFAULT 0 ); TRUNCATE TABLE StgSummary; ## 新增临时表数据 INSERT INTO StgSummary( Name ,StgId) select '临时数据' ,1 BEGIN # 自定义变量 declare c_stgId int ; declare c_stgName varchar (50); declare done INT DEFAULT 0; declare cr cursor for select Name ,StgId from StgSummary ORDER BY StgId desc LIMIT 3; declare continue handler for not found set done = 1; -- 打开游标 open cr; testLoop:LOOP -- 获取结果 fetch cr into c_stgName,c_stgId; IF done = 1 THEN LEAVE testLoop; END IF; SELECT c_stgName,c_stgId; END LOOP testLoop; -- 关闭游标 close cr; End ; DROP TEMPORARY TABLE IF EXISTS StgSummary; End ; |
最开始的时候,先创建临时表,再定义游标。但是存储过程无论如何都保存不了。直接报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE ...
根本原因就是上面提到的注意点(Declare语句只允许出现在BEGIN...END
语句中而且必须出现在第一行)。所以最后只能多个加一对BEGIN...END
进行隔开。
总结
以前写SQL Server的存储过程,没有仔细注意过这个问题,定义变量一般都在程序中部,MySQL就想当然的随便写,最后终于踩坑了。这两个语法上差别不大,但是真遇到差别还是挺突然的。不过也好久没有写SQL语句,有点生疏了啊。还是赶紧把坑给记下来,加深下印象吧。
以上就是Mysql 存储过程中使用游标循环读取临时表的详细内容,更多关于MySQL 游标循环读取临时表的资料请关注开心学习网其它相关文章!
原文链接:https://www.cnblogs.com/cplemom/p/13970619.html
- 升级mysql客户端版本(超详细教你怎么升级Mysql的版本)
- docker安装mysql后无法连接(Docker 安装 MySQL 并实现远程连接教程)
- navicat premium连接mysql报错(Navicat连接MySQL错误描述分析)
- linuxmysql安装教程5.7.25学习(linux mysql5.5升级至mysql5.7的步骤与踩到的坑)
- sysbenchmysql性能跑分(MySQL性能压力基准测试工具sysbench的使用简介)
- mysql创建表的基本步骤(mysql中操作表常用的sql总结)
- mysql mvcc 隔离级别(详解MySQL事务的隔离级别与MVCC)
- mysql如何修改列的默认值(mysql查询的时候给字段赋默认值操作)
- mysql实现数据的备份的命令(Windows下MySQL定时备份脚本的实现)
- mysqldump备份缺点(MySQL5.7 mysqldump备份与恢复的实现)
- phpmysql怎么搭建(PHP使用PDO、mysqli扩展实现与数据库交互操作详解)
- linux安装nacos教程(Nacos配置MySQL8的方法)
- 如何正常查看mysql存储数据文件(Mysql文件存储图文详解)
- mysql5.7详细安装教程(MySQL5.7.33安装过程图文详解)
- mysql索引的类型和方法(MySQL覆盖索引的使用示例)
- php redis应用场景(PHP商品秒杀问题解决方案实例详解mysql与redis)
- 靳东领衔打造高精职场 新丽出品《精英律师》曝定妆照(靳东领衔打造高精职场)
- 靳东新剧《精英律师》定档,众星云集,这剧可追(靳东新剧精英律师定档)
- 精英律师 廖佳敏封印恋情曝光,顾婕马失前蹄 你个老不死的(廖佳敏封印恋情曝光)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
- 三兄妹感情再遇波折,人设接连崩塌 《以家人之名》剧情猜不透(三兄妹感情再遇波折)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
热门推荐
- python怎么进行参数传递(在Python中如何传递任意数量的实参的示例代码)
- python装饰器初学者教程(Python3.5装饰器原理及应用实例详解)
- docker如何搭建mysql(docker容器访问宿主机的MySQL操作)
- sqlserver安装与使用教程(SQL Server 2017 Developer的下载、安装、配置及SSMS的下载安装配置图文教程详解)
- python微信消息模拟请求(python实现微信机器人: 登录微信、消息接收、自动回复功能)
- python序列化图解(对Python3 序列解包详解)
- webview获取html(webView加载html图片遇到的问题解决)
- 泛型中new()约束
- requests使用自定义cookie(Yii框架中用response保存cookie,用request读取cookie的原理解析)
- zabbix如何验证监控(Zabbix 动态执行监控采集脚本的实现原理)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9