我需要在Oracle数据库上执行一堆(最多~1000000)SQL语句。这些语句应该在结束时产生引用一致的状态,并且如果出现错误,则应回滚所有语句。这些语句不按引用顺序排列。因此,如果启用了外键约束,则其中一个语句可能会导致外键违规,即使稍后执行的语句将修复此违规也是如此。
我尝试先禁用外键,然后在执行所有语句后再启用它们。我认为当实际发生外键违规时,我将能够回滚。但是我错了,我发现Oracle中的每个DDL语句都以提交开始,因此无法以这种方式回滚语句。以下是我的禁用外键脚本:
经过一些研究,我发现建议执行DDL语句(例如此案例)时应在自主事务中执行。因此,我尝试在自主事务中运行DDL语句。这导致了以下错误:
ORA-00054:资源忙,指定NOWAIT获取
我猜测这是因为主事务仍然对表具有DDL锁定。
我在这里做错了什么,还是有其他方法使这种情况起作用?
我尝试先禁用外键,然后在执行所有语句后再启用它们。我认为当实际发生外键违规时,我将能够回滚。但是我错了,我发现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锁定。
我在这里做错了什么,还是有其他方法使这种情况起作用?