创建自定义 mysql 函数时出现语法错误

Syntax error when creating custom mysql function

正在尝试创建存储函数,但不断出现相同的错误。

我尝试了不同的 body,将 integer 更改为 INT with/out (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 said:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

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

BEGIN
DECLA' at line 1

您将 @ 印记放在函数参数的前面。如果您使用的是 Microsoft SQL Server,这很常见,但是 MySQL 的语法与 Microsoft SQL Server 的语法不同。

@dag被称为user-defined variable。它有会话范围。

dag 是一个 local variable,可以是函数参数,也可以是您在 BEGIN/END 块中使用 DECLARE.

创建的参数

它们是两个不同的变量。

因为变量没有印记,所以你必须小心你 don't name a variable the same as one of the columns of the tables you query(在 medium_naam 的情况下你几乎这样做了)。为了解决这种歧义,我习惯于在函数参数中添加 "in_" 前缀。

SQL 中没有 == 运算符。 Use = for comparison.

如果您打算将单个结果存储到标量变量中,则不应使用 GROUP BY

可以使用 := 而不是 = 将结果分配给表达式中的变量。但是你应该避免这种用法,因为它 may be removed from MySQL in a future version。我建议您改用 INTO 语法。

不要在意 INT(11) 类型的长度。 It means nothing.

这是一个更正后的函数:

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