Oracle 可以将变量传递到SQL*加载程序控制文件吗?

Oracle 可以将变量传递到SQL*加载程序控制文件吗?,oracle,sql-loader,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_n

假设您有一张桌子:

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?

如果我没记错的话,这并不容易,但这里有两个备选方案:

如果一次只有一个进程运行SQLLoader,请使用null或固定值,然后作为进程的一部分运行SQLPlus脚本,以更新序列值。 调用一个脚本,该脚本将获取批次ID的下一个序列值,然后输出控制文件,包括批次ID常量。
一种相对简单的归档方法是创建一个存储函数,返回批号并在加载程序文件中使用

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

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

一个缺点是,在大批量的情况下,它的速度会明显减慢——这是每一行的最高总价格

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
)

美好的如果您希望函数为每次运行的装入器执行新批处理,请将其放入一个包中,并使其返回一个包变量,该变量将在第一次调用时初始化为序列。您还可能决定在启动sqlloader之前,在脚本中动态重新创建函数。有趣的方法。也可以只创建一个序列,在控制文件中使用它,然后删除它。除非我不知道这个想法,否则我认为这个序列不适合这个目的-我们需要一组记录的ID,而不是每个记录的ID;序列在每次插入时都会递增。
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
)