[SQL必知必会学习] 12 游标

 

什么是游标?

在数据库中,游标提供了一种灵活的操作方式, 可以让我们从数据结果集中每次提取一条数据记录进行操作。 游标让 SQL 这种面向集合的语言有了面向过程开发的能力。
在 SQL 中, 游标是一种临时的数据库对象, 可以指向存储在数据库表中的数据行指针。 这里游标充当了指针的作用, 我们可以通过操作游标来对数据行进行操作。

使用游标

一般需要经历五个步骤。 不同 DBMS 中, 使用游标的语法可能略有不同。

第一步, 定义游标。

DECLARE cursor_name CURSOR FOR select_statement

适用于 MySQL,SQL Server,DB2 和 MariaDB。
Oracle 或者PostgreSQL, 需要写成:

DECLARE cur_hero CURSOR FOR 
    SELECT hp_max FROM heros;

第二步, 打开游标。

OPEN cursor_name

使用游标, 必须先打开游标。 打开游标的时候 SELECT 语句的查询结果集就会送到游标工作区。

第三步, 从游标中取得数据。

FETCH cursor_name INTO var_name ...

cursor_name 这个游标来读取当前行, 并且将数据保存到 var_name 这个变量中, 游标指针指到下一行。

第四步,关闭游标。

CLOSE cursor_name

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

最后一步, 释放游标。

DEALLOCATE cursor_namec 

使用游标来扫描 heros 数据表中的数据行, 然后累计最大生命值

DELIMITER //
CREATE PROCEDURE `calc_hp_max`()
BEGIN
    -- 创建接收游标的变量
    DECLARE hp INT;
    -- 创建总数变量
    DECLARE hp_sum INT DEFAULT 0;
    -- 第一步, 定义游标。
    DECLARE cur_hero CURSOR FOR SELECT hp_max FROM heros;
    -- 第二步, 打开游标。
    OPEN cur_hero;
    read_loop:LOOP
    -- 第三步, 从游标中取得数据。
    FETCH cur_hero INTO hp;
    SET hp_sum = hp_sum + hp;
    END LOOP;
    -- 第四步,关闭游标。
    CLOSE cur_hero;
    SELECT hp_sum;

END//
DELIMITER ;

16846478-0d376b3417f61049.png

使用游标01.png

系统会提示 1329 错误, 也就是在 LOOP 中当游标没有取到数据时会报的错误。当游标指向到最后一行数据后继续执行会游标溢出报错误,可以通过定义一个 continue 的事件, 指定这个事件发生时修改变量done 的值, 以此来判断游标是否已经溢出

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;  

完善代码为:

DELIMITER //
CREATE PROCEDURE `calc_hp_max`()
BEGIN
    -- 创建接收游标的变量
    DECLARE hp INT;
    -- 创建总数变量
    DECLARE hp_sum INT DEFAULT 0;
    -- 创建结束标志变量
    DECLARE done INT DEFAULT false;
    -- 第一步, 定义游标。
    DECLARE cur_hero CURSOR FOR SELECT hp_max FROM heros;
    -- 指定游标循环结束时的返回值
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
    -- 第二步, 打开游标。
    OPEN cur_hero;
    read_loop:LOOP
    -- 第三步, 从游标中取得数据。
    FETCH cur_hero INTO hp;
    -- 判断游标的循环是否结束
    IF done THEN
        LEAVE read_loop;
    END IF; 
    SET hp_sum = hp_sum + hp;
    END LOOP;
    -- 第四步,关闭游标。
    CLOSE cur_hero;
    SELECT hp_sum;

END//
DELIMITER ;

16846478-f4367b07b864bdc0.png

使用游标02.png

16846478-9a62f9bf64124366.png

游标.png

参考资料:

练习数据库使用 SQL必知必会专栏(极客时间)中的作者提供的 王者荣耀数据库以及NBA数据库
练习系统 MySQL Server version: 5.7.26-0ubuntu0.16.04.1 (Ubuntu)

SQL必知必会专栏(极客时间)链接:
http://gk.link/a/103Sm

《MySQL必知必会》学习笔记(24-29):

https://www.jianshu.com/p/ee15e71ab1b8

此篇内容:使用游标、使用触发器、管理事务处理、全球化和本地化、安全管理、数据库维护


GitHub链接:
https://github.com/lichangke/LeetCode

知乎个人首页:
https://www.zhihu.com/people/lichangke/

简书个人首页:
https://www.jianshu.com/u/3e95c7555dc7

个人Blog:
https://lichangke.github.io/

欢迎大家来一起交流学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle PL/SQL是Oracle数据库的编程语言,它允许开发人员编写存储过程、触发器、函数和包等数据库对象,以实现更高效、安全和可靠的应用程序。以下是一些Oracle PL/SQL识点: 1. PL/SQL基础语法:包括变量定义、控制结构、循环语句、异常处理等。 2. 存储过程:存储过程是一组SQL语句的集合,可以在其中定义变量、使用控制结构、调用其他存储过程等。 3. 触发器:触发器是一种特殊的存储过程,它在数据库表上的特定事件发生时自动执行一些操作。 4. 函数:函数是一种可以接受输入参数并返回结果的代码块,它可以用于处理数据、计算等操作。 5. 包:包是一种可以封装存储过程、函数和变量的方式,它可以提供更好的代码管理和组织。 6. 游标游标是一种可以遍历查询结果集的机制,它可以用于在PL/SQL中处理大量数据。 7. 动态SQL:动态SQL是一种可以在运行时构建和执行SQL语句的机制,它可以提供更大的灵活性和自由度。 8. 性能优化:在编写PL/SQL代码时需要注意性能问题,如尽量避免使用循环、减少数据库访问次数等。 9. 安全性:在编写PL/SQL代码时需要注意安全问题,如避免SQL注入攻击、对敏感数据进行加密等。 以上是Oracle PL/SQL的一些识点,掌握它们可以帮助开发人员更好地使用Oracle数据库进行应用程序开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

墨1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值