【问题标题】:How to check mysql cursor result null without using a loop如何在不使用循环的情况下检查 mysql 游标结果 null
【发布时间】:2016-10-20 01:18:27
【问题描述】:

我有一个返回 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 附近使用的语法 未找到设置完成 = TRUE; ' 在第 5 0 行。

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

【问题讨论】:

  • 你真的需要光标吗?在这种情况下,我认为您可以避免它。

标签: mysql function


【解决方案1】:

也许您可以使用以下功能避免光标:

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 ;

【讨论】:

    【解决方案2】:

    我找到了答案,

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

    【讨论】:

    • 我在文档 (14.6.6 Cursors) 中找不到关于 cursor.rowcount 的任何内容。
    • @wchiquito 没有。除了参考我可以看到的 Python 的 MySQLConnector。这里有两件事......(1)人们会使用像 this 这样的解决方案,(2)明智的选择是永远不要使用游标来完成你正在做的事情,因为你甚至没有为一个硬循环迭代-to-code 必须使用游标。你(如果有效的话)在第一排之后退出。而且性能很差。所以这个故事的寓意是,使用 wchiquito 所做的事情,不要使用光标
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2016-05-28
    • 2013-08-02
    • 2014-04-13
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多