需要Oracle sqlldr TRAILING NULLCOLS,但为什么呢?

时间:2010-10-12 17:21:00

标签: oracle sql-loader

我有一个深奥的sqlldr问题困扰着我。我的控制文件看起来像这样:

load data
infile 'txgen.dat'
into table TRANSACTION_NEW
fields terminated by "," optionally enclosed by '"'
TRAILING NULLCOLS
( A,
  B,
  C,
  D,
  ID "ID_SEQ.NEXTVAL"
)

数据是这样的:

a,b,c,
a,b,,d
a,b,,
a,b,c,d

如果我没有将TRAILING NULLCOLS放入,我会在“逻辑记录结束前”找到“列未找到”错误。但是虽然有些列是空的,但是逗号都在那里,所以我没有看到sqlldr错误解释输入文件的原因,并且没有到达它从数据库序列生成ID的末尾。

此语法以前没有空列的工作原因 - 为什么空列导致sqlldr无法到达生成的列?

我已经有了它的工作,我只想了解为什么!?!

5 个答案:

答案 0 :(得分:14)

您已在控制文件中定义了5个字段。您的字段以逗号结束,因此除非指定TRAILING NULLCOLS,否则您需要在5个字段的每条记录中使用5个逗号,即使您通过SQL字符串加载带有序列值的ID字段。

RE:OP评论

这不是我的简短测试经验。使用以下控制文件:

load data
infile *
into table T_new
fields terminated by "," optionally enclosed by '"'
( A,
  B,
  C,
  D,
  ID "ID_SEQ.NEXTVAL"
)
BEGINDATA
1,1,,,
2,2,2,,
3,3,3,3,
4,4,4,4,,
,,,,,

产生以下输出:

Table T_NEW, loaded from every logical record.
Insert option in effect for this table: INSERT

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
A                                   FIRST     *   ,  O(") CHARACTER            
B                                    NEXT     *   ,  O(") CHARACTER            
C                                    NEXT     *   ,  O(") CHARACTER            
D                                    NEXT     *   ,  O(") CHARACTER            
ID                                   NEXT     *   ,  O(") CHARACTER            
    SQL string for column : "ID_SEQ.NEXTVAL"

Record 1: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 2: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 3: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 5: Discarded - all columns null.

Table T_NEW:
  1 Row successfully loaded.
  3 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  1 Row not loaded because all fields were null.

请注意,正确加载的唯一行有5个逗号。即使是第3行,除了ID之外还存在所有数据值,数据也不会加载。除非我遗漏了什么......

我正在使用10gR2。

答案 1 :(得分:3)

输入文件中的最后一列必须包含一些数据(无论是空格还是字符,但不能为空)。我猜,第一个记录在最后一个','之后包含null,除非特别要求使用TRAILING NULLCOLS选项识别空值,否则sqlldr将无法识别。 或者,如果您不想使用TRAILING NULLCOLS,则必须在将文件传递给sqlldr之前处理这些NULL。 希望这有帮助

答案 2 :(得分:3)

这里的问题是,当你想要的只是使用没有数据文件中任何数据的表达式时,你已经将ID定义为数据文件中的字段。您可以通过将ID定义为表达式(或本例中的序列)

来解决此问题
ID EXPRESSION "ID_SEQ.nextval"

ID SEQUENCE(count)

请参阅:http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234了解所有选项

答案 3 :(得分:0)

尝试给出5','在每一行中,类似于第4行。

答案 4 :(得分:0)

当我在csv文件中有足够的额外记录时,我有类似的问题。如果我在记事本中打开csv文件,那么空行看起来像这样: ,,,, ,,,, ,,,, ,,,,

如果在Excel中打开,则无法看到这些内容。请检入记事本并删除这些记录