首页 > 解决方案 > 存储函数返回 NULL Mysql

问题描述

我在 MySql 中创建了这个简单的 STORED FUNCTION,它返回用逗号分隔的电子邮件:

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                 |
+----------------------+

请帮忙

标签: mysqlfunctionnull

解决方案


您的函数参数的名称是id,但您id的 users 表中也有一列,并且id您的 meeting_participants 表中也可能有一列。

这会产生歧义。该表达式不知道您是指列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

您应该了解的其他几个问题,即使它们与您的问题无关:

  1. 在 MySQL 例程中(例如与 SQL Server 不同),您的par局部变量与@var会话变量不同。您在这种特定情况下的代码将起作用,但您编写的其他一些函数可能会被混淆。另请参阅我对存储过程中“@”符号的回答

  2. 您应该将该子句添加READS SQL DATA到您的函数中,否则您可能会收到此错误(就像我在测试您的函数时所做的那样):

错误 1418 (HY000):此函数在其声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)


推荐阅读