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

时间:2019-06-06 15:00:51

标签: mysql mysql-error-1064

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

我尝试了另一种方法,将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)
  返回整数

     

BEGIN
  DECLA”(第1行)

1 个答案:

答案 0 :(得分: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