MySQL Stored Routine Error

0

Я создаю хранимую процедуру в 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

Я в отчаянии, где я ошибся с этим вопросом?

Спасибо заранее.

С уважением

  • 0
    Вы ничего не делаете с этим оператором DATE_ADD(sDate, INTERVAL 1 DAY); Что вы хотите с этим сделать? Выбрать или установить переменную?
Теги:
stored-procedures
loops
while-loop
do-while

1 ответ

1
Лучший ответ

sDate нужно объявить как переменную, и я предполагаю, что вы передаете startDate в процедуру.

Вы устанавливаете sDate равным startDate, который теперь позволяет вам управлять sDate с помощью DATEADD. 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
  • 0
    Небольшая проблема, в противном случае отличный ответ. Чтобы установить sDate в качестве входного параметра в объявлении переменной, используйте DECLARE sDate DATETIME DEFAULT (startDate); Назначение с '=' даст синтаксическую ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню