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

时间:2017-04-14 03:33:26

标签: mysql function

这是我的数据库类。我的教授希望我们制作一个存储功能。这是具体问题。

  

请根据Guest表编写名为fHW2_4_XXXX(...)的存储函数。你的程序应该采用一个参数城市,它应该满足以下3个测试用例。

Full Question ~ Given by my Professor ~ Click here to see it!

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

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 ;

目标是选择dreamhome.Guest中的所有客人名称,其地址包含给定(输入)城市名称,但必须返回值为#34; John Kay,Mike Ritchie"。这是我的数据库类。我知道它与我的SELECT语句有关,但我认为没有其他可靠的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

感谢 @SloanThrasher ,我已经明白了!

因此,我发现解决此问题的最佳方法是声明游标,然后浏览搜索结果。

以下是我的代码:

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