未明确定义列存储过程没问题_SQL之游标定义(一)

本文介绍了MySQL中的游标概念,强调其在交互式应用中的作用,允许逐条处理结果集。通过DECLARE、OPEN、FETCH和CLOSE等语句展示了游标的声明、打开、关闭及数据检索过程。游标在存储过程中的应用是其核心价值,将在后续内容中进一步探讨。
摘要由CSDN通过智能技术生成

92811717d55ed34d59ce73ba054d4f25.png

指南打北,循环交互。

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

这玩意儿究竟是干嘛的?

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

既然得到的是一个结果集,那和直接返回结果有什么区别?

游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。不像多数DBMS,MySQL游标只能用于存储过程(和函数)。

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

于是,杠精的我又开始在了网上的新一轮搜索。

此段摘自于MySQL Tutorial (MySQL Cursor with Example):

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//

1dbde3f3a2ede2c10abf185b6e3869ad.png

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

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

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

使用游标举例

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

CREATE PROCEDURE 我是第二个例子()
BEGIN
-- 声明一个局部变量
DECLARE 乖巧的局部变量 INT;
-- 声明一个游标:订单号
DECLARE 订单编码 CURSOR
FOR
SELECT order_num FROM orders;
-- 打开我们刚声明的游标
OPEN 订单编码;
-- 提取订单编码
FETCH 订单编码 INTO 乖巧的局部变量;
-- 关闭游标
CLOSE 订单编码;

END//

eed96b08701556164e7926ac45c2a230.png

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

小结

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


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

祝各位学习愉快~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值