【问题标题】:Syntax error when creating custom mysql function创建自定义 mysql 函数时出现语法错误
【发布时间】:2019-10-22 03:09:45
【问题描述】:

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

我尝试了不同的身体,将 integer 更改为 INT 和/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 说:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用 附近

'@dag INT、@week INT、@medium_naam varchar)
返回整数

开始
第 1 行的 DECLA'

【问题讨论】:

    标签: mysql mysql-error-1064


    【解决方案1】:

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

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

    dag 是一个local variable,可以是函数参数,也可以是您在带有DECLAREBEGIN/END 块中创建的参数。

    它们是两个不同的变量。

    因为变量没有符号,所以你必须小心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
    

    【讨论】:

    • 你好比尔!我执行了确切的函数语法,但在DECLARE result INT 中仍然存在语法错误,我不知道为什么。我使用 MySQL MariaDB 和 MySQL workbeanch 谢谢。
    • 我猜不出你做了什么或者确切的错误信息是什么。我建议您提出一个新问题并提供详细信息。此外,我不使用 MariaDB,我认为它是与 MySQL 不同的产品,因为它是在十年前分叉的,从那时起它与 MySQL 的兼容性越来越差。
    猜你喜欢
    • 2020-01-12
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2014-04-29
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多