2014-01-22 114 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命令相當於代替。

相關問題