Синтаксическая ошибка при создании пользовательской функции mysql - PullRequest
1 голос
/ 06 июня 2019

Попытка создать сохраненную функцию, но постоянно получаю ту же ошибку.

Я пробовал другое тело, меняя integer на INT с / вне (11)

DELIMITER $$

CREATE FUNCTION f_media (@dag INT, @week INT, @medium_naam varchar)
RETURNS integer

BEGIN 
    DECLARE result INT(11);

    SELECT result=COUNT(medium_name) FROM `TABLE 4` WHERE WEEK(date) = @week AND DAYOFWEEK(date) = dag AND medium_name == @medium_naam GROUP BY date;

    RETURN result;
END $$ 
DELIMITER ;

Это точная ошибка:

MySQL сказал:

# 1064 - у вас ошибка в синтаксисе SQL;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования около

'@ dag INT, @week INT, @medium_naam varchar)
RETURNS integer

BEGIN
DECLA 'в строке 1

1 Ответ

1 голос
/ 06 июня 2019

Вы ставите символ @ перед аргументами своей функции. Это часто встречается, если вы используете Microsoft SQL Server, но MySQL имеет другой синтаксис, чем Microsoft SQL Server.

@dag называется определяемой пользователем переменной . Имеет сессионный охват.

dag - это локальная переменная , либо аргумент функции, либо аргумент, который вы создаете в блоке BEGIN/END с помощью DECLARE.

Это две разные переменные.

Поскольку переменные не имеют сигил, вы должны быть осторожны, чтобы вы не называли переменную так же, как один из столбцов таблиц, которые вы запрашиваете (вы почти сделали это в дело medium_naam). Чтобы устранить эту неоднозначность, у меня есть привычка добавлять префикс «in_» к аргументам функции.

В SQL нет оператора ==. Используйте = для сравнения .

Не следует использовать GROUP BY, если вы хотите, чтобы ваш запрос сохранил один результат в скалярной переменной.

Присвоение результата переменной в выражении можно сделать с помощью :=, но не =. Но вы должны избегать этого использования, потому что может быть удалено из MySQL в будущей версии . Я предлагаю вам использовать синтаксис INTO.

Не беспокойтесь о длине в типе INT(11). Это ничего не значит .

Вот исправленная функция:

CREATE FUNCTION f_media (in_dag INT, in_week INT, in_medium_naam varchar)
RETURNS INT

BEGIN 
    DECLARE result INT;

    SELECT COUNT(medium_name) INTO result
    FROM `TABLE 4` 
    WHERE WEEK(date) = in_week 
     AND DAYOFWEEK(date) = in_dag 
     AND medium_name = in_medium_naam;

    RETURN result;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...