#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 ;