首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以通过sqlldr命令将变量传递给SQL*Loader控制文件?

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

Stack Overflow用户
提问于 2014-01-22 17:19:55
回答 2查看 20K关注 0票数 5

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

代码语言:javascript
复制
    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文件传递重命名列数据,而csv文件是从sqlldr " data“参数传递的。有没有办法通过sqlldr命令或任何其他方式传递其他所需的参数?

下面是我的sqlldr命令:

代码语言:javascript
复制
   sqlldr userid=abc/abcdef@abcdefgh CONTROL= cont.ctl DATA= $csvFilePath  LOG=admaster.log BAD=admaster.bad
EN

回答 2

Stack Overflow用户

发布于 2014-12-17 02:51:12

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

insert timestanp of INFILE into a column from SQLLOADER

票数 1
EN

Stack Overflow用户

发布于 2016-07-14 23:32:53

不可能对.ctl文件中的变量进行参数化,但是可以完全省去.ctl文件,并对您想要的任何内容进行参数化。

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

例如,在您的调用环境中设置了$DATE_ID_VALUE和其他2个变量的值后,首先创建一个外部表:

代码语言:javascript
复制
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命令解析的常量值填充外部表。

然后将insert插入到目标表中(可选的append提示用于直接路径加载):

代码语言:javascript
复制
insert /*+ append */ into table_name
select * from myschema.temp_table_name;

我找不到一种方法来包含SYSDATE,所以使用了等效的Unix date命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21278726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档