例如,在Feed文件中我得到了像这样的数据
HEADER|AB|C|DATAHERE
DETAIL|DATA1|DATA2|DATA3
DETAIL|DATA1|DATA2|DATA3
DETAIL|DATA1|DATA2|DATA3
DETAIL|DATA1|DATA2|DATA3
FOOTER|COUNTER
第一行应插入tableHeader 第2行到第5行应插入tableDetail 最后一行应插入tableFooter
这是我的sqlloader脚本
Load DATA
REPLACE INTO TABLE tableHeader
WHEN (1:6) = 'HEADER'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL1 FILLER,
COL2 FILLER,
COL3 FILLER,
HEADER_DETAIL,
)
INTO TABLE tableDetail
WHEN (1:6) = 'DETAIL'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
A FILLER,
DATA1,
DATA2,
DATA3
)
INTO TABLE tableFooter
WHEN (1:6) = 'FOOTER'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
Z FILLER,
FOOTER_DETAIL
)
插入tableHeader的数据是正确的,但是插入到其他表中的数据都变得一团糟......有人能帮我个忙吗?
答案 0 :(得分:1)
逻辑记录程序集很困惑。这是mentioned in the documentation:
...字段扫描不会从新INTO TABLE子句的记录开头重新开始。相反,扫描从中断处继续。
要强制记录扫描在特定位置开始,请使用POSITION参数。
因此,您可以使用true
确定第一个填充字段长度:
POSITION(1:7)
这会将您的示例数据加载到我创建的某些虚拟表中的正确字段中。如果没有这些位置规范,则仅加载标头,其余的被丢弃为全为null;位置为1:6的数据进入了错误的列,我认为这就是你所描述的。
您可以为LOAD DATA
REPLACE INTO TABLE tableHeader
WHEN (1:6) = 'HEADER'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL1 FILLER,
COL2 FILLER,
COL3 FILLER,
HEADER_DETAIL
)
INTO TABLE tableDetail
WHEN (1:6) = 'DETAIL'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
A FILLER POSITION(1:7),
DATA1,
DATA2,
DATA3
)
INTO TABLE tableFooter
WHEN (1:6) = 'FOOTER'
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
Z FILLER POSITION(1:7),
FOOTER_DETAIL
)
使用命名字段,但可能需要包含分隔符:
WHEN