如何在不使用循环的情况下检查mysql游标结果null

时间:2016-06-18 07:32:37

标签: mysql function

我有一个返回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行。

如果您知道如何克服这个问题,请帮助我

2 个答案:

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