Вы ставите символ @
перед аргументами своей функции. Это часто встречается, если вы используете 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