Oracle:具有失败的延迟约束的连续插入

时间:2018-02-27 14:41:24

标签: oracle import constraints deferred

很抱歉这个问题很长,但我希望它能够完整。

我的目标是创建一个流程,用MS-SQL Server创建的数据填充Oracle 11数据库。 我希望尽可能多地加载数据,并在不受约束的记录上创建错误报告,以便我们可以使用我们的数据测试新应用程序并改进数据收集并重复此过程。

我有NodeJS脚本,它直接从MS-SQL表中读取(一次一个),并向Oracle数据库发出INSERT ... EXCEPTION/LOG ERRORS语句。这似乎一直运作到最后。有些表格具有可延迟的约束条件。 (例如,同一个表中的parent_id),我无法忽略/报告,所以最后我总是以延迟约束和0插入行的提交错误结束:(

注意:这个问题看起来很像Continuing Inserts in Oracle when exception is raised但是,它没有指定延迟约束或其他工具。

鉴于上下文(我不是Oracle专家),

问题

1)是否存在另一种处理延迟约束的方法,仍然会插入有效数据并记录错误?

2)是否有更好的工具来执行此迁移并报告当前数据问题?

1 个答案:

答案 0 :(得分:1)

嗯,听起来这些列可以推断是有充分理由的,因为在您插入所有行之前,您无法知道哪些行会失败。

我不确定它是否是最佳做法,但我要做的是:在将所有记录插入my_table之后,在提交之前,记录并删除所有行未通过约束检查,例如:

spool bad_rows.txt;
select * from my_table where parent_id not in (select id from my_table);
spool off;
delete from my_table where parent_id not in (select id from my_table);

我无法从您的问题中判断这是一次性数据迁移还是常规数据迁移。如果您打算经常这样做,可以考虑creating an exception table来捕获有问题的行,然后在加载前禁用约束,使用EXCEPTIONS子句重新启用它们(可能SET CONSTRAINTS ALL IMMEDIATE;检查违规) ,然后在发出提交之前从表中删除有问题的行(使用其rowid)。我认为你应该能够很好地自动化它。

我不经常这样做,以便很好地回答你问题的第二部分。我可以说你的一些选择包括:(a)使用SQL * Loader进行快速直接路径加载,这有很好的错误处理,以及(b)在MS SQL Server db和Oracle db之间创建远程数据库链接,并直接插入数据,以避免数据格式问题。希望其他人可以提供关于良好迁移工具的更好答案。