Navicat 博客

使用游标循环遍历查询结果集 2021 年 5 月 4 日,由 Robert Gravelle 撰写

作为一种事务性编程语言,SQL 被设计为全部执行或全部不执行其工作。同时,诸如 C# 和 Java 之类的过程编程语言本质上通常是循环迭代的。这样,它们倾向于循环遍历相同的代码,直到堆栈减少并完全处理为止。游标(Cursor)是 SQL 事务处理方法的显着例外。像 WHILE 循环一样,游标允许程序员通过遍历它们来分别处理 SELECT 结果集的每一行。尽管许多 SQL 纯粹主义者出于轻蔑或恐惧而避开了游标,但他们在数据库开发中占有一席之地,值得我们学习。为此,今天的文章将介绍何时以及如何在存储过程中使用游标。

游标的定义

如上所述,数据库游标是一种特殊的控制结构,它可以遍历数据库中的记录,以便处理查询结果集的各个行以进行顺序处理。在存储过程中,使用游标可以逐行执行复杂的逻辑。

游标具有三个重要属性:

  • 非敏感性:服务器可能会也可能不会复制其结果表。
  • 只读:数据不会更新。
  • 不可滚动:只能在一个方向遍历,不能跳过任何一行。

如何使用游标

在存储过程中使用游标有四步骤:

  • 声明游标。
  • 打开游标。
  • 将数据提取到变量中。
  • 完成后关闭游标。

声明游标

以下语句声明一个游标,并将其与 SELECT 语句相关联。该 SELECT 语句检索该游标要遍历的行:

DECLARE cursor_name 
CURSOR FOR select_statement

打开游标

以下语句打开先前声明的游标。

OPEN cursor_name

将数据提取到变量中

此语句获取与指定游标(必须打开)关联的 SELECT 语句的下一行,并前进游标指针。如果存在行,则将提取的列存储在命名变量中。SELECT 语句检索的列数必须与 FETCH 语句中指定的输出变量数匹配。

FETCH [[NEXT] FROM] cursor_name 
INTO var_name [, var_name] ...

完成后关闭游标

此语句关闭游标。如果游标未打开,则会发生错误。

CLOSE cursor_name

实际示例

这是存储过程的定义(在 Navicat for MySQL 中显示),该存储过程使用游标为 Sakila 示例数据库中的所有工作人员生成电子邮件列表:

cursor_definition (81K)

getEmail LOOP中,游标遍历电子邮件列表,并连接所有以分号(;)分隔的电子邮件。当没有提取到电子邮件时,finished 变量通知游标终止循环。这是执行存储过程后的 emailList 的值:

cursor_result (22K)

总结

在今天的文章中,我们了解了何时以及如何在存储过程中使用游标。

如果你对 Navicat for MySQL 感兴趣,可以免费试用 14 天!

Navicat 文章
频道条目
分享
文章归档