聊聊 MySQL 中的游标

 2022-10-27    416  

什么是游标?

游标(cursor)是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游 标之后,应用程序可以根据需要滚动或浏览其中的数据。

注意:MySQL游标只能用于 存储过程(和函数)。

创建游标

在创建一个游标前,我们需要先清除游标的语法

1、定义游标

DECLARE游标名称CURSORFORSQL语句;

2、打开游标

OPEN游标名称;

3、获取结果

FETCH游标名称INTO变量名称[,变量名称];

4、关闭游标

CLOSE游标名称;

我们以Customers表来作为示例

示例一

定义一个存储过程,调用的时候执行里面的游标

CREATEPROCEDUREPROC1()
BEGIN
--定义两个存放结果的变量
DECLARENAMEVARCHAR(20);
DECLAREADDRVARCHAR(50);
--声明游标
DECLAREMYCURSORFORSELECT姓名,地址FROMcustomers;
--打开游标
OPENMY;
--获取结果
FETCHMYINTONAME,ADDR;
--这里是为了显示获取结果
SELECTNAME,ADDR;
--关闭游标
CLOSEMY;
END;

我们执行完上面的存储过程后,就可以调用该存储过程了

CALLPROC1();

得到结果:

这里肯定有小伙伴好奇,customers表里明明有7条记录,为什么只显示了1条记录?

这是因为游标的变量只保留了customers表中的第一行数据,如果要查看后面的数据,就需要循环往下移动游标,才能继续查看。

示例二

定义一个存储过程,调用存储过程时,将表customers里的数据循环写入新的表里面。

CREATEPROCEDUREPROC2()
BEGIN
--定义两个存放结果的变量
DECLAREFLAGINTDEFAULT0;
DECLARENAMEVARCHAR(20);
DECLAREADDRVARCHAR(50);
--声明游标
DECLAREMYCURSORFORSELECT姓名,地址FROMcustomers;

DECLARECONTINUEHANDLERFORNOTFOUNDSETFLAG=1;
--打开游标
OPENMY;
--循环体部分
L1:LOOP
--获取结果
FETCHMYINTONAME,ADDR;
IFFLAG=1THEN
LEAVEL1;
ENDIF;
--这里是为了显示获取结果
INSERTINTOcusVALUES(NAME,ADDR);
--关闭游标
ENDLOOP;--结束循环
CLOSEMY;
END;

然后我们执行这个存储过程,并查询cus表里的数据

CALLPROC2();

SELECT*FROMcus;

结果:

结果与customers里的一致,但是这些结果是循环一条一条往下移动的过程中插入的,即这个循环执行了7次。

  •  标签:  
  • MySQL
  •  

原文链接:https://77isp.com/post/10525.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。