首页 > 解决方案 > sqlldr 无法识别空制表符分隔的列

问题描述

使用 sqlldr 加载数据时,我看到一个奇怪的问题。这是我的表架构:

CREATE TABLE TEST(
   "COL1" VARCHAR2 (255 BYTE),
   "COL2" VARCHAR2 (255 BYTE),
   "COL3" NUMBER,
   "COL4" VARCHAR2 (255 BYTE)

这只是我试图从制表符分隔文件 test.txt 中提取的一行数据:

COL1    COL2    COL3    COL4
        10  17-cc

请注意,前两列是空的(null)。所以我的行真的是:

\t\t10\t17-cc

我的加载程序脚本:

load data
 infile 'test.txt'
 append into table TEST
 fields terminated by "\t" optionally enclosed by '"'
 TRAILING NULLCOLS  
(COL1,COL2,COL3,COL4)

这将被加载到我的表中:

COL1 COL2  COL3   COL4
10    17-CC (null) (null)

这是不正确的。似乎数据行中的两个前导选项卡被忽略了,COL3 位置 (10) 分配给了 COL1。但是,如果我尝试将数据作为逗号分隔文件导入:

COL1,COL2,COL3,COL4
,,10,17-cc

它按预期工作。为什么制表符分隔的版本在这里失败?

标签: sql-loader

解决方案


注意 - 修正了我原来的错误答案。

您的 TAB 定义得很好。您需要 NULLIF 语句:

load data
 infile 'test.txt'
 append into table TEST
 fields terminated by "\t" optionally enclosed by '"'
 TRAILING NULLCOLS  
(COL1 NULLIF(COL1=BLANKS),
 COL2 NULLIF(COL2=BLANKS),
 COL3 NULLIF(COL3=BLANKS),
 COL4 NULLIF(COL4=BLANKS)
)

推荐阅读