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

时间:2018-07-27 09:39:43

标签: oracle plsql dynamic-sql execute-immediate

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

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;

由于“立即执行”,我知道这行不通。

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

2 个答案:

答案 0 :(得分:0)

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

正如评论中指出的那样,由于EXECUTE IMMEDIATE不会自动提交,因此可以正常工作。

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

答案 1 :(得分:0)

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