Синтаксическая ошибка в функции с DATE_ADD и ИНТЕРВАЛОМ

#mysql #function #date

#mysql — сервер #функция #Дата #mysql

Вопрос:

Учитывая эту функцию:

 DROP FUNCTION IF EXISTS expiration_date;
DELIMITER $$
CREATE FUNCTION expiration_date(lic_class VARCHAR(2), born_on DATE, at DATE) RETURNS DATE
BEGIN
    DECLARE age INTEGER;
    DECLARE span INTEGER DEFAULT 0;
    SET age = YEAR(at) - YEAR(born_on);
    IF     age < 50                 THEN SET span = 10;
    ELSEIF age >= 50 AND age < 70   THEN SET span = 5;
    ELSEIF age >= 70 AND age < 80   THEN SET span = 3;
    ELSEIF age >= 80                THEN SET span = 2;
    END IF;

    DECLARE ret DATE;
    SET ret = DATE_ADD(at, INTERVAL span YEAR); 
    RETURN ret;
END $$
DELIMITER ;
  

это дает мне:

#1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘DECLARE ret DATE; SET ret = DATE_ADD(at, ИНТЕРВАЛ в ГОД); RETURN’ в строке 12

Почему это? Что я упускаю?

Ответ №1:

Согласно DECLARE документации

DECLARE допускается только внутри BEGIN ... END составного оператора и должен находиться в его начале, перед любыми другими операторами.

Следовательно, недопустимо размещать блок DECLARE ret DATE; после IF...ELSE . Переместите его наверх вместе с другими DECLARE объявлениями.

 DROP FUNCTION IF EXISTS expiration_date;
DELIMITER $$
CREATE FUNCTION expiration_date(lic_class VARCHAR(2), born_on DATE, at DATE) RETURNS DATE
BEGIN
    DECLARE age INTEGER;
    DECLARE span INTEGER DEFAULT 0;
    -- No reason not to DECLARE up here!
    DECLARE ret DATE;

    SET age = YEAR(at) - YEAR(born_on);
    IF     age < 50                 THEN SET span = 10;
    ELSEIF age >= 50 AND age < 70   THEN SET span = 5;
    ELSEIF age >= 70 AND age < 80   THEN SET span = 3;
    ELSEIF age >= 80                THEN SET span = 2;
    END IF;

    SET ret = DATE_ADD(at, INTERVAL span YEAR); 
    RETURN ret;
END $$
DELIMITER ;