16 | 游标:对于数据集中的记录,该怎么逐条处理?
朱晓峰
你好,我是朱晓峰。今天,我来和你聊一聊游标。
咱们前面学习的 MySQL 数据操作语句,都是针对结果集合的。也就是说,每次处理的对象都是一个数据集合。如果需要逐一处理结果集中的记录,就会非常困难。
虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。
这个时候,就可以用到游标。所谓的游标,也就是能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。
这么说可能有点抽象,我举一个生活中的例子,你一看就明白了。比如,你想去某个城市旅游,现在需要订酒店。你打开预订酒店的 App,设置好价格区间后进行搜索,得到了一个酒店列表。接下来,你可能要逐条查看列表中每个酒店的客户评价,最后选择一个口碑不错的酒店。这个逐条搜索并对选中的数据进行操作的过程,就相当于游标对数据记录进行操作的过程。
今天我就来给你讲一讲游标的使用方法,同时还会通过一个案例串讲,帮助你更好地使用游标,让你能够轻松地处理数据集中的记录。
游标的使用步骤
游标只能在存储程序内使用,存储程序包括存储过程和存储函数。关于存储过程,我们上节课刚刚学过,这里我简单介绍一下存储函数。创建存储函数的语法是:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
MySQL中游标的使用方法及其在存储过程中的应用是本文的重点。游标是一种能够对结果集中的每一条记录进行定位,并对记录中的数据进行操作的数据结构。文章详细介绍了游标的使用步骤,包括定义游标、打开游标、读取数据以及关闭游标。通过实际案例演示了如何使用游标处理进货单数据,包括更新进价和库存等操作。此外,还介绍了条件处理语句和流程控制语句在存储过程中的应用。通过本文,读者可以快速了解游标的基本概念和在MySQL中的使用方法,以及如何通过存储过程和游标来处理复杂的数据操作问题。游标是MySQL的重要功能,能够高效地逐条读取结果集中的数据,提供了完美的解决方案。文章还提到了游标会消耗系统资源,建议养成使用完毕即关闭的习惯,以提高系统整体效率。总体而言,本文内容涵盖了游标的基本概念、使用方法以及在存储过程中的应用,对于想要深入了解MySQL游标的读者来说,是一篇值得阅读的文章。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》,新⼈⾸单¥59
《MySQL 必知必会》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- 朱晓峰置顶你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了存储过程。下面是思考题的答案: DELIMITER // CREATE PROCEDURE demo.test(IN a INT,OUT b INT) BEGIN SET b = a + 1; END // DELIMITER ;2021-05-1711
- 虹炎这里没看懂: DECLARE done INT DEFAULT FALSE; -- 用来控制循环结束 -- done 是int 类型,默认又是false?? REPEAT ...... 省略 UNTIL done END REPEAT; -- repeat 内容执行一次后,这个done 应该是false ,就直接退出了循环呢??
作者回复: MySQL没有boolean类型,把true处理为1,把false处理为0。 UNTIL done,表示一直到done为true才退出。
2021-05-184 - 彭彬MySQL的语法变态到了极点,从Oracle中取一点,从SQL Server中取一点,要把学生搞晕
作者回复: ?
2021-09-2222 - lesserror游标这块儿知识比较模糊,以后如果要使用游标,看这一讲基本够了,老师讲的很细致。以下是简单的总结: 1. 游标只能在存储程序内使用,存储程序包括存储过程和存储函数。 2. 游标为逐条读取结果集中的数据,提供了完美的解决方案。因为不需要后端语言写循环,造成与服务器端MySQL程序产生多次交互。 3. 游标用完就要马上关闭,避免造成性能损耗。
作者回复: 对的
2021-04-171 - Judy老师没有讲 数据库的锁机制吗?:(
作者回复: 这个议题,超出了这门课的涉及范围,在丁奇老师的《MySQL实战45讲》中,有详细论述,建议您订阅。
2022-05-10归属地:北京 - 孙念池游标的场景是逐条处理,那么用程序写个循环也能实现同样效果吧,只是比起用sql的游标安全性低?效率低?
作者回复: 我理解你的意思对比存储程序和程序,我的观点是,存储程序的运行效率更高一些,安全性也更好一些,但是维护成本也更高。
2022-02-08 - Geek_9a859adelimiter // create procedure demo.test()-- 创建存储过程 begin declare myid int; declare done int default 1;-- 用于循环中的条件判断如果done为1则继续循环,为0则退出循环 declare cursor_test cursor for-- 定义游标,结果集为test16表中的所有Id select Id from demo.test16; declare continue handler for not found set done = 0;-- 异常处理,当循环中fetch不到下一条数据时修改done的值退出循环 open cursor_test;-- 打开游标 fetch cursor_test into myid;-- 获取一条数据 while done-- 进入循环处理数据 do if myid % 2 = 1 then update demo.test16 set Myquant = Myquant + 2 where Id = myid;-- 当myid为奇数时 else update demo.test16 set Myquant = Myquant + 1 where Id = myid;-- 当myid为偶数时 end if;-- 结束条件判断 fetch cursor_test into myid;-- 获取下一条信息 end while; close cursor_test;-- 关闭游标 end // delimiter ;
作者回复: 请参考思考题答案
2021-12-23 - 大聖CREATE DEFINER=`root`@`localhost` PROCEDURE `test_cursor`() begin declare quant int; declare my_id int; declare done int default FALSE; declare test_cursor cursor for select id, myquant from demo.test; declare continue handler for not found set done = true; open test_cursor; repeat fetch test_cursor into my_id, quant; if my_id % 2 = 0 then select quant as debug, my_id as id; update demo.test set myquant=quant + 1 where id = my_id; else update demo.test set myquant=quant + 2 where id = my_id; end if; until done end repeat; close test_cursor; end
作者回复: 请参考思考题答案
2021-08-02 - 凯-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 条件处理语句 -> -> OPEN cursor_importdata; -- 打开游标 -> FETCH cursor_importdata INTO mystockid,myitemnumber,myquantity,myprice; -- 读入第一条记录 -> REPEAT 打开游标,不能放到DECLARE CONTINUE HANDLER FOR ... 之前么?放到之前就报错。
作者回复: 在存储程序中,定义语句要放在最前面,然后才可以执行打开光标的操作。
2021-06-13 - giteebravo游标 适用于需要对集合中的行进行单独处理的场景。
作者回复: 是的
2021-04-16
收起评论