欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL游标的使用步骤

程序员文章站 2022-04-12 20:22:51
使用游标的步骤大致为: 创建游标 打开游标 循环读取,难点在于判断数据是否已经读取完 关闭游标 假设现在有一个netbar_duty表用于存放交接班数据(包含交接班的开始时间d...

使用游标的步骤大致为:

创建游标 打开游标 循环读取,难点在于判断数据是否已经读取完 关闭游标

假设现在有一个netbar_duty表用于存放交接班数据(包含交接班的开始时间dutyBeginTime和结束时间dutyEndTime),现在使用游标来遍历每个交接班的开始时间和结束时间。

SQL脚本中已经针对游标的用法给出了详细的注释。

CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `testCursor`()
    SQL SECURITY INVOKER
lab:BEGIN

    DECLARE begin_time DATETIME;
    DECLARE end_time DATETIME;

    -- 专门用来标记数据行是否读取完成
    DECLARE done INT DEFAULT FALSE;  

    -- 创建一个游标cur,数据集为从netbar_duty表中获取的交接班的开始时间和结束时间
    DECLARE cur CURSOR FOR SELECT dutyBeginTime, dutyEndTime FROM netbar_duty;

    -- 虽然FETCH无法返回数据行是否已经读取完,但在数据行读取完之后再次读取会引发NOT FOUND异常,
    -- 所以这里我们针对NOT FOUND异常来对done变量进行赋值,从而标记数据已经读取完成。
    -- DECLARE...HANDLER的具体用法见:https://blog.csdn.net/china_jeffery/article/details/79284051
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


    -- 打开游标cur
    OPEN cur;  

    -- 循环读取
    read_loop:
    LOOP
        -- 获取一条数据,游标自动指向下一行
        FETCH cur INTO begin_time, end_time;  

        -- 检查数据是否读取完成
        IF done THEN  
            LEAVE read_loop;
        END IF;  

        -- 模拟使用刚才拿出来的数据
        select begin_time, end_time;

    END LOOP;  

    -- 关闭游标
    CLOSE cur;  

END