2009-06-11 120 views
2

爲了將數據(從CSV文件)加載到Oracle數據庫中,我使用了SQL * Loader。如何真正跳過列的處理?

在接收這些數據的表中,有一個varchar2(500)列,名爲COMMENTS。 由於某些原因,我想忽略CSV文件中的這些信息。 因此,我寫了這個控制文件:

Options (BindSize=10000000,Readsize=10000000,Rows=5000,Errors=100) 
    Load Data 
    Infile 'XXX.txt' 
    Append into table T_XXX 
    Fields Terminated By ';' 
    TRAILING NULLCOLS 
(
    ... 
    COMMENTS FILLER, 
    ... 
) 

此代碼似乎正常工作,如在數據庫中的COMMENTS場總是被設置爲null

但是,如果在我的CSV文件我有,其中相應COMMENTS場超過500個字符限制的記錄,我從SQL得到一個錯誤*裝載機:

Record 2: Rejected - Error on table T_XXX, column COMMENTS. 
Field in data file exceeds maximum length 

有沒有辦法來真的排除我的COMMENTS字段的處理?

回答

2

我無法重現您的問題。我在SQL * Loader 10.2.0.1中使用了Oracle 10.2.0.3.0。

這裏是我的測試案例:

SQL> CREATE TABLE test_sqlldr (
    2  ID NUMBER, 
    3  comments VARCHAR2(20), 
    4  id2 NUMBER 
    5 ); 

Table created 

控制文件:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments filler, 
    id2 
) 

數據文件:

1;aaa;2 
3;abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;4 
5;bbb;6 

我使用的命令sqlldr userid=xxx/[email protected] control=test.ctl和我得到的所有沒有錯誤的行:

SQL> select * from test_sqlldr; 

     ID COMMENTS     ID2 
---------- -------------------- ---------- 
     1        2 
     3        4 
     5        6 

您可以嘗試另一種方法,我越來越有以下控制文件同樣期望的結果:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments "substr(:comments,1,0)", 
    id2 
) 

更新以下Romaintaz的評論:我看着它再次和管理,以獲得相同當列的大小超過255個字符時出錯。這是因爲SQL * Loader的默認數據類型是char(255)。如果你有一個包含更多數據的列,你將不得不指定長度。下面的控制文件解決了這個問題的列有300個字符:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments filler char(4000), 
    id2 
) 

希望這有助於

-
文森特

+0

感謝您的幫助。我試過substr函數,但是我得到了相同的結果。 我也簡化了很多我的控制和數據文件(該過程只有PK和COMMENTS),但我仍然得到錯誤:( 我使用的是10.2.0.3.0 sql loader版本... – romaintaz 2009-06-11 08:33:34

1

只是提出一個微小的改進,你可以嘗試像:

LOAD DATA 
IN FILE test.data INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';'TRAILING NULLCOLS 
(
id, 
comments char(4000) "substr(:comments, 1, 200)", 
id2) 

現在,您將抓取所有comme的前200個字符(或您指定的任何數字) nts - 除非某些輸入記錄的註釋字段值超過4000個字符,並且它們將被加載器拒絕,並且前面提到的「超出最大長度」錯誤。但假設這種情況很少見,所有記錄都會加載一些截斷爲200個字符的註釋。

如果你超過char(4000)你會得到一個SQL Loader錯誤 - 你可以推動野獸的距離是有限制的。