当前位置: 首页 > MySQL数据库

mysql游标的作用是什么

时间:2026-01-27 10:38:07

在mysql中,游标有指针的作用,主要用于对查询数据库所返回的记录结果集进行遍历,以便进行相应的操作。 游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。关系数据库管理系统实质是面向集合的,在MySQL中并没有一种描述表中单一记录的表达形式,除非使用WHERE子句来限制只有一条记录被选中;所以有时必须借助于游标来进行单条记录的数据处理。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

MySQL游标(Cursor)

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

游标充当指针的作用。

尽管游标能遍历结果中的所有行,但他一次只指向一行。

游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。

关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的数据处理。

一般通过游标定位到结果集的某一行进行数据修改。

游标的用法

1、声明一个游标: declare 游标名称 CURSOR for table;(这里的table可以是你查询出来的任意集合)

2、打开定义的游标:open 游标名称;

3、获得下一行数据:FETCH 游标名称 into testrangeid,versionid;

4、需要执行的语句(增删改查):这里视具体情况而定

5、释放游标:CLOSE 游标名称;

注:mysql存储过程每一句后面必须用;结尾,使用的临时字段需要在定义游标之前进行声明。

实例

-BEGIN--定义变量declaretestrangeidBIGINT;declareversionidBIGINT;declaredoneint;--创建游标,并存储数据declarecur_testCURSORforselectidastestrangeid,version_idasversionidfromtp_testrange;--游标中的内容执行完后将done设置为1DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;--打开游标opencur_test;--执行循环posLoop:LOOP--判断是否结束循环IFdone=1THENLEAVEposLoop;ENDIF;--取游标中的值FETCHcur_testintotestrangeid,versionid;--执行更新操作updatetp_data_executesetversion_id=versionidwheretestrange_id=testrangeid;ENDLOOPposLoop;--释放游标CLOSEcur_test;END-

例子2:

我们现在要用存储过程做一个功能,统计iphone的总库存是多少,并把总数输出到控制台。

--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。delimiter//dropprocedureifexistsStatisticStore;CREATEPROCEDUREStatisticStore()BEGIN--创建接收游标数据的变量declarecint;declarenvarchar(20);--创建总数变量declaretotalintdefault0;--创建结束标志变量declaredoneintdefaultfalse;--创建游标declarecurcursorforselectname,countfromstorewherename='iphone';--指定游标循环结束时的返回值declarecontinueHANDLERfornotfoundsetdone=true;--设置初始值settotal=0;--打开游标opencur;--开始循环游标里的数据read_loop:loop--根据游标当前指向的一条数据fetchcurinton,c;--判断游标的循环是否结束ifdonethenleaveread_loop;--跳出游标循环endif;--获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,settotal=total+c;--结束游标循环endloop;--关闭游标closecur;--输出结果selecttotal;END;--调用存储过程callStatisticStore();

fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;

read_loop:loopfetchcurinton,c;settotal=total+c;endloop;

在MySql中,造成游标溢出时会引发mysql预定义的NOT FOUND错误,所以在上面使用下面的代码指定了当引发not found错误时定义一个continue 的事件,指定这个事件发生时修改done变量的值。

declarecontinueHANDLERfornotfoundsetdone=true;

所以在循环时加上了下面这句代码:

--判断游标的循环是否结束ifdonethenleaveread_loop;--跳出游标循环endif;

如果done的值是true,就结束循环。继续执行下面的代码

使用方式

游标有三种使用方式:

  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素