我在MySql中做了一个简单的存储功能,该功能返回用逗号分隔的电子邮件:
CREATE FUNCTION get_participantes (id INT) RETURNS VARCHAR(50)
BEGIN
DECLARE par VARCHAR(50) DEFAULT "";
(select GROUP_CONCAT(mail SEPARATOR ',') INTO @par from users where id IN (
select user_id from meeting_participants where meeting_id = id));
RETURN @par;
END
但是当我使用SELECT调用它时,每次都会得到NULL。该SQL语句可完美运行,但本身即可。
+----------------------+
| get_participantes(5) |
+----------------------+
| NULL |
+----------------------+
请帮助
答案 0 :(得分:0)
函数参数的名称为id
,但是在users表中也有id
列,并且Meeting_participants表中也有id
列。 / p>
这会产生歧义。该表达式不知道您是指列id
还是函数参数id
。
您应该给函数参数起一个唯一的名称,以解决歧义。
CREATE FUNCTION get_participantes (_id INT) RETURNS VARCHAR(50)
READS SQL DATA
BEGIN
DECLARE par VARCHAR(50) DEFAULT "";
(select GROUP_CONCAT(mail SEPARATOR ',') INTO par from users where id IN (
select user_id from meeting_participants where meeting_id = _id));
RETURN par;
END
您应该了解的其他两个问题,即使它们与您的问题无关:
在MySQL例程中(例如,不同于SQL Server),您的par
局部变量与@var
会话变量不同。在这种特定情况下,您的代码可以使用,但是您编写的其他某些功能可能会感到困惑。另请参阅我对"@" symbol in stored procedure?
您应该将子句READS SQL DATA
添加到函数中,否则可能会出现此错误(就像我在测试函数时所做的那样):
错误1418(HY000):此函数的声明中没有DETERMINISTIC,NO SQL或READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的log_bin_trust_function_creators变量)