Oracle pl/sql: 在事务中执行动态删除

Oracle pl/sql: executing dynamic delete within a transaction

我需要从存储在 table 中的 table 列表中删除一行或多行,并且只有在所有删除成功后才提交。 所以我写了这样的东西(作为更大程序的一部分):

BEGIN
    SAVEPOINT sp;

    FOR cur_table IN (SELECT * FROM TABLE_OF_TABLES)
    LOOP
        EXECUTE IMMEDIATE 'DELETE FROM ' || cur_table.TABNAME || ' WHERE ID = :id_bind'
        USING id;
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK TO SAVEPOINT sp;
END;

我知道这行不通,因为 "execute immediate"。

那么,正确的做法是什么?

老实说,这听起来不是个好主意。既然您将表存储在数据库中,为什么不直接在您的过程中列出它们呢?当然,您不会经常添加此过程需要经常更新的表吗?

正如评论中指出的那样,这会很好地工作,因为 EXECUTE IMMEDIATE 不会自动提交。

不要忘记在异常块的末尾添加 RAISE,否则您永远不会知道发生了错误。

动态 SQL(立即执行)不提交事务。你必须明确地承诺。您的代码很好,但它不会 record/log 错误以防万一。 在异常处理程序部分记录错误。