代码之家  ›  专栏  ›  技术社区  ›  Adam Paynter

变量是否可以传递到SQL*加载器控制文件?

  •  3
  • Adam Paynter  · 技术社区  · 14 年前

    假设您有一张桌子:

    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)
    )
    

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

    3 回复  |  直到 12 年前
        1
  •  7
  •   Erich Kitzmueller    14 年前

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

    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)
    )
    
        2
  •  2
  •   Jim Hudson    14 年前

    不容易,如果我记得对的话,但这里有两种选择:

    • 如果只有一个进程在运行SQL 加载程序一次使用空值或固定值,然后运行SQL 再加上脚本作为流程的一部分,以便对序列值进行更新。
    • 调用一个脚本,该脚本将获取批处理ID的下一个序列值,然后假脱机处理控制文件,包括批处理ID常量。
        3
  •  1
  •   Vitali Tchalov    12 年前

    如果可以接受通过在每次加载时递增自动生成的批处理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
    )