我需要在 Oracle 数据库上执行一堆(最多约 1000000 条)sql 语句。这些语句最终应该导致引用一致的状态,如果发生错误,所有语句都应该回滚。这些陈述没有参考顺序。因此,如果启用了外键约束,则其中一个语句可能会导致外键违规,即使此违规将通过稍后执行的语句来修复。
我尝试先禁用外键并在执行所有语句后启用它们。我认为当发生实际的外键违规时我可以回滚。不过我错了,我发现 Oracle 中的每个 DDL 语句都以提交开头,因此无法以这种方式回滚语句。这是我禁用外键的脚本:
begin
for i in (select constraint_name, table_name from user_constraints
where constraint_type ='R' and status = 'ENABLED')
LOOP execute immediate 'alter table '||i.table_name||' disable constraint
'||i.constraint_name||'';
end loop;
end;
经过一番研究,我发现建议在自治事务中执行 DDL 语句,就像在这种情况下一样。所以我尝试在自治事务中运行 DDL 语句。这导致了以下错误:
ORA-00054: 资源繁忙并使用指定的 NOWAIT 获取
我猜这是因为主事务仍然在表上具有 DDL 锁。
我在这里做错了什么,还是有其他方法可以使这种情况起作用?