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 错误以防万一。
在异常处理程序部分记录错误。
我需要从存储在 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 错误以防万一。 在异常处理程序部分记录错误。