使用 sqlldr 正确跳过空字段

Correctly skipping empty fields with sqlldr

我需要将制表符分隔的文件上传到现有的 Oracle table。一些记录在中间有空字段(不是之前回答的整列),我无法让 sqlldr 正确加载记录空字段之后的字段。考虑示例文件:

ID->   col1-> col2-> col3
rec1-> 1.28-> 2.56-> 5.12
rec2-> 1.28-> -> 
rec3->     ->     -> 5.12

和以下控制文件upload.ctl:

OPTIONS (SKIP=1) 
load data  infile 'file.tab'
replace into table TARGET_TABLE
fields terminated by "\t" optionally enclosed by '"'
TRAILING NULLCOLS
    (ID char terminated by "\t",
     col1 terminated by "\t",
     col2 terminated by "\t",
     col3 terminated by "\t")

将导致以下上传:

+------+------+------+------+
|ID    |col1  |col2  |col3  |
+------+------+------+------+
|rec1  |1.28  |2.56  |5.12  |
|rec2  |1.28  |(null)|(null)|
|rec3  |5.12  |(null)|(null)|

要上传的文件中的空白字段已用正确数量的制表符填充,但 sqlldr 似乎将连续的制表符识别为一个。我怎样才能防止这种情况发生? 感谢您检查我的新手问题!

没有将 TAB 视为分隔符。将字段终止行更改为:

fields terminated by X'09' optionally enclosed by '"'

并从每个列条目中删除 "terminated by "\t"",因为那里不需要。