我有一个表,其中列出了我想从其中获取计数的表:
|dq_tbl_id|dq_tbl_tbl_name |dq_tbl_use_batch_stamp|
|---------|--------------------------|----------------------|
|1 |dev_credly_badges |1 |
|... |... |... |
|18 |tbl18 |[NULL] |我不知道为什么这个过程在一次迭代之后就会退出:
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发布于 2022-05-26 18:39:23
您正在将游标结果提取到一个局部变量中:
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数据库(例如)不同。对于那些习惯使用其他品牌的开发人员来说,这有时是令人困惑的。
https://stackoverflow.com/questions/72396282
复制相似问题