代码之家  ›  专栏  ›  技术社区  ›  yooooo

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

  •  0
  • yooooo  · 技术社区  · 10 月前

    问题:在第一个循环之后没有执行循环。

    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行后,循环没有实现。

    2 回复  |  直到 10 月前
        1
  •  0
  •   Akina    10 月前

    ROW_COUNT()在后面调用 DEALLOCATE PREPARE 声明。因此,它返回0。当循环中断时。

    即使在EXECUTE之后立即得到值,函数仍将返回0。因为DELETE语句和执行DELETE的EXECUTE语句不同。

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

    而且你不需要准备和释放每个循环——先准备后丢弃。

    推荐文章