3

假设你有一张桌子:

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

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

加载数据文件'customers.dat'
代替

INTO TABLE 客户
(
  批次_id ??????,
  客户名称位置(001:020),
  客户地址位置(021:120)
)

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

4

3 回答 3

8

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

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)
)
于 2010-09-21T13:19:41.327 回答
3

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

  • 如果一次只有一个进程运行 SQL Loader,请使用空值或固定值,然后运行 ​​SQL Plus 脚本作为该进程的一部分,以更新序列值。
  • 调用一个脚本,该脚本将为您的批次 ID 获取下一个序列值,然后从控制文件中提取,包括 batch_id 常量。
于 2010-09-21T13:09:04.473 回答
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
)
于 2012-05-18T21:17:01.430 回答