为啥 MySQL 给出错误“不允许从函数返回结果集”?

Posted

技术标签:

【中文标题】为啥 MySQL 给出错误“不允许从函数返回结果集”?【英文标题】:Why MySQL is giving error "Not allowed to return a result set from a function"?为什么 MySQL 给出错误“不允许从函数返回结果集”? 【发布时间】:2012-08-06 11:52:48 【问题描述】:

我正在尝试使用 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 ;

有什么建议吗?

提前致谢。

【问题讨论】:

已经在***中解决了,请访问链接。 ***.com/questions/16177267/… 【参考方案1】:

因为

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 也是如此。

【讨论】:

【参考方案2】:

那是因为您正在使用 SELECT 查询,其输出未存储到变量中或 FUNCTION 中的临时变量中,必须这样做。函数只能返回一个值。所以你的代码应该是这样的:

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;

【讨论】:

以上是关于为啥 MySQL 给出错误“不允许从函数返回结果集”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误

为啥我不能索引mysql返回的数组? [复制]

MySQL 专家:为啥 2 个查询给出不同的“解释”索引使用结果?

为啥这个 MySQL 存储函数给出的结果与在查询中进行计算不同?

为啥此代码给出错误

为啥这个javascript代码给出错误[重复]