SQL Loader - 使用TERMINATED将数据加载到不同的表中

时间:2016-03-08 08:34:40

标签: oracle sql-loader

例如,在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的数据是正确的,但是插入到其他表中的数据都变得一团糟......有人能帮我个忙吗?

1 个答案:

答案 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