MySQL:游标

游标#

我们来回顾一下之间接触的内容:

检索方式 功能
一般检索 直接按照一定的条件,将所有符合的数据组合成一个结果集返回
计算字段 对检索的结果集进行整合,或者是进行运算
聚集函数 对数据集进行整体的整合分析
子查询 以一次检索的数据为基准,对这些结果进行再一次的搜索
联结 将不同表中有关联的数据,整合到一个结果集中
组合查询 将多个检索的结果,组合到一个结果集中
全文本搜索 是一种智能的搜索,可以有效地对文本数据进行检索

以上就是我们之前看过的知识了,不过我们发现这些操作都是对于一个结果集合而言的。但是在现实操作中我们可能需要对数据进行逐行处理,这个要求在上述的操作中都难以实现,即使可以强行实现也会有严重的性能问题。

使用游标#

对于逐行操作的需求,可以使用游标 (cursor)来实现。游标是一个存储在 MySQL 服务器上的数据库查询,与 SELECT 不同的是右边本身就是通过检索构建的一个新的可调用的检索集合。游标可以理解为 C/C++ 中的指针,对于某一个结构可以用指针去访问值,游标的原理就与之类似。对于游标的使用,有以下的操作顺序:

  1. 定义游标,并且封装建立结果集所使用的 SELECT 语句;
  2. 打开游标;
  3. 使用封装的 SELECT 检索数据;
  4. 在游标填充数据的情况下,按需对行进行操作;
  5. 关闭游标;

游标操作#

创建游标#

在 MySQL 中,游标只能应用于存储过程和函数,因此对于游标的创建,首先还是得先拥有一个存储过程。拥有存储过程之后就使用 DECLARE 语句定义游标,这些语句就放到存储过程的 BEGINEND 之间。代码框架如下:

Copy Highlighter-hljs
DECLARE cursor_name CURSOR FOR SELECT 语句;

打开游标#

使用游标时必须要先打开,打开之后就可以对数据进行浏览了,打开语句如下:

Copy Highlighter-hljs
OPEN cursor_name;

关闭游标#

游标使用完毕之后要把其关掉,关闭时占用的内存和资源会被自动释放。游标被关闭之后就不能再使用,但是可以再次被打开。语句为:

Copy Highlighter-hljs
CLOSE cursor_name;

使用游标数据#

使用游标数据时要用到 FETCH 语句来逐行访问,需要给出访问所需的列,这样便于游标去定向访问,同时这个语句还会促使游标向下一行移动。语句为:

Copy Highlighter-hljs
FETCH row_name INTO variable;

这个语句可以用来检索指定的行,并且注入到一个变量当中。

重复操作#

FETCH 语句可以将游标推进到下一行,但是它只进行一次操作,并不能实现逐行处理。这里可以使用重复语句 REPEAT

Copy Highlighter-hljs
REPEAT MySQL 代码 UNTIL 条件语句 END REPEAT;

这个语句可以重复执行中间的代码,直到条件语句中的条件为真之后结束。

条件处理#

Copy Highlighter-hljs
DECLARE CONTINE HANDLER 表达式 1 SET 表达式 2

这段代码的作用是定义一个 CONTINE HANDLER,这个的作用是当表达式 1 的条件出现时,将执行表达式 2 的语句。用这个语句可以实现条件的变更。

实例#

下面使用上述的所有操作,给出相对完整的右边应用实例。

启用存储过程,并对其内容进行查看。

同时也可以去查看数据库,会发现多了一张新建的表。

参考资料#

《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
mysql游标的用法及作用

posted @   乌漆WhiteMoon  阅读(1584)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-04-25 Wireshark实验——DNS 域名系统
点击右上角即可分享
微信分享提示
CONTENTS