Problema: O loop não é executado após o primeiro loop.
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
Resultado Esperado: Se loop_count for 4 e batch_size for 10, o resultado será a exclusão de 40 linhas após 4 loops. No entanto, o loop não será implementado após a exclusão do primeiro tamanho de lote de 10 linhas.
ROW_COUNT() é chamado após
DEALLOCATE PREPARE
a declaração. Então ele retorna 0. E o ciclo WHILE quebra.Mesmo que você obtenha o valor imediatamente após EXECUTE, a função ainda retornará 0. Porque a instrução DELETE e a instrução EXECUTE que executa DELETE não são a mesma coisa.
Se você quiser saber quantas linhas foram deletadas com EXECUTE, então você contaria a quantidade de linhas na tabela antes e depois da execução da instrução preparada. Você também bloquearia as alterações de processos concorrentes.
E você não precisa preparar e desalocar cada loop - prepare antes e descarte depois.