2016-07-05 21 views
0

1問題:我試圖加載test1.csvtest2.csvtest3.csv表1表2表3分別使用SQLLDR。如果知道這方面的知識,請耐心等待,如果在.ctl文件中定義這個問題時我無法完全理解,只有我能想到的是下面的代碼,但這是不正確的。所以我的問題是我怎麼能做到這一點或者這是可能的?SQLLDR - 如何加載多個CSV到multple表

OPTIONS (SKIP=1) 
LOAD DATA 

INFILE 'test1.csv' 
INFILE 'test2.csv' 
INFILE 'test2.csv' 

TRUNCATE 

INTO TABLE table1 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 


INTO TABLE table2 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

第二個問題:這是第一個問題的替代方案。由於我無法弄清楚第一個問題,我所做的就是將每個表的負載拆分爲多個.ctl文件,並將這三個文件全部調用到.bat文件中。這至少起作用,但我的問題是有沒有辦法在會話中處理所有這3個.ctl文件,而不提及用戶/密碼3次?

sqlldr userid=user/[email protected] control=test1.ctl 
sqlldr userid=user/[email protected] control=test2.ctl 
sqlldr userid=user/[email protected] control=test3.ctl 
+0

是否已經存在或可以在數據中添加一個指示器字段,用於鍵入數據應該發送到哪個表上? –

+0

我沒有使用任何列作爲區分數據的關鍵,但我可以通過添加密鑰進行嘗試。 – Chito

回答

0

如果有可以使用它可以表明文件的數據被用於該表中的字段,您可以使用多個INFILE satements做這樣的事情。比方說,第一場是指示燈,它不會被加載(其定義爲填充物,以便將SQLLDR忽略):

... 
INTO TABLE table1 
WHEN (01) = 'TBL1' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 

INTO TABLE table2 
WHEN (01) = 'TBL2' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
WHEN (01) = 'TBL3' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

所以邏輯上,每進表時部分處理每個文件。雖然並不那麼靈活,但可以說難以維持。爲了便於維護,您可能只想爲每個文件設置一個控制文件?如果所有文件和表格都是相同的佈局,您也可以將它們全部加載到相同的臨時表格(使用指示器)以便於加載,然後將它們以編程方式分解到單獨的表格中。該方法的優點是加載速度更快,更容易,並且可以更好地控制分解到流程的單獨表部分。只是一些其他的想法。我已經完成了每種方法,取決於需求和你能夠改變的方面。

+0

我得到了你說的,可能最好讓他們全部分開。 – Chito

+0

回到第二個問題,有沒有辦法添加上面給出的例子以外的多個.ctl文件? – Chito

+0

您可以給'sqlldr'命令行參數之一是一個參數文件,它可以包含userid信息。這與它自己的安全問題有關。有關詳細信息,請參閱此處:http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_params.htm#i1005781。否則,我認爲你將不得不以編程方式想出一個方法來調用'sqlldr',每次傳遞不同的參數。這就是我們所做的。我們有一個表格,用於保存每個文件的加載設置,並且一個調度程序讀入,構建一個命令行並運行它。 –

相關問題