在sql loader中使用多个条件

时间:2015-10-03 11:44:04

标签: oracle sql-loader

我试图根据条件将记录从文件加载到oracle表。由于OR运算符和WHEN IN语句在sql loader中不起作用,我尝试多次插入表。但是,只有与第一个条件匹配的记录才会加载到表中,并且未加载与第二个条件匹配的记录。我的控制文件如下所示:

Options (BINDSIZE = 7340032)
Load Data
APPEND
INTO TABLE TEMP_GLOBAL_ONE_FEE_REBATE WHEN ACT_TYPE = 'SR'
FIELDS TERMINATED BY '|' TRAILING NULLCOLS
(
        RPT_YEAR,
        RPT_MONTH,
        ........
        ........
 )


INTO TABLE TEMP_GLOBAL_ONE_FEE_REBATE WHEN ACT_TYPE = 'SL'
FIELDS TERMINATED BY '|' TRAILING NULLCOLS
(
        RPT_YEAR,
        RPT_MONTH,
        ........
        ........
 )

**如上所述,只有那些带有act_type =' SR'加载了那些带有act_type =' SL'没装。

知道如何继续这个吗?谢谢。

2 个答案:

答案 0 :(得分:0)

你的问题是第一个INTO命令从头到尾读取文件,然后第二个INTO命令选择第一个完成的位置 - 这是你的情况下文件的结尾。 为了达到你想要做的,你将不得不使用两个单独的sql loader命令。请参阅AskTom上的这篇文章以供参考 -

https://asktom.oracle.com/pls/apex/f?p=100:11:::YES:RP:P11_QUESTION_ID:3181887000346205200

更优雅的解决方案是使用pl / sql过程和UTL_FILE包从文件中读取数据,但是如果导入是很多事情,而不是一次性事情,这只是值得的。< / p>

答案 1 :(得分:0)

您应该在每个字段列表的第一列中使用POSITION(1)

  

要强制记录扫描在特定位置开始,请使用POSITION参数。

控制文件

Options (BINDSIZE = 7340032)
Load Data
APPEND
INTO TABLE TEMP_GLOBAL_ONE_FEE_REBATE WHEN ACT_TYPE = 'SR'
FIELDS TERMINATED BY '|' TRAILING NULLCOLS
(
        RPT_YEAR POSITION(1),
        RPT_MONTH,
        ........
        ........
)


INTO TABLE TEMP_GLOBAL_ONE_FEE_REBATE WHEN ACT_TYPE = 'SL'
FIELDS TERMINATED BY '|' TRAILING NULLCOLS
(
        RPT_YEAR POSITION(1),
        RPT_MONTH,
        ........
        ........
)

示例数据

2015|01|SL
2015|02|SL
2015|03|SL
2015|03|SR
2015|04|SR
2015|04|XX

这将使用'SR'加载2行,使用&#39; SL&#39;加载3行,并弃掉一行。

<强>参考

  1. SQL*Loader with multiple WHENs is rejecting all rows,在接受的答案中提到的Ask Tom queston
  2. SQL * Loader控制文件中的
  3. Distinguishing Different Input Record Formats
  4. SQL * Loader控制文件参考中的
  5. Loading Data into Multiple Tables