可以通过sqlldr命令将变量传递给SQL * Loader控制文件吗?

时间:2014-01-22 09:19:55

标签: oracle sql-loader controlfile

以下是我的控制文件示例:

    OPTIONS (skip=1,errors=1000,direct=true,rows=10000)
    load data 
    append
    into table TABLE_NAME
    fields terminated by ','
    OPTIONALLY ENCLOSED BY '"'
    trailing nullcols(
      DATE_ID       DATE_ID_VALUE,
      DESC1         char(1000),
      DESC2         char(1000),
      DISP_URL      char(1000),
      DEST_URL      char(1000),
      ACCT_ID       ACCOUNTID_VALUE,
      Acct_num      ACCOUNT_NUM,
      created_date SYSDATE
    )

我需要从sqlldr命令传递DATE_ID_VALUE,ACCOUNTID,ACCOUNTNUM值。我通过csv文件传递重映射列数据,该文件从sqlldr“DATA”参数传递。有没有办法通过sqlldr命令或其他任何方式传递其他必需参数?

下面是我的sqlldr命令:

   sqlldr userid=abc/abcdef@abcdefgh CONTROL= cont.ctl DATA= $csvFilePath  LOG=admaster.log BAD=admaster.bad

2 个答案:

答案 0 :(得分:0)

我知道这是旧的,但我偶然发现了它,我最近回答了类似的问题。请参阅我的回复,了解从包装程序创建控制文件的技术。

insert timestanp of INFILE into a column from SQLLOADER

答案 1 :(得分:0)

无法对.ctl文件中的变量进行参数化,但可以完全省去.ctl文件并根据需要进行参数设置。

您需要声明外部表,然后执行SQL INSERT into TABLE_NAME SELECT * from EXTERNAL_TABLE;,而不是直接调用sqlldr。外部表声明包含在幕后使用的sqlldr参数,并在SQL查询中定义,该查询可以直接从Unix shell运行,所有必需参数都指定为Unix系统变量或命令。

E.g。在调用环境中设置$ DATE_ID_VALUE和其他2个变量的值后,首先创建一个外部表:

echo "create table myschema.temp_table_name (
    DATE_ID       INTEGER,
    DESC1         char(1000),
    DESC2         char(1000),
    DISP_URL      char(1000),
    DEST_URL      char(1000),
    ACCT_ID       INTEGER,
    Acct_num      INTEGER,
    created_date  DATE)
   organization external
     (
     type oracle_loader
     default directory mydir
     access parameters (
       records delimited by newline
       badfile bad_dir: 'temp_ext_temp_table_name_load.bad'
       logfile log_dir: 'temp_ext_temp_table_name_load.log'
       fields terminated by ',' (
          DESC1         char(1000),
          DESC2         char(1000),
          DISP_URL      char(1000),
          DEST_URL      char(1000)
       )
       column transforms (
          DATE_ID       FROM CONSTANT '$DATE_ID_VALUE',
          ACCT_ID       FROM CONSTANT '$ACCOUNTID_VALUE',
          Acct_num      FROM CONSTANT '$ACCOUNT_NUM',
          created_date  FROM CONSTANT \"`date '+%d-%b-%Y'`\"
       )
     )
     location ('temp_table_name.dat')
     )
     reject limit 1000;" | sqlplus -s /

column transforms子句将使用从环境变量和Unix date命令解析的常量值填充外部表。

然后插入目标表(可选append提示直接路径加载):

insert /*+ append */ into table_name
select * from myschema.temp_table_name;

我找不到包含SYSDATE的方法,所以改为使用Unix date命令。