mysql存储过程游标的使用 mysql游标是什么

mysql存储过程游标的使用 mysql游标是什么

在这里插入图片描述

MySQL中的游标

1.什么是游标

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

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

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

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

mysql存储过程游标的使用 mysql游标是什么

在这里插入图片描述

2.使用游标的步骤

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

2.1 声明游标

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

DECLARE cursor_name CURSOR FOR select_statement;

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

比如:

DECLARE cur_score CURSOR FOR SELECT stu_id,grade FROM score;

2.2 打开游标

打开游标的语法如下:

OPEN cursor_name

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

open cur_score;

2.3 使用游标

语法如下:

FETCH cursor_name INTO var_name [, var_name] ...

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

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

FETCH cur_score INTO stu_id, grade ;

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

2.4 关闭游标

关闭游标使用CLOSE关键字

CLOSE cursor_name;

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

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

CLOSE cur_score;

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;

4.小结

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

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

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

本文【mysql存储过程游标的使用 mysql游标是什么】由作者: 递归 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4623.html

(0)
上一篇 2023-03-17 08:03:40
下一篇 2023-03-17 08:06:03

相关推荐

  • markdown语法菜鸟教程 markdown适合做笔记吗

    在我的工作中,我经常要写代码、写与代码相配套的文档、创建网页、进行文本恢复项目。我在学校的时候还写过几篇正式的论文,也包括写课堂笔记,几乎每节课都写。 我几乎在我所有的写作中都使用 Markdown,它对我来说是一个节省时间的好工具。 在这篇文章中,我将分享我使用 Markdown 的体会。你将会了解以下内容: 什么是 Markdown ? 它是怎么工作的?…

    2023-03-14
    500
  • 汇编编译器的实现原理,编译器的工作原理

    相信许多对计算机有所了解的人都会听说过这样一句话:计算机只读得懂0和1。的确,计算机是只读的懂0和1,当然这里的0和1并不是数字0和1,而是泛指两种对立的状态,比如:电灯的亮和灭、开关的开和关、电压的高电平和低电平。 而对于早期的程序员来说,这一串串的0和1是唯一可以和电脑交互的方式。当时程序员编程的方式是在卡片上打上孔(有孔和没孔代表0和1),然后将打完孔…

    2023-03-14
    200
  • 上位机与plc通信 上位机用什么软件与PLC通讯

    今天我给大家分享的内容是PLC,带大家简单认识一下PLC。主要从以下五个给大家简单介绍一下。 1、先给大家讲一下什么是控制系统以及控制器。 不论在工业领域,还是现实生活中,比如空调、加湿器、冰箱、电梯或是工厂用的各种设备,这些设备它们都存在一个控制系统的,我们正是通过这个控制系统才让设备按照我们的想法去完成相应的功能。 而这个控制系统的核心就是控制器,这个控…

    2023-03-20
    000
  • err23数据错误循环冗余检查

    在平时的工作中,我们常常会拷贝数据,但是在拷贝的过程中却发现提示了数据错误循环冗余检查,那么当你遇到Win7提示数据错误循环冗余检查怎么办?下面可可就来教大家Win7提示数据错误循环冗余检查的解决方法吧! 方法/步骤: 1、比如更新驱动程序等操作,出现数据错误(循环冗余检查)的故障,一般是硬盘读写出错了。 2、如果是光盘、U盘、硬盘拷贝数据出现这样的问题,也…

    2023-03-14
    100
  • javajdk环境变量配置不成功_java安装后环境变量配置

    JDK的安装与环境变量的配置 1.jdk的安装: jdk的安装,傻瓜式安装,一路下一步 jdk中的两个文件夹 lib bin lib:存放的打包好的jar包 bin:所有可执行的文件 2.环境变量的配置 : 右键单击此电脑—属性—高级系统设置—高级—环境变量 在下方系统变量中–新建 新建后输入变量名称:JAVA_HOME 之后,找到java中jdk所在的文件…

    2023-03-09
    500
  • 泛域名解析是指域名解析服务器,无法启动iisweb服务器

    一、ssl证书支持泛解析教程 1、进入DNS控制后台,鼠标右键点击rtj.n et,在弹出的对话框中,选择新建一个域名,然后在新建DNS域文本框中输入“*”,创建一个名为*的二级区域。最后点击确定。 一般这个区域DNS服务器是允许建立的,接着在.rtj.n et 区域中创建一个空主机名的记录。同上一个步骤一样,右键点击,在弹出对话框中选择新建主机,然后在名称…

    2023-03-14
    300
  • python怎么引入数学函数_python计算函数值

    前言 上一篇文章中介绍了Python定义函数参数和传参的实现,详情可查阅:Python编程:函数参数定义与传递方式。本期内容主要详细介绍如何定义函数输入参数以及实战规则。老规矩,辅助加深理解的示例代码,比便于实操。 闲话少叙,开始正文——记得点赞 + 关注@传新视界 ,前进不迷路 ^_^ 本文内容主要涉及如下几个主题方法,文章有点长,请收藏以便查阅。 函数参…

    2023-03-09
    700
  • 智能指针初始化

    本节将实现一个名为SmartPointer的简化版本的shared_ptr模板类,相关C++代码如下。 知识产权协议 允许以教育/培训为目的向学生或受众进行免费引用,展示或者讲述,无须取得作者同意。 不允许以电子/纸质出版为目的进行摘抄或改编。 //Project – SmartPointer #include <iostream> using …

    2023-03-21
    000
  • 全栈工程师需要掌握哪些知识_全栈工程师需要学多久

    Web前端工程师可能大家知道是干嘛的,你知道Web全栈工程师是什么吗?Web全栈工程师也是前端开发工程师的一种,而且通过前端培训也是能成为Web全栈工程师的。那么,学web前端开发需要多久?Web全栈工程师需要掌握哪些技术呢? Web全栈工程师是什么? Web全栈开发工程师,主要职责是利用 HTML/CSS/Java/DOM/Flash等各种Web技术进行产…

    2023-03-18
    200
  • 五笔入门教程 自学五笔技巧

    作为一个用了10年五笔的计算机行业从业者。 每次有人见到我用五笔,都惊讶不已!!! 哇塞,你用的五笔输入法吗? 今天抽时间整理了一下,我学习五笔的方法,用时三个月,希望可以帮助到您~ 第一步:树立信念 不管是做什么事,信念是第yi步,有了信念,那才能有动力。 我们当时全班有五十多位同学,五笔学习呢,一共学了一个月,许多人一开始没学几天就放弃了。 zui后坚持…

    2023-03-21
    100

发表回复

登录后才能评论
返回顶部
错说博客上线啦!