可以将变量传递给SQL * Loader控制文件吗?

时间:2010-09-21 12:33:27

标签: oracle sql-loader

假设你有一张桌子:

CREATE TABLE Customer
(
  batch_id         NUMBER,
  customer_name    VARCHAR2(20),
  customer_address VARCHAR2(100)
)

假设您有一个控制文件来填充此表:

LOAD DATA INFILE 'customers.dat'
REPLACE

INTO TABLE Customer
(
  batch_id         ??????,
  customer_name    POSITION(001:020),
  customer_address POSITION(021:120)
)

运行SQL * Loader时,是否可以将batch_id的值传递给我的控制文件?例如,是否可以指定绑定变量(将问号转换为:MY_AWESOME_BATCH_ID)?

3 个答案:

答案 0 :(得分:7)

一种相对简单的归档方法是创建一个存储函数,该函数返回批号并在装入文件中使用它。

create or replace function getBatchNumber return number as
begin
  return 815;
end;
/

LOAD DATA INFILE 'customers.dat'
REPLACE

INTO TABLE Customer
(
  batch_id         "getBatchNumber",
  customer_name    POSITION(001:020),
  customer_address POSITION(021:120)
)

答案 1 :(得分:2)

如果我没记错的话,不容易,但这里有几个选择:

  • 如果一次只有一个进程运行SQL Loader,则使用空值或固定值,然后运行SQL Plus脚本作为该过程的一部分,然后执行更新序列值。
  • 调用一个脚本,该脚本将获取批次ID的下一个序列值,然后假脱机控制文件,包括batch_id常量。

答案 2 :(得分:1)

如果通过递增每个负载自动生成BATCH_ID值是可以接受的,那么这对我有用。样本中的10分钟间隔需要根据特定负载进行调整 - 准确地说,加载必须在指定的时间间隔内完成,下次加载不得在指定的时间内开始。

缺点是它在大量产品上明显减慢 - 这是每条线上运行MAX聚合的价格。

LOAD DATA
...
INTO TABLE XYZ 
(
...
BATCH_ID expression "(select nvl(max(batch_id) + 1, 1) from extra_instruments_party_to where create_date < (sysdate - interval '10' minute))",
CREATE_DATE SYSDATE
)