2014-01-22 61 views
2

下面是我的控制文件例如:变量可以通过sqlldr命令传递给SQL * Loader控制文件吗?

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 
    ) 

我需要通过DATE_ID_VALUE,ACCOUNTID,从SQLLDR命令ACCOUNTNUM值。我通过csv文件传递了从sqlldr“DATA”参数传递的内容。有没有办法通过sqlldr命令或其他任何方式来传递其他必需的参数?

下面是我的SQLLDR命令:

sqlldr userid=abc/[email protected] CONTROL= cont.ctl DATA= $csvFilePath LOG=admaster.log BAD=admaster.bad 
+4

您可以在调用SQLLoader之前即时创建自定义的控制文件 –

+0

我不想为每个上传创建新的控制文件,所以我决定让它参数化... –

+0

尽管你不能让它参数化@arul ...所以你将不得不做不同的事情。如果你想添加一个常量,为什么不只是在表上创建一个视图或者在应用程序中选择这些数据。没有必要将它添加到ctl文件中。 – Ben

回答

0

这是不可能进行参数在.CTL文件中的变量,但可以与完全不管你想要一个.CTL文件和参数化分配。

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

E.g.已经设置$ DATE_ID_VALUE的值,并在您的通话环境中的其他两个变量,首先创建一个外部表:

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的解决了常数值日期命令。

然后做插入到目标表(可选append暗示的直接路径负载):

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

我不能找到一种方法,包括SYSDATE,所以使用了Unix date命令相当于代替。

相关问题