我需要从存储在表中的表列表中删除一个或多个行,并且仅在所有删除成功后才提交。 所以我写了这样的东西(作为更大过程的一部分):
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;
由于“立即执行”,我知道这行不通。
那么,正确的方法是什么?
答案 0 :(得分:0)
老实说,这听起来是个坏主意。由于您已将表存储在数据库中,为什么不在过程中列出它们呢?当然,您不会添加经常需要更新此过程的表吗?
正如评论中指出的那样,由于EXECUTE IMMEDIATE
不会自动提交,因此可以正常工作。
不要忘记在异常块的末尾添加一个RAISE
,否则您将永远不知道发生了错误。
答案 1 :(得分:0)
动态SQL(立即执行)不提交事务。您必须明确地提交。您的代码很好,但不会记录/记录错误,以防万一发生。 将错误记录在异常处理程序部分。