首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么光标在一次迭代后退出?

问为什么光标在一次迭代后退出?
EN

Stack Overflow用户
提问于 2022-05-26 18:13:33
回答 1查看 18关注 0票数 1

我有一个表,其中列出了我想从其中获取计数的表:

代码语言:javascript
复制
|dq_tbl_id|dq_tbl_tbl_name           |dq_tbl_use_batch_stamp|
|---------|--------------------------|----------------------|
|1        |dev_credly_badges         |1                     |
|...      |...                       |...                   |
|18       |tbl18                     |[NULL]                |

我不知道为什么这个过程在一次迭代之后就会退出:

代码语言:javascript
复制
CREATE DEFINER=`channel`@`%` PROCEDURE `dq_job_dev_count`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE proc_dq_tbl_id SMALLINT;
DECLARE tbl_count INT DEFAULT 0;
DECLARE tbl_name VARCHAR(35);
DECLARE dq_tbl_use_batch_stamp BOOL DEFAULT FALSE;

DECLARE dq_tbl_ids 
    CURSOR FOR 
        SELECT dq_tbl_id FROM ref_dq_tbl_count;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN dq_tbl_ids;   

WHILE done = 0 DO
    FETCH NEXT FROM dq_tbl_ids INTO proc_dq_tbl_id;

    IF done = 0 THEN
        SELECT dq_tbl_tbl_name, dq_tbl_use_batch_stamp INTO @tbl_name, @dq_tbl_use_batch_stamp FROM ref_dq_tbl_count WHERE dq_tbl_id = @proc_dq_tbl_id;

        IF @dq_tbl_use_batch_stamp = 1 THEN
            SET @sql_stmt = CONCAT('SELECT COUNT(*) INTO @tbl_count FROM ', @tbl_name, ' WHERE DATE(batch_stamp) = CURDATE()');
        ELSE
            SET @sql_stmt = CONCAT('SELECT COUNT(*) INTO @tbl_count FROM ', @tbl_name);
        END IF;

        PREPARE stmt FROM @sql_stmt;
        EXECUTE stmt;

        INSERT INTO prod_dq_tbl_load_counts (tbl_name, row_count) VALUES (@tbl_name, @tbl_count);
    END IF;
END WHILE;

CLOSE dq_tbl_ids;

END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 18:39:23

您正在将游标结果提取到一个局部变量中:

代码语言:javascript
复制
FETCH NEXT FROM dq_tbl_ids INTO proc_dq_tbl_id;

随后,在错误的假设下使用用户定义的变量@proc_dq_tbl_id,即它包含您获取的值。

在MySQL存储过程中,带有@信号的变量是用户定义变量。它实际上是一个与您用局部变量创建的DECLARE不同的变量。

您可以将游标提取到用户定义的变量中(使用@信号),也可以将游标提取到局部变量中。但是,必须在后续表达式中使用相同的变量。

由于@proc_dq_tbl_id很可能为NULL,所以您在其中使用的SELECT语句将永远不会匹配任何行。您的游标可能循环了很多次,但是每个循环迭代中的SELECT语句都没有找到匹配项。

这种对MySQL中变量的处理与其他品牌的SQL数据库(例如)不同。对于那些习惯使用其他品牌的开发人员来说,这有时是令人困惑的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72396282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档