5

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

    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
4

2 回答 2

1

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

将 INFILE 的时间戳插入 SQLLOADER 的列中

于 2014-12-16T18:51:12.413 回答
1

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

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

例如,在调用环境中设置了 $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 日期命令。

于 2016-07-14T15:32:52.653 回答