指南打北,循环交互。

作为一名以目标结果为明确导向的数据分析师【突然背影高大上了起来】,我在仔细看了《MySQL必知必会》中对游标(CURSOR)的详解后满心中只有一个疑问:

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

既然得到的是一个结果集,那和直接返回结果有什么区别?游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。不像多数DBMS,MySQL游标只能用于存储过程(和函数)。

交互式应用是指什么?“对数据进行浏览或做出更改”,难道直接用select语句不能得到相同的结果吗?

于是,杠精的我又开始在了网上的新一轮搜索。To handle a result set inside a stored procedure, you use a cursor. A cursor allows you to iterate a set of rows returned by a query and process each row individually. MySQL cursor is read-only, non-scrollable and asensitive.

简单的说,游标(CURSOR)的特殊性在于它可以用循环对返回值进行逐条编译,它具有只读性、不可跳跃性和迟钝性。

入门游标

在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句:

DECLARE 游标名 CURSOR

FOR

SELECT 语句 #此处必须是SELECT语句

一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来:

OPEN 游标名;

对于填有数据的游标,根据需要取出(检索)各行:

FETCH... FROM 游标名

FETCH指定检索什么数据,即所需的列,并指定检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行,以不重复读取同一行。

在结束游标使用时,必须关闭游标:

CLOSE 游标名;

在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。

游标创建

游标用DECLARE语句创建。DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。

CREATE PROCEDURE 储存过程名()

BEGIN

DECLARE 游标名 CURSOR

FOR

SELECT...

FROM...

WHERE...

END

存储过程处理完成后,游标就“消失”了(因为它局限于存储过程之中)。

创建打开关闭游标举例

如前文所述,在定义游标之后,可以打开它:

DELIMITER //

CREATE PROCEDURE 举个例子()

BEGIN

DECLARE 我是游标 CURSOR

FOR

SELECT 想要的数据 FROM 一张神奇的表;

OPEN 我是游标;

CLOSE 我是游标;

END//

这个存储过程声明、打开和关闭一个游标。。。但对检索出的数据什么也没做。【喂!

CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。但如果我们不明确关闭游标,MySQL将会在到达END语句时自动关闭它。

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。

使用游标举例

在我们打开了游标后,如前文所述,可以用FETCH语句分别访问它的每一行:

CREATE PROCEDURE 我是第二个例子()

BEGIN

-- 声明一个局部变量DECLARE 乖巧的局部变量 INT;

-- 声明一个游标:订单号DECLARE 订单编码 CURSOR

FOR

SELECT order_num FROM orders;

-- 打开我们刚声明的游标OPEN 订单编码;

-- 提取订单编码FETCH 订单编码 INTO 乖巧的局部变量;

-- 关闭游标CLOSE 订单编码;

END//

其中FETCH语句自动从第一行开始检索当前行的order_num列,并存储到一个名为“乖巧的局部变量”的局部声明的变量中。

小结

今天我们学习了如何声明(declare)、打开(open)、关闭(close)游标,并如何利用FETCH分别访问它的每一行。但就像在本文开头所说的,游标的作用并不在此。它在储存过程中对行的逐条编译才是它发扬光大的地方。

直接上手在储存过程中与游标以及循环语句的代码编写对MySQL基础理解要求较高【成功把自己绕晕了的我】【日常怀疑自己读了个假BA】,所以为了能更好地理解“循环编辑”这个概念,下一篇文章我们将暂停一下对游标的讲解,先来介绍MySQL中的循环语句。

祝各位学习愉快~