0

我想知道我的文件是否在数据库中完整加载。

如果您在此处检查返回代码,您可以看到 1 和 3 是失败的。

EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL  3

EX_WARN(return code 2) 包括这种情况:

All or some rows rejected EX_WARN

All or some rows discarded EX_WARN

Discontinued load EX_WARN

现在,第一个和第二个是可以管理的。

第三个我不得不在文档中搜索。如果您阅读本文,您会看到“停止加载”包括“致命错误”、“CTRL-C”和“空格错误”。在这种情况下,我可能不会收到任何记录或某些记录被拒绝、EX_WARN 返回代码以及在数据库中加载的文件不完整。

如果没有被拒绝的记录很简单:这是一个中断的加载。我必须退出错误。但是当我有一些记录被拒绝时,我不确定我的文件是否完全加载到数据库中。(有些被拒绝的行对我来说是可以接受的。)我说得对吗?

如果是,解决方案是什么?我如何知道整个表是否已加载到数据库中?

4

2 回答 2

2

您可能会遇到 SQL 加载器从数据文件中插入(并提交)一些行但未能到达该文件末尾的情况(即,在失败点之后可能会有更多记录,否则会成功)。

我会选择通过 SQL Loader 使用外部表,使用INSERT INTO dest_table ... SELECT * FROM external_table. 这将是一个原子操作,如果您没有足够的撤消来回滚(因为您没有使用中间提交),它有一个(通常很小)失败的机会。

我还将通过将所有内容都视为通用文本,直到将其加载到数据库中来最大限度地减少外部表/SQL 加载器层中拒绝的可能性。然后我会应用该结构并使用 DML 错误日志记录来处理任何不规则的事情。这样您就可以清楚地访问被拒绝的数据以及数据库中拒绝的原因。

于 2011-08-25T04:50:25.553 回答
0

看来我是对的。我认为 Alex Poole 的评论是很好的解决方案,Gary 的解决方案(也由 Tom kyte 推荐),我在与同事的 ecuation 中发现了另一个技巧:

放置 OPTIONS(ROWS=100000000) - 超过输入数据可以拥有的 - 并按常规方式加载。(我们将只有一个提交或没有提交)有了这个,我们知道,如果加载了某些东西,则加载了所有内容。

于 2011-08-25T15:40:51.503 回答