用于删除块的存储过程 - LOOP 未执行

问题描述 投票:0回答:1

问题:第一次循环后没有执行循环。

CREATE PROCEDURE IF NOT EXISTS chunk_delete(IN table_name varchar(255), IN loop_count int, IN batch_size int)
BEGIN
    DECLARE counter INT DEFAULT 0;
    DECLARE rows_affected INT DEFAULT 1;
    DECLARE delete_query TEXT;
WHILE counter <= loop_count AND rows_affected > 0 DO
        SET delete_query = CONCAT('DELETE FROM ', table_name, ' LIMIT ', batch_size);
        SELECT delete_query;
SET @sql_query = delete_query;
        PREPARE stmt FROM @sql_query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
SET rows_affected = ROW_COUNT();
SET counter = counter + 1;
END WHILE;
END

预期结果: 如果loop_count为4且batch_size为10,则结果是在4次循环后删除40行。但是,在删除第一个批量大小为 10 行后,循环并未实现。

mysql stored-procedures
1个回答
0
投票

ROW_COUNT() 在

DEALLOCATE PREPARE
语句之后调用。所以它返回 0。并且 WHILE 循环中断。

即使在 EXECUTE 后立即获取值,函数仍然会返回 0。因为 DELETE 语句和执行 DELETE 的 EXECUTE 语句不一样。

如果您想知道使用 EXECUTE 删除了多少行,那么您可以计算准备好的语句执行之前和之后表中的行数。此外,您还会阻止并发进程的更改。

并且您不需要准备和取消分配每个循环 - 在之前准备并在之后删除。

© www.soinside.com 2019 - 2024. All rights reserved.