创建自定义 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
正在尝试创建存储函数,但不断出现相同的错误。
我尝试了不同的 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 integerBEGIN
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