在 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 行,并丢弃一行。
参考资料
- SQL*Loader with multiple WHENs is rejecting all rows,已接受答案中提到的 Ask Tom 问题
- Distinguishing Different Input Record Formats 在 SQL* 加载程序控制文件
- Loading Data into Multiple Tables SQL*加载程序控制文件参考
我试图根据条件将记录从文件加载到 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 行,并丢弃一行。
参考资料
- SQL*Loader with multiple WHENs is rejecting all rows,已接受答案中提到的 Ask Tom 问题
- Distinguishing Different Input Record Formats 在 SQL* 加载程序控制文件
- Loading Data into Multiple Tables SQL*加载程序控制文件参考