这是我的数据库类。我的教授希望我们制作一个存储功能。这是具体问题。
请根据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语句有关,但我认为没有其他可靠的方法可以做到这一点。
答案 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 ;