【MySQL】游标

什么是游标?

游标(cursor):是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
使用原因:有时,需要在检索出来的行中前进或后退一行或多行等各种原因。
作用:在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。

只能用于存储过程:不像多数DBMS,MySQL游标只能用于存储过程(和函数)。

使用游标

  • 在能够使用游标前,必须声明(定义)它;
  • 一旦声明后,必须打开游标以供使用;
  • 对于填有数据的游标,根据需要取出(检索)各行;
  • 在结束游标使用时,必须关闭游标。

创建游标

游标用DECLARE … CURSOR FOR [SELECTY语句] 语句创建。

CREATE PROCEDURE processorders() 
BEGIN 
	DECLARE ordernumbers CURSOR 
	FOR 
	SELECT order_num FROM orders;
END;

打开和关闭游标

OPEN ordernumbers;
CLOSE ordernumbers;

CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。

隐含关闭:如果不明确关闭游标,MySQL将会在到大END语句时自动关闭它。

使用游标数据

在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。

CREATE PROCEDURE processorders() 
BEGIN 
	-- 声明变量 
	DECLARE done BOOLEAN DEFAULT 0; 
	DECLARE o INT; 
	
	-- 声明游标 
	DECLARE ORDERNUMBERS cursor 
	FOR 
	SELECT order_num FROM orders; 

	-- 声明程序运行条件 
	-- 该条件指出当SQLSTATE '02000'出现时,SET done=1
	-- SQLSTATE '02000'是一个未找到的条件,当REPEAT由于没有更多的行提供循环不能继续时,出现这个条件
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 

	-- 打开游标 
	OPEN ordernumbers; 

	-- 遍历所有行 
	REPEAT 
		-- 获得order number 
		FETCH ordernumbers INTO o; 

	-- 结束遍历 
	UNTIL done END REPEAT; 

	-- 关闭游标 
	CLOSE ordernumbers; 
END;

DECLARE语句次序:用DECLARE语句定义的局部变量必须在定义任意游标或任意句柄之前定义,而句柄(handle)必须在游标之后定义。不遵循此顺序将产生错误消息。
通常REPEAT语句的语法使它更适合于对游标进行循环。

使用游标对数据进行实际的处理(完善上述存储过程),该程序使用到上一节的存储过程ordertotal(…)。

CREATE PROCEDURE processorders() 
BEGIN 
	-- 声明变量 
	DECLARE done BOOLEAN DEFAULT 0; 
	DECLARE o INT; 
	DECLARE t DECIMAL(8, 2); 
	
	-- 声明游标 
	DECLARE ORDERNUMBERS cursor 
	FOR 
	SELECT order_num FROM orders; 

	-- 声明程序运行条件 
	-- 该条件指出当SQLSTATE '02000'出现时,SET done=1
	-- SQLSTATE '02000'是一个未找到的条件,当REPEAT由于没有更多的行提供循环不能继续时,出现这个条件
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 

	-- 创建一个表来存储结果
	CREATE TABLE IF NOT EXISTS ordertotals 
		(order_num INT, total DECIMAL(8, 2));

	-- 打开游标 
	OPEN ordernumbers; 

	-- 遍历所有行 
	REPEAT 
		-- 获得order number 
		FETCH ordernumbers INTO o; 

		-- 获得当前order的total
		CALL order total(o, 1, t);

		-- 将当前order和total插入表ordertotals中
		INSERT INTO ordertotals(order_num, total) 
		VALUES(o, t);

	-- 结束遍历 
	UNTIL done END REPEAT; 

	-- 关闭游标 
	CLOSE ordernumbers; 
END;

此存储过程不返回结果,可以查询结果表。

SELECT * FROM ordertotals;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL游标(Cursor)是一种数据库对象,用于从结果集中逐行获取数据。游标可以打开、关闭、滚动和读取记录,类似于指针。使用游标可以在存储过程或函数中处理大量数据,并且可以在处理数据时进行一些特殊的操作,例如将数据插入到另一个表中。 MySQL中有两种类型的游标:静态游标和动态游标。静态游标在使用时会将结果集中的所有数据一次性加载到内存中,因此可以直接访问所有数据。动态游标则是在需要时才加载数据,因此可以节省内存空间。 以下是一个使用游标的示例存储过程: ``` DELIMITER // CREATE PROCEDURE sample_cursor() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE id INT; DECLARE name VARCHAR(255); DECLARE cur CURSOR FOR SELECT id, name FROM users; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO id, name; IF done THEN LEAVE read_loop; END IF; -- 在这里可以对每一行数据进行处理 SELECT CONCAT(id, ': ', name) AS result; END LOOP; CLOSE cur; END // DELIMITER ; ``` 在这个例子中,我们定义了一个游标“cur”,并通过SELECT语句从“users”表中检索数据。然后,我们打开游标并使用FETCH语句逐行获取数据。在每一行数据被读取时,我们可以对其进行处理,例如将其输出到控制台。最后,我们关闭游标并退出存储过程。 需要注意的是,游标在使用完后必须关闭,否则会占用数据库连接和内存资源。此外,使用游标可能会降低数据库性能,因为它需要额外的计算和资源。因此,在使用游标时应该谨慎考虑,尽量采用其他方法来处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随处可见的打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值