为什么MySQL会报错"不允许从函数返回结果集"?

19

我正在尝试使用phpMyAdmin创建一个MySQL函数,但是出现以下错误:

#1415 - 不允许从函数返回结果集

以下是函数代码:

DELIMITER $$
    
CREATE FUNCTION get_binary_count(a INT, c INT)
RETURNS INT
DETERMINISTIC 

BEGIN
    DECLARE c1, c2 INT;
    SET c1 = 0;
    SET c2 = 0;

    SELECT left_id  AS c1 FROM mlm_user_mst WHERE parent_id = a AND left_id > 0;
    SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id = a AND right_id > 0;

    IF (c1 > 0 AND c2 > 0) THEN
        SET c = c + 1;
        SET c = c + get_binary_count(c1, 0);
        SET c = c + get_binary_count(c2, 0);
    END IF;

    RETURN c;
END$$
 
DELIMITER ;

有什么建议吗?

提前致谢。


2
已经在stackoverflow解决,请访问链接。https://dev59.com/-GQo5IYBdhLWcg3wSNpw - nexttus
3个回答

43
因为
SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

该代码未设置变量c1,但返回一个名为c1的列的集合

您想要

SELECT left_id INTO c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

同样适用于c2。


8
那是因为你使用了未存储在变量或函数内部临时的SELECT查询。函数只能返回一个单一的值。因此,你的代码应该像这样:
CREATE TABLE t1 AS SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0;
CREATE TABLE t2 AS SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0;

或者

SELECT left_id AS c1 INTO @c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0 LIMIT 1; 

SELECT right_id AS c2 INTO @c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0 LIMIT 1;

0
函数触发器中,允许使用SELECT INTO,但不允许使用没有INTOSELECT,因为会出现以下错误。*在过程事件中,允许使用没有INTOSELECT

错误 1415 (0A000):不允许从函数返回结果集

错误 1415 (0A000):不允许从触发器返回结果集


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接