22

我有一个深奥的 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 无法到达生成的列?

我已经成功了,我只是想了解为什么!?!

4

5 回答 5

16

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

回复: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 个逗号。即使是第三行,除了 ID 之外的所有数据值都存在,数据也不会加载。除非我错过了什么...

我正在使用 10gR2。

于 2010-10-12T21:34:53.153 回答
4

这里的问题是,您将 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

于 2014-06-17T15:26:35.003 回答
3

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

于 2013-05-30T20:52:45.890 回答
0

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

于 2013-05-16T04:21:58.450 回答
0

当我在 csv 文件中有大量带有空值的额外记录时,我遇到了类似的问题。如果我在记事本中打开 csv 文件,则空行如下所示: ,,,, ,,,, ,,,, ,,,,

如果在 Excel 中打开,您将看不到这些。请在记事本中检查并删除这些记录

于 2017-03-21T07:03:36.607 回答