35-游标

作者: 紫荆秋雪_文 | 来源:发表于2022-09-14 09:56 被阅读0次

一、游标(光标)的简绍

我们可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法再结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是 随意定位到某一条记录,并对记录的数据进行处理。这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标 充当了指针的作用,我们可以通过操作游标来对数据行进行操作。MySQL中游标可以在存储过程和函数中使用。

二、使用游标

游标必须在声明处理程序之前声明,并且变量和条件还必须在声明游标或处理程序之前被声明。如果我们想要使用游标,一般需要经历四个步骤

1、声明游标

  • 在 MySQL 中,使用 DECLARE 关键字来声明游标,其语法的基本形式如下
DECLARE cursor_name CURSOR FOR select_statement;
  • 要使用 SELECT 语句来获取数据结构集,而此时还没有开始遍历数据,这里 select_statement 代表的是 SELECT 语句,返回一个用于创建游标的结果集
DECLARE cur_emp CURSOR FOR SELECT employee_id,salary FROM employees;
或
DECLARE cursor_fruit CURSOR FOR SELECT f_name, f_price FROM fruits ;

2、打开游标

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

3、使用游标(从游标中取得数据)

  • 语法如下
FETCH cursor_name INTO var_name [, var_name] ...
  • 这句的作用是使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游
    标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可
FETCH cur_emp INTO emp_id, emp_sal ;
  • 注意:游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时
    候,MySQL 会提示错误。

4、关闭游标

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

5、实战

创建存储过程“get_count_by_limit_total_salary()”,声明IN参数 limit_total_salary,DOUBLE类型;声明
OUT参数total_count,INT类型。函数的功能可以实现累加薪资最高的几个员工的薪资值,直到薪资总和
达到limit_total_salary参数的值,返回累加的人数给total_count

  • 代码
DELIMITER $
CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE, OUT total_count INT)
BEGIN
    DECLARE sum_salary DOUBLE DEFAULT 0; #记录累加的总工资
    DECLARE cursor_salary DOUBLE DEFAULT 0; #记录某一个工资值
    DECLARE emp_count INT DEFAULT 0;
    #记录循环个数
    # 定义游标
    DECLARE emp_cursor CURSOR FOR SELECT salary FROM emp ORDER BY salary DESC;

    #打开游标
    OPEN emp_cursor;

    cursor_loop:
    LOOP
        #判断结束条件
        IF sum_salary >= limit_total_salary THEN
            LEAVE cursor_loop;
        END IF;
        # 使用游标,从游标中获取数据
        FETCH emp_cursor INTO cursor_salary;
        # 工资累加
        SET sum_salary = sum_salary + cursor_salary;
        # 计数器加 1
        SET emp_count = emp_count + 1;
    END LOOP;

    #关闭游标
    CLOSE emp_cursor;

    SET total_count = emp_count;
END $
DELIMITER ;
  • 定义变量
SET @in = 200000;
SET @count = 0;
  • 调用
CALL get_count_by_limit_total_salary(@in, @count);
  • 输出变量
SELECT @count;

三、小结

游标是 MySQL 的一个重要的功能,为 逐条读取 结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行 加锁 ,这样在业务并发量大
的时候,不仅会影响业务之间的效率,还会 消耗系统资源 ,造成内存不足,这是因为游标是在内存中进行的处理

相关文章

  • 35-游标

    一、游标(光标)的简绍 我们可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIM...

  • MongoDB之文档游标

    游标 查询操作返回的结果游标 游标的迭代与操作 db.collecton.find() 返回一个文档集合游标,在不...

  • sqlserver 游标

    游标更新删除当前数据 1.声明游标 2.打开游标 3.声明游标提取数据所要存放的变量 4.定位游标到哪一行 5.关...

  • Oracle 存储过程学习笔记

    1、存储过程简单实例 2.游标实现方式 显式游标实现方式(可多值) 隐式游标(可以实现查询多值) 带有参数的游标(...

  • sql server 游标

    定位到结果集中某一行 游标分类 静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变。 动态游...

  • 实验九 游标操作和自定义函数

    一.实验目的: 掌握游标的声明、游标打开、标数据的提取、游标的关闭和游标的释放 掌握标量值函数的定义与调用 掌握内...

  • sql 游标,函数,触发器

    游标是数据库的一种机制或类型,可以存储结果集 ,迭代和遍历结果集,oracle中游标大致分为显示游标和隐式游标。 ...

  • GraphQL(七):GraphQL分页及原理分析

    基于GraphQl-JAVA 11.0 GraphQL的分页是基于游标的,游标分页的方式可以提升用户体验,关于游标...

  • SQL-游标循环记录

    declare @temp_temp int --创建游标 --Local(本地游标) DECLARE a...

  • Mongodb学习笔记(四)之 游标操作

    游标操作 cursor (1)游标是什么?通俗来说,游标不是查询结果,而是查询的返回资源或接口。(2)通过这个接口...

网友评论

    本文标题:35-游标

    本文链接:https://www.haomeiwen.com/subject/ixkhortx.html