MySQL错误-";不允许从函数返回结果集";

MySQL错误-";不允许从函数返回结果集";,mysql,function,Mysql,Function,这是我的数据库类。我的教授想让我们做一个存储函数。这是一个具体的问题 请基于来宾表编写名为fHW2_4_XXXX(…)的存储函数。您的程序应该有一个参数,并且应该满足以下3个测试用例 我意识到也有类似的问题,但我看到的那些问题没有帮助。我试图在MySQL中创建一个存储函数,但它给了我一个错误: “不允许从函数返回结果集。” 目标是从dreamhome.Guest中选择所有guestname,其地址包含给定(输入)城市名称,但必须返回值“John Kay,Mike Ritchie”。这是我的数据

这是我的数据库类。我的教授想让我们做一个存储函数。这是一个具体的问题

请基于来宾表编写名为fHW2_4_XXXX(…)的存储函数。您的程序应该有一个参数,并且应该满足以下3个测试用例

我意识到也有类似的问题,但我看到的那些问题没有帮助。我试图在MySQL中创建一个存储函数,但它给了我一个错误: “不允许从函数返回结果集。”

目标是从dreamhome.Guest中选择所有guestname,其地址包含给定(输入)城市名称,但必须返回值“John Kay,Mike Ritchie”。这是我的数据库类。我知道这与我的SELECT语句有关,但我看不到其他可靠的方法来做这件事。

多亏了,我已经找到了答案

因此,我发现解决这个问题的最好方法是声明一个游标,并遍历搜索结果

这是我的代码:


如果要返回结果集,请创建一个存储过程或视图,而不是函数。@Sloachrisher这就是问题所在。我的教授希望它是一个存储函数,然后不要返回结果集。您应该已经了解了结果集是什么,以及它与课堂上的值之间的区别。提示:不返回名称,但使用for next循环将列值存储到VARCHAR(255)中。错误信息也是这样。习惯吧。如果你想成为一名程序员,你必须学会自学。我已经编程40年了,花了大约1/3的时间学习新东西——这只是为了跟上时代。我从来没有上过课,但总是在那些有学位的同事周围兜圈子,主要是因为我可以自学。(顺便说一句,我的学位是在一个不相关的领域——核物理)快速搜索找到了关于这个主题的100多页,大约有10页是正确的。
DELIMITER //

CREATE FUNCTION fHW2_4_xxxx(city_name VARCHAR(25))
RETURNS VARCHAR(255)

BEGIN
    DECLARE names VARCHAR(255);
    IF (city_name = '' OR city_name IS NULL) THEN
        SELECT 'Please input a valid city.' AS message;
    ELSE
        SELECT GROUP_CONCAT(guestname SEPARATOR ',') INTO names FROM dreamhome.Guest WHERE guestaddress LIKE CONCAT('%', city_name, '%');
        RETURN names;
    END IF;
END //

DELIMITER ;
--Function fHW2_4_xxxx--
DELIMITER //

DROP FUNCTION IF EXISTS fHW2_4_xxxx //

CREATE FUNCTION fHW2_4_yamakait(city_name VARCHAR(25))
RETURNS VARCHAR(2000)

BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_name varchar(100) DEFAULT "";
DECLARE name_list varchar(2000) DEFAULT "";

-- declare cursor for guest name
DEClARE name_cursor CURSOR FOR 
     SELECT guestname FROM dreamhome.Guest WHERE guestaddress LIKE CONCAT('%', city_name, '%');

-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET v_finished = 1;

IF (city_name != '' AND city_name IS NOT NULL) THEN  
    OPEN name_cursor;
    get_name: LOOP 
        FETCH name_cursor INTO v_name;

        IF (v_finished = 1 AND name_list = "") THEN
            RETURN 'No result found.';
            LEAVE get_name;
        END IF;     
        IF v_finished = 1 THEN
            LEAVE get_name;
        END IF;

        -- build name list
        IF (name_list = "") THEN
            SET name_list = v_name;
        ELSE
            SET name_list = CONCAT(name_list, "," , v_name);
        END IF;
    END LOOP get_name;

    RETURN name_list;

    CLOSE name_cursor;
ELSE
    RETURN 'Please input a valid city.';
END IF;

END //

DELIMITER ;