MySQL 存储过程 - 嵌套循环出错?

标签 mysql datetime stored-procedures cursor

下面我有一个中等大小的存储过程。我的问题是它没有做任何事情,而且我不知道为什么。

1.) 首先,代码:

    DROP PROCEDURE IF EXISTS deleteabundant_fixshared_shiftResources;
    DELIMITER //
    CREATE PROCEDURE deleteabundant_fixshared_shiftResources ()
    BEGIN
      DECLARE finish_flag BOOLEAN DEFAULT FALSE;
      DECLARE id INT(11);
      DECLARE startTime DATETIME;
      DECLARE endTime DATETIME;
      DECLARE shid INT(11);
      DECLARE resid INT(11);

      DECLARE id_inner INT(11);
      DECLARE startTime_inner DATETIME;
      DECLARE endTime_inner DATETIME;
      DECLARE shid_inner INT(11);
      DECLARE resid_inner INT(11);
      DECLARE cr130 CURSOR FOR SELECT shift_resource_id, start_date, end_date, shift_id, resource_id FROM temp_shift_resource;
      DECLARE cr131 CURSOR FOR SELECT shift_resource_id, start_date, end_date, shift_id, resource_id FROM temp_shift_resource;
        DECLARE CONTINUE HANDLER  FOR NOT FOUND SET finish_flag = TRUE; 

    START TRANSACTION;  



    OPEN cr130;
    OPEN cr131;
        OUTERLOOP: LOOP
        FETCH cr130 into id, startTime, endTime, shid, resid;
        IF finish_flag THEN LEAVE OUTERLOOP; END IF;
            INNERLOOP: LOOP
            FETCH cr131 INTO id_inner, startTime_inner, endTime_inner, shid_inner, resid_inner;
        IF finish_flag THEN LEAVE INNERLOOP; END IF;
        IF (id!=id_inner) THEN
        IF (resid=resid_inner AND shid_inner!=9) THEN

     -- logic to determine if the dates are wrong:
            IF (startTime<=startTime_inner AND endTime>=endTime_inner) THEN
                INSERT INTO repairchange ( shift_resource_id, changetype, shift_id, resource_id, start_date, end_date ) 
                                  VALUES ( id_inner, "FD", shid_inner, resid_inner, startTime_inner, endTime_inner );
                DELETE FROM temp_shift_resource WHERE shift_resource_id = id_inner;
            ELSEIF (endTime>=endTime_inner AND startTime<=endTime_inner) THEN
                INSERT INTO repairchange ( shift_resource_id, changetype, shift_id, resource_id, start_date, end_date ) 
                                  VALUES ( id_inner, "FU", shid_inner, resid_inner, startTime_inner, endTime_inner );
                UPDATE temp_shift_resource set endTime_inner=(startTime - INTERVAL 1 DAY) where shift_resource_id = id_inner;
            ELSEIF (startTime<=startTime_inner AND endTime>=startTime_inner) THEN
                INSERT INTO repairchange ( shift_resource_id, changetype, shift_id, resource_id, start_date, end_date ) 
                                  VALUES ( id_inner, "FU", shid_inner, resid_inner, startTime_inner, endTime_inner );
                UPDATE temp_shift_resource set startTime_inner=(endTime + INTERVAL 1 DAY) where shift_resource_id = id_inner;
            END IF;
    END IF;     
    END IF;
            END LOOP INNERLOOP;
    SET finish_flag = FALSE;
      END LOOP OUTERLOOP;
      CLOSE cr130;
      CLOSE cr131;



    COMMIT;

    END //
    DELIMITER ;

    call deleteabundant_fixshared_shiftResources();

2.)我想要做什么的描述:

基本上,我有一 table 的工作类次。由于代码错误,其中一些类次分配了错误的日期,我必须修复数据库。

  • 我必须遍历整个表,并比较分配给同一resource_id(代表一个人)的行。因此,如果一个人有两个轮类,例如(2016-05-10 到 2016-05-20)和(2016-05-15 到 2016-05-23),我必须修复它,以便其中之一将被修剪为(2016-05-10 至 2016-05-14)和(2016-05-15 至 2016-05-23)。
  • 标记为 shift_id=9 的夜类类次,不得进行任何修改。
  • 如果发生更改或删除,我会将行插入到 RepairChange 表中

3.) 该过程运行,但不执行任何操作。我在数据库中有错误行的示例,其中一个示例就是我上面写的示例。我怀疑这是嵌套循环,因为我想循环并获取同一个表,但我没有找到任何内容。 我收到消息了

0 行受到影响,1 条警告:1329 无数据 - 已提取、选择或处理零行

但我以前见过这种情况,并且我的存储过程即使输出此警告也能正常工作。

欢迎任何想法或提示。感谢您的宝贵时间!

最佳答案

经过相当多的调试后我发现了:

我在两个循环之前打开了光标。这意味着,在第一次遍历内循环之后,光标站在表的最后一行的+1处,并且当新的外循环迭代开始第二次内循环迭代时,光标仍然位于末尾位置。

因此它没有运行。我将内光标的打开和关闭替换为外循环,现在它可以正常工作了。

关于MySQL 存储过程 - 嵌套循环出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567023/

相关文章:

entity-framework - Entity Framework 代码优先和存储过程

tsql - 如何从 CTE 调用带参数的存储过程(无光标)

java - 如何在oracle存储过程中返回自己类型的数据?

Mysql Count查询优化

php - 根据服务器时区动态打印时间

ios - 将NSDate转为UTC字符串再转回NSDate,结果不一样

Javascript equlivent 到 .Net TimeZoneInfo.ConvertTimeBySystemTimeZoneId

mysql - 根据 SQL 中的日期计算百分位数

php - PDO插入和执行

mysql - phpmyadmin中创建存储过程的问题,列数mysql.proc不正确