首页 > 解决方案 > 存储过程只插入一次数据

问题描述

我一直在尝试创建一个存储过程来使用有效日期和有效日期的客户来填充日历表。为了将它们映射到各自的记录,它们被日历表中的外键绑定。

现在,在他们成功注册并创建记录后立即调用存储过程。但是,存储过程只成功运行一次。第一次运行后,不会为后续客户端创建记录。

这是存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `fillGroomerCalendar`(IN `dateStart` DATE, IN `dateEnd` DATE, IN `groomerID` INT)
BEGIN
DECLARE adate date;
    START TRANSACTION;
    WHILE dateStart <= dateEnd DO
        SET adate = (SELECT groomerDate FROM groomer_calendar WHERE groomerDate = dateStart);
        IF adate IS NULL THEN BEGIN
            INSERT INTO groomer_calendar (groomerID, groomerDate, groomerDateStatus) VALUES (groomerID, dateStart, "Open");
        END; END IF;
        SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
    END WHILE;
    COMMIT;
END

感谢您在第一次成功运行后理解为什么失败的任何帮助。

PS:我已经检查了表上是否有导致下一次运行被阻止的锁。但是没有表被锁定。

更新:

根据尼克的评论和他在下面发布的答案,这是更正的程序代码。如果其他人遇到类似问题,这可能会帮助他们找到解决方案。

CREATE DEFINER=`root`@`localhost` PROCEDURE `fillGroomerCalendar`
    (IN `dateStart` DATE, IN `dateEnd` DATE, IN `inGroomerID` INT)
BEGIN
DECLARE adate date;
    START TRANSACTION;
    WHILE dateStart <= dateEnd DO
        SET adate = (SELECT groomerDate FROM groomer_calendar 
            WHERE groomerDate = dateStart AND groomerID = inGroomerID);
        IF adate IS NULL THEN BEGIN
            INSERT INTO groomer_calendar (groomerID, groomerDate, groomerDateStatus) 
                VALUES (inGroomerID, dateStart, "Open");
        END; END IF;
        SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
    END WHILE;
    COMMIT;
END

标签: mysqlsqlstored-procedures

解决方案


您的问题是您没有根据特定groomerID值检查表中的日期,因此当您下次运行具有相似日期的过程时,adate并不是NULL因为之前的插入。所以你需要在 for 中添加groomerID一个SELECT测试adate。但是,您还有第二个问题,因为您的列名与您的参数名匹配,因此尝试使用WHERE groomerID = groomerID将导致相同的问题。您可以将参数名称更改为 egin_groomerID以解决该问题。所以这应该是你的查询:

SET adate = (SELECT groomerDate
             FROM groomer_calendar
             WHERE groomerDate = dateStart
               AND groomerID = in_groomerID);

推荐阅读