【问题标题】:MySQL Stored Routine ErrorMySQL 存储例程错误
【发布时间】:2018-08-07 05:22:05
【问题描述】:

我现在正在 MySQL 中创建存储例程,查询时出现此错误。

SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your SQL server version for the right syntax to use near 'DATE_ADD(sDate, INTERVAL 1 DAY); END WHILE; END IF; END' at line 30

这是我的查询:

BEGIN
DECLARE code CHAR (5) DEFAULT (00000);
IF (SELECT COUNT(allocationDate) FROM ROOM_ALLOCATION WHERE allocationDate 
 BETWEEN startDate AND (SELECT DATE_SUB(endDate,INTERVAL 1 DAY)) > 0) THEN    
    WHILE DATEDIFF(sDate, eDate) <> 0 DO
        SET code = 0;
        WHILE code = 0 DO
            SET code =(SELECT LEFT(MD5(RAND()*100), 5));
            IF exists (SELECT * FROM BOOKING_DETAIL WHERE bDetailCode LIKE code)
            THEN 
                SET code = 0;
        END IF;
        END WHILE;
        INSERT INTO ROOM_ALLOCATION (rAllocationCode, roomID, bDetailID, allocationDate)
        VALUES
        (rAlloCode, roIDm, bDetID, sDate);
        DATE_ADD(sDate, INTERVAL 1 DAY);
    END WHILE;
END IF;
END

我很绝望,这个查询哪里出错了?

先谢谢你。

问候

【问题讨论】:

  • 你没有对这个声明做任何事情DATE_ADD(sDate, INTERVAL 1 DAY);你想用它做什么?选择或设置变量?

标签: mysql loops stored-procedures while-loop do-while


【解决方案1】:

sDate 需要声明为变量,我假设您将 startDate 传递给过程。

您将 sDate 设置为等于 startDate,现在允许您使用 DATEADD 操作 sDate。 DATEADD 返回值,它不修改变量;所以你使用 SET 并将 DATEADD 的返回值分配回 sDate 以便你的 WHILE 循环在下一个循环中使用它。

因为 eDate 不存在,我已经修改了 eDate 的实例以使用 endDate 我假设您也传入了。因为您不修改该值,所以将其重新分配给另一个变量是没有意义的。

BEGIN
DECLARE code CHAR (5) DEFAULT (00000);
DECLARE sDate DATETIME = startDate;
IF (SELECT COUNT(allocationDate) FROM ROOM_ALLOCATION WHERE allocationDate 
 BETWEEN startDate AND (SELECT DATE_SUB(endDate,INTERVAL 1 DAY)) > 0) THEN    
    WHILE DATEDIFF(sDate, endDate) <> 0 DO
        SET code = 0;
        WHILE code = 0 DO
            SET code =(SELECT LEFT(MD5(RAND()*100), 5));
            IF exists (SELECT * FROM BOOKING_DETAIL WHERE bDetailCode LIKE code)
            THEN 
                SET code = 0;
        END IF;
        END WHILE;
        INSERT INTO ROOM_ALLOCATION (rAllocationCode, roomID, bDetailID, allocationDate)
        VALUES
        (rAlloCode, roIDm, bDetID, sDate);
        SET sDate = DATE_ADD(sDate, INTERVAL 1 DAY);
    END WHILE;
END IF;
END

【讨论】:

  • 小问题,在其他方面很好的答案。要将 sDate 设置为变量声明中的输入参数,请使用 DECLARE sDate DATETIME DEFAULT(startDate);使用 '=' 赋值会产生语法错误。
猜你喜欢
  • 2016-02-08
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多