问题:第一次循环后,循环没有执行。
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 行后,循环未执行。
ROW_COUNT() 在语句之后调用
DEALLOCATE PREPARE
。因此它返回 0。并且 WHILE 循环中断。即使在EXECUTE之后立即获取值,函数仍然会返回0。因为DELETE语句和执行DELETE的EXECUTE语句是不一样的。
如果您想知道使用 EXECUTE 删除了多少行,那么您可以计算执行准备好的语句之前和之后表中的行数。此外,您还需要阻止并发进程更改。
而且您不需要准备和释放每个循环 - 先准备,后删除。