2010-10-12 497 views
15

我有一个困扰我的深奥sqlldr问题。我的控制文件看起来是这样的:需要Oracle sqlldr TRAILING NULLCOLS,但为什么?

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 

如果我不把后NULLCOLS中,我得到了“列的逻辑结束之前未找到记录“错误。但是虽然有些列是空的,但逗号都在那里,所以我没有看到sqlldr错误解释输入文件的原因,也没有看到它从数据库序列中产生ID的那一端。

此语法之前没有空列 - 为什么空列会导致sqlldr无法到达生成的列?

我有工作,我只是想明白为什么!?!

+2

因为拉里这么说,所以才这样。这是预期的行为。 – 2010-10-12 17:25:02

+0

没关系,我只是想了解它的机制。 – orbfish 2010-10-15 19:50:25

回答

14

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

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

我正在使用10gR2。

+0

情况并非如此,因为如果数据总是有4个字段(但不是5个逗号,甚至4个),则不需要TRAILING NULLCOLS。虽然你在那里,但它几乎是有道理的...... – orbfish 2010-10-15 19:47:55

+0

还没有能够验证这一点,但保持观点等待是不公平的。 – orbfish 2011-11-07 21:42:58

0

先给5“”在每一行,类似于线数4

3

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

0

我有类似的问题,当我把所有的选项:您可以通过定义ID为表达(或在这种情况下的顺序)

ID EXPRESSION "ID_SEQ.nextval" 

ID SEQUENCE(count) 

见解决这个问题csv文件中有大量额外的记录,其值为空值。如果我在记事本中打开CSV文件,然后空行看起来是这样的: ,,,, ,,,, ,,,, ,,,,

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