我需要在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;
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我发现建议在自治事务中执行DDL语句,就像在这种情况下一样.所以我试图在自治事务中运行DDL语句.这导致以下错误:
ORA-00054:资源繁忙并且使用NOWAIT指定获取
我猜这是因为主事务仍然对表有DDL锁定.
我在这里做错了什么,还是有其他办法让这个场景有效?
我经常需要根据一些标准复制,移动或重命名文件和目录,因为我从许多资源中收集数据,我喜欢保持井井有条.哪种脚本语言为这些操作提供了最直观,最易用的方法?以下是一个示例场景:
我将音乐保存在如下文件夹层次结构中:
&Artist Name(upper case letters)&
-- (&album release year&) &album name&
---- \*.*
Run Code Online (Sandbox Code Playgroud)
我想找出哪些文件夹在我的音乐文件夹下破坏了这些规则.如果它们具有一致但不同的文件命名和目录方案结构,我还想使它们适合我使用的结构.
我在Windows和Linux上工作,所以我想尝试一下bash(感谢cygwin),因为我对它有点熟悉.你们有什么感想?有更好的解决方案吗?