【DataBase】MySQL 31 游标
游标 Cursor
游标是用来存储查询的结果集的数据类型,也称为是光标
在存储过程和函数中可以使用光标对结果集进行循环的处理
光标的使用包括1、声明,2、开启,3、关闭,4、Fetch
游标仅用于存储函数和
语法 Syntax
创建游标
DECLARE 游标名 CURSOR FOR 查询SQL;
打开游标
OPEN 游标名;
关闭游标
CLOSE 游标名;
使用游标
FETCH 游标名 INTO 变量1,变量2,...;
看完介绍以后发现其实是一个迭代器
查询的结果也是一张表,游标就从0的位置起始,FETCH就是一行一行读取结果记录
演示案例:
DELIMITER $ CREATE PROCEDURE cursorForAdmin() BEGIN -- 创建写入的变量 DECLARE CID INT(11); DECLARE CUSERNAME VARCHAR(24); DECLARE CPASSWORD VARCHAR(24); -- 声明游标 DECLARE adminCursor CURSOR FOR SELECT * FROM admin; -- 开启游标 OPEN adminCursor; -- 使用游标读取一行记录赋值到上述的变量中 FETCH adminCursor INTO CID, CUSERNAME, CPASSWORD; SELECT CID, CUSERNAME, CPASSWORD; -- 关闭游标 CLOSE adminCursor; END
调用:
CALL cursorForAdmin();
第二次调用时把游标的推进到下一个行记录,写入上述的变量中
变量被重新赋值,记录显示新的结果,
如果游标已经推进到最后一行记录时,继续向下执行,发现已经没有记录了
存储过程会报错:
NO Data ,zero Rows Fectched SELECTED, OR PROCESSED
循环获取游标实现:
遍历首先需要获取查询结果的总记录数
使用 COUNT(*) 来获取
DELIMITER $ CREATE PROCEDURE cursorForAdminByFor() BEGIN # 展示用的变量 DECLARE CID INT(11); DECLARE CUSERNAME VARCHAR(24); DECLARE CPASSWORD VARCHAR(24); # 结束循环变量 DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; # 游标变量 DECLARE adminCursor CURSOR FOR SELECT * FROM admin; # 打开游标 OPEN adminCursor; # 循环开始 REPEAT FETCH NEXT FROM adminCursor INTO CID, CUSERNAME, CPASSWORD; SELECT CID, CUSERNAME, CPASSWORD; UNTIL done END REPEAT; # 关闭游标 CLOSE adminCursor; END
调用:
CALL cursorForAdminByFor();