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