游标
游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
游标的特性
游标具有以下三个特性:
- 不敏感(Asensitive)
数据库可以选择不复制结果集 - 只读(Read only)
- 不滚动(Nonscrollable)
游标只能向一个方向前进,并且不可以跳过任何一行数据
游标的优点
游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。
游标的缺点
游标的主要缺点是性能不高。游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。
游标的适用场景
MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。
使用步骤
- 定义游标:
Declare
游标名称CURSOR for table;
(table
也可以是select
出来的结果集) - 打开游标:
Open
游标名称; - 从结果集获取数据到变量:
fetch
游标名称into field1,field2;
- 执行语句:执行需要处理数据的语句
- 关闭游标:
Close
游标名称;
示例
DELIMITER //CREATE PROCEDURE Proc_ProcessClassInfo(in classUid varchar(36))BEGIN /* 定义变量*/ DECLARE courseUid VARCHAR(36); # 声明游标结束变量 DECLARE done INT DEFAULT 0; /* 声明游标*/ DECLARE cur_list CURSOR FOR SELECT CourseUid FROM class_course WHERE ClassUid=classUid; /*游标中的内容执行完后将done设置为1 */ DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET courseUid=''; /* 打开游标 */ OPEN cur_list; /* 执行循环 */ read_loop : LOOP /* 取游标中的值*/ FETCH cur_list INTO courseUid; /* 判断是否结束循环,一定要放到FETCH之后,因为在fetch不到的时候才会设置done为1 如果放到fetch之前,先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次*/ IF done THEN LEAVE read_loop; END IF; /*指定课件学习进度100%的内容*/ CALL Proc_ProcessCourseComplete(courseUid); END LOOP read_loop; /* 释放游标 */ CLOSE cur_list;END //DELIMITER ;
变量声明Declare
需要注意的地方:
Declare
声明本地变量必须放在最前列Declare
一般是先声明本地变量,再是游标,然后是条件和handler
Declare
声明的本地变量名称与声明的游标名称不能相同