MySQL高级篇-游标

举报
波波烤鸭 发表于 2022/03/30 23:31:49 2022/03/30
【摘要】 MySQL中的游标 1.什么是游标   虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一...

在这里插入图片描述

MySQL中的游标

1.什么是游标

  虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是 随意定位到某一 条记录 ,并对记录的数据进行处理。

  这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。

  在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用 ,我们可以通过操作游标来对数据行进行操作。

  MySQL中游标可以在存储过程和函数中使用。

在这里插入图片描述

2.使用游标的步骤

  游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。如果我们想要使用游标,一般需要经历四个步骤。不同的 DBMS 中,使用游标的语法可能略有不同。

2.1 声明游标

使用DECLARE关键字来声明游标,其语法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

  
 
  • 1

要使用 SELECT 语句来获取数据结果集,而此时还没有开始遍历数据,这里 select_statement 代表的是SELECT 语句,返回一个用于创建游标的结果集。

比如:

DECLARE cur_score CURSOR FOR 
	SELECT stu_id,grade FROM score;

  
 
  • 1
  • 2

2.2 打开游标

打开游标的语法如下:

OPEN cursor_name

  
 
  • 1

当我们定义好游标之后,如果想要使用游标,必须先打开游标。打开游标的时候 SELECT 语句的查询结果集就会送到游标工作区,为后面游标的逐条读取结果集中的记录做准备.

open cur_score;

  
 
  • 1

2.3 使用游标

语法如下:

FETCH cursor_name INTO var_name [, var_name] ...

  
 
  • 1

  这句的作用是使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。

注意:var_name必须在声明游标之前就定义好.

FETCH cur_score INTO stu_id, grade ;

  
 
  • 1

注意:游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时候,MySQL 会提示错误。

2.4 关闭游标

关闭游标使用CLOSE关键字

CLOSE cursor_name;

  
 
  • 1

  有 OPEN 就会有 CLOSE,也就是打开和关闭游标。当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源 ,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。

  关闭游标之后,我们就不能再检索查询结果中的数据行,如果需要检索只能再次打开游标。

CLOSE cur_score;

  
 
  • 1

3.案例讲解

创建一个存储过程,实现累加考试成绩最高的几个学员的总分,直到总和大于我们传入的limit_total_grade的参数值,并且返回累加的人数:total_count;

CREATE PROCEDURE PROC_CURSOR(IN LIMIT_TOTAL_GRADE INT, OUT TOTAL_COUNT INT )
BEGIN
	# 声明相关的变量
	DECLARE SUM_GRADE INT DEFAULT 0; # 累加的总成绩
	DECLARE CURSOR_GRADE INT DEFAULT 0; # 记录某条成绩
	DECLARE SCORE_COUNT INT DEFAULT 0; # 记录累加的记录数
	
	# 定义游标
	DECLARE SCORE_CURSOR CURSOR FOR SELECT GRADE FROM SCORE ORDER BY GRADE ;
	# 打开游标
	OPEN SCORE_CURSOR;
	# 使用游标
	REPEAT
		FETCH SCORE_CURSOR INTO CURSOR_GRADE; # 从游标中获取一条数据
		SET SUM_GRADE = SUM_GRADE + CURSOR_GRADE; # 成绩累加
		SET SCORE_COUNT = SCORE_COUNT + 1; # 记录累加的次数
		UNTIL SUM_GRADE > LIMIT_TOTAL_GRADE # 退出条件
	END REPEAT ;
	# 复制OUT参数
	SET TOTAL_COUNT = SCORE_COUNT;
	# 关闭游标
	CLOSE SCORE_CURSOR;
END;

DROP PROCEDURE PROC_CURSOR

# 调用存储过程
SET @s_count = 0;
CALL PROC_CURSOR(400,@s_count) ;

SELECT @s_count;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

4.小结

  游标是 MySQL 的一个重要的功能,为 逐条读取 结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。

  但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行 加锁 ,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会 消耗系统资源 ,造成内存不足,这是因为游标是在内存中进行的处理。

建议:养成用完之后就关闭的习惯,这样才能提高系统的整体效率。

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/123178884

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。