使用游标的步骤大致为:

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

假设现在有一个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的具体用法见:http://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
Logo

更多推荐