mysql笔记(21)--使用游标

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql笔记(21)--使用游标相关的知识,希望对你有一定的参考价值。

什么是游标?

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

  • MySQL游标只能用于存储过程(和函数)。

为什么需要游标?

有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。

如何使用游标?

在这里插入图片描述

如何创建游标?

在创建存储过程中,在存储体体中使用 DECLARE 游标名 CURSOR 创建游标,后面跟 for 定义 查询语句。

DROP PROCEDURE IF EXISTS mysql_must_study.processorders;

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

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

如何打开和关闭游标?

使用 OPEN CLOSE 在存储过程打开和关闭游标。

DROP PROCEDURE IF EXISTS mysql_must_study.processorders;

DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
	DECLARE ordernumbers CURSOR 
	FOR 
	SELECT order_num 
	FROM mysql_must_study.orders; 

	OPEN ordernumbers;

	CLOSE ordernumbers;
END$$
DELIMITER ;

如何使用游标数据?

在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)。

  • DECLARE o INT; 定义变量
  • FETCH ordernumbers INTO o; 将检索的数据放到变量 o 里面。
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
	DECLARE o INT;
	
	DECLARE ordernumbers CURSOR 
	FOR 
	SELECT order_num 
	FROM mysql_must_study.orders; 

	OPEN ordernumbers;

	FETCH ordernumbers INTO o;

	CLOSE ordernumbers;
END

在这里插入图片描述


CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
	DECLARE done BOOLEAN DEFAULT 0;
	DECLARE o INT;
	
	DECLARE ordernumbers CURSOR 
	FOR 
	SELECT order_num 
	FROM mysql_must_study.orders; 

	DECLARE CONTINUE handler FOR SQLSTATE '02000' SET done=1;	

	OPEN ordernumbers;
	
	REPEAT 
		FETCH ordernumbers INTO o;
	until done END REPEAT ;

	CLOSE ordernumbers;
END

当遍历完所有行后停止,判断条件是 '02000'
在这里插入图片描述
在这里插入图片描述

实际处理数据案例

CREATE DEFINER=`root`@`localhost` PROCEDURE `mysql_must_study`.`processorders`()
BEGIN
	DECLARE done BOOLEAN DEFAULT 0;
	DECLARE o INT;
	DECLARE t decimal(8,2);
	
	DECLARE ordernumbers CURSOR 
	FOR 
	SELECT order_num 
	FROM mysql_must_study.orders; 

	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 
		FETCH ordernumbers INTO o;
		CALL mysql_must_study.ordertotal(o,1,t);
		INSERT INTO ordertotals(order_num,total)
		VALUES(o,t);
	until done END REPEAT ;


	CLOSE ordernumbers;
END

在这里插入图片描述

执行存储过程,然后查询新生的表

CALL processorders(); 
SELECT *
FROM ordertotals;

在这里插入图片描述

这样,我们就得到了存储过程、游标、逐行处理以及存储过程调用其他存储过程的一个完整的工作样例

总结

  • 游标只能配合存储过程使用,作为定义 select 的结果集合。
  • 使用游标必须开启和关闭
  • 使用fetch 获取游标集合内元素
  • 可以循环遍历游标内元素,并与其他变量进行操作。

以上是关于mysql笔记(21)--使用游标的主要内容,如果未能解决你的问题,请参考以下文章

快进来,详解MySQL游标

MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

21 使用游标

mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答

Oracle与Mysql内嵌游标的使用示例