sqlldr返回代码 - ex_warn

时间:2011-08-24 14:07:15

标签: oracle sql-loader return-code

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

如果您查看返回代码here,则可以看到1和3是失败的。

EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL  3

EX_WARN(返回码2)包括以下情况:

All or some rows rejected EX_WARN

All or some rows discarded EX_WARN

Discontinued load EX_WARN

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

对于第三个我必须在文档中搜索。 如果您阅读this,您可以看到“已停止加载”包括“致命错误”,“CTRL-C”和“空格错误”。 在这种情况下,我可能没有记录或一些记录被拒绝,EX_WARN返回代码,文件未完整加载到数据库中。

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

如果是,解决方案是什么? 我怎么知道整个表是否已加载到DB中?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

似乎我是对的。 我认为亚历克斯普尔的评论,加里的解决方案(由汤姆凯特推荐)是一个很好的解决方案,我找到了另一个与我的同事一起进行的伎俩:

放置OPTIONS(ROWS = 100000000) - 超过输入数据可以 - 并按常规加载。 (我们只有一次提交或没有提交) 有了这个,我们知道,如果加载的东西,加载了一切。