1. 程式人生 > 實用技巧 >sql*loader的高階操作

sql*loader的高階操作

由於oracle控制檔案的強大功能,使得sql*loader可以如所願的對資料檔案進行處理,然後匯入oracle資料庫中。想想也是,資料庫的存在無非是為了:1,更好的管理資料。2,能更輕鬆的和軟體銜接,明確資料流的走向。這時,很多格式的資料檔案如果要匯入到oracle中就遇到一定的問題。

一,處理是以空格斷值得資料檔案

編輯如圖所示的檔案,儲存在根資料夾下

將這樣的資料檔案匯入到昨天建立的test表中,如何操作?查詢oracle的控制檔案語法,得知在引述列明時使用position 關鍵字。編寫控制檔案

這裡我把infile 檔案寫法用絕對路徑,執行結果

報出了異常,這裡就是昨天我在部落格中說的,一定要在執行的目錄裡新增資料檔案。還是老老實修改資料檔案,放在根目錄下,在根目錄下執行。

正確的控制檔案的寫法是:

SQL> select * from test;

ID NAME
---------- ------------------------------
100 y
200
300 n
2 lily

SQL>
SQL>

通過思考,我總結出了規律,在寫控制檔案時一定要像寫程式一樣按著格式一步一步的寫,排列成規矩的格式,這樣才不會出錯,出了錯也好堅持。這真是一個IT者的好習慣。position(1:3)表示取第一個到第三個字元中間的值。這樣的檔案也成為定長字串。第8個字元一定是y,n,所以後頭的值沒有取完。

舉一反三,通過postion關鍵字可以實現將定長字串的檔案隔行插入。如下圖檔案展示的那樣

很顯然,資料庫中沒有性別這一行,我直接插入時一定會報錯,併產生日誌,錯誤檔案。所以,我修改控制檔案。


SQL>
SQL>
SQL> select * from test;

ID NAME
---------- ------------------------------
100 y
200
300 n
100 y
200
300 n
1000 王
2000 莉
3000 麗
1000 王歌
2000 莉莉
3000 麗麗
2 lily

13 rows selected

SQL>

因為,我插入了2次,所以append出了許多結果。因此可見控制檔案的作用是非常強大的,處理的方法也是非常靈活的。

二:處理大批的資料,如多個數據檔案同時匯入到一個表中。解決方法:

還是修改控制檔案,需要這樣改變

load data

infile data1.dat /*第一個資料檔案

infile data2.dat /*第二個資料檔案

infile data3.dat

append into table tab1

fields terminated by ","

這樣處理就行。方法靈活多變。同樣如果不想插入資料檔案中的第n到第n+3行。就需要關鍵字filler了。所以,方法多種多樣。在用到時先試驗,然後仔細使用就好。

很重要的一個問題,oracle中對空值的定義是null,當插入的值為空時,就會出現錯誤。我們實驗一下。還以以前創的test表為例。定義值如圖

寫控制檔案:

load data
infile dat_new.csv
append into table test
fields terminated by ","
(id,name)

sql*loader中執行,提示成功,但是出現bad檔案。開啟bad檔案

4,
id ,name


這時由於空值引起的。注意.bad 檔案和控制檔案會在同一個目錄裡,bad檔案會自動生成在控制檔案的目錄中。這樣的檔案在oracle中出現的可能性很大。因為oracle中的null值和excel中的空是不一樣的存貯方式。為了執行的正確,需要修改控制檔案,新增關鍵字TRAILING NULLCOLS。

LOAD DATA
INFILE dat_new.csv
TRUNCATE INTO TABLE TEST
FIELDS TERMINATED BY "," TRAILING NULLCOLS
(ID,NAME)

這次執行,沒有問題了。檢視一下

在實際工作中,TRAILING NULLCOLS 應用非常廣泛。

工作了一天,好疲憊了。晚上頭腦還在運轉,更是對自己的調整。告訴自己,我能堅持,告訴自己,我一定行。

轉載於:https://blog.51cto.com/bestlanzi/1104340