mysql - 存储函数返回 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 |
+----------------------+
请帮忙
解决方案
您的函数参数的名称是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
您应该了解的其他几个问题,即使它们与您的问题无关:
在 MySQL 例程中(例如与 SQL Server 不同),您的
par
局部变量与@var
会话变量不同。您在这种特定情况下的代码将起作用,但您编写的其他一些函数可能会被混淆。另请参阅我对存储过程中“@”符号的回答?您应该将该子句添加
READS SQL DATA
到您的函数中,否则您可能会收到此错误(就像我在测试您的函数时所做的那样):
错误 1418 (HY000):此函数在其声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)
推荐阅读
- python - 如何在python中修复'fp.seek(self.start_dir,0)OSError:[Errno 22] Invalid argument'
- excel - 如何遍历数据透视表中的每个活动(非过滤)元素(不包括列标签和总计)?
- typescript - 如何在 .call() 方法期间为此正确应用类型?
- java - 方法参数的自定义注释
- python - 找出字典中最常见的值并分配给键
- java - 遇到无效的@Scheduled 方法“运行”:需要“cron”、“fixedDelay(String)”或“fixedRate(String)”属性之一
- python - 如何从列表中的范围分配值?
- php - PHP require_once 失败但需要工作
- c# - Change Letters in a string to phrases (eg D to Delta, )
- python - 如何使用importlib从PySide2动态导入QApplication