我有一个返回varchar值的mysql函数。在这个函数里面我定义了一个只给出一个值的游标。这意味着在我的select语句中,我使用表主键组合获取了一个特定的值。因为我知道这个游标只返回一个值,所以我不想添加一个循环来检查游标是否返回值。
DELIMITER //
CREATE FUNCTION PROGRAM_API_Get_Name(
program_id_ VARCHAR(15),
uni_id_ VARCHAR(15),
fac_id_ VARCHAR(15)) RETURNS VARCHAR(100)
BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DECLARE degree_name_ VARCHAR(100);
DECLARE get_name_ CURSOR FOR
SELECT program_name
FROM degree_program_tab
WHERE program_id = program_id_
AND uni_id = uni_id_
AND fac_id = fac_id_;
OPEN get_name_;
IF(!done) THEN
FETCH get_name_ INTO degree_name_;
CLOSE get_name_;
RETURN degree_name_;
END IF;
RETURN NULL;
END//
此功能给我以下错误
错误代码:1064。您的SQL语法有错误;检查 手册,对应右边的MySQL服务器版本 在'BEGIN DECLARE CONTINUE HANDLER FOR'附近使用的语法 NOT FOUND SET done = TRUE; '在第5行。
如果您知道如何克服这个问题,请帮助我
答案 0 :(得分:0)
我找到了答案,
cursor.rowcount
是解决方案
DELIMITER //
CREATE FUNCTION PROGRAM_API_Get_Name(
program_id_ VARCHAR(15),
uni_id_ VARCHAR(15),
fac_id_ VARCHAR(15)) RETURNS VARCHAR(100)
BEGIN
DECLARE degree_name_ VARCHAR(100);
DECLARE get_name_ CURSOR FOR
SELECT program_name
FROM degree_program_tab
WHERE program_id = program_id_
AND uni_id = uni_id_
AND fac_id = fac_id_;
OPEN get_name_;
IF(get_name_.rowcount>0) THEN
FETCH get_name_ INTO degree_name_;
CLOSE get_name_;
RETURN degree_name_;
END IF;
RETURN NULL;
END//
答案 1 :(得分:0)
也许你可以使用以下函数来避免光标:
DELIMITER //
DROP FUNCTION IF EXISTS `PROGRAM_API_Get_Name`//
CREATE FUNCTION `PROGRAM_API_Get_Name` (
`program_id_` VARCHAR(15),
`uni_id_` VARCHAR(15),
`fac_id_` VARCHAR(15)
)
RETURNS VARCHAR(100)
BEGIN
RETURN (SELECT `program_name`
FROM `degree_program_tab`
WHERE `program_id` = `program_id_`
AND `uni_id` = `uni_id_`
AND `fac_id` = `fac_id_`);
END//
DELIMITER ;