尝试创建存储的函数,但不断出现相同的错误。
我尝试了另一种方法,将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行)
答案 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