【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();
原文地址:https://www.cnblogs.com/mindzone/p/13935335.html