在 sql 加载程序中使用多个条件

using multiple conditions in sql loader

我试图根据条件将记录从文件加载到 oracle table。由于 OR 运算符和 WHEN IN 语句在 sql 加载程序中不起作用,我尝试了多次插入到 table。但是,table中只加载了符合第一个条件的记录,而没有加载符合第二个条件的记录。我的控制文件如下所示:

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' 的记录。

知道如何进行吗?谢谢。

你的问题是第一个 INTO 命令从头到尾读取文件,然后第二个 INTO 命令从第一个完成的地方开始 - 在你的情况下是文件的结尾。 要实现您想要做的事情,您将不得不使用两个单独的 sql 加载程序命令。请参阅 AskTom 上的 post 以供参考 -

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

一个更优雅的解决方案是使用 pl/sql 过程和 UTL_FILE 程序包从文件中读取数据,但是只有在导入经常发生的情况下才值得麻烦,而不是一次性的事情。

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

To force record scanning to start in a specific location, you use the POSITION parameter.

控制文件

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 行,使用“SL”加载 3 行,并丢弃一行。

参考资料

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