我试图根据条件将记录从文件加载到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'没装。
知道如何继续这个吗?谢谢。
答案 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行,并弃掉一行。
<强>参考强>