外部表,相對於資料庫內部表來說的,意思是將作業系統檔案作為乙個資料庫,資料從檔案而來。
我把它理解成類似指標的東西,告訴使用者,這個表的資料是從哪些檔案來的。
語法如下:
create
table
"table1"
( id varchar2(4),
name varchar2(20)
)organization external --外部表的關鍵字
( type oracle_loader --外部表有兩種型別,這裡使用oracle_loader
default directory data_file_path --檔案目錄
access parameters( --引數
records delimited by newline characterset zhs16gbk
skip 10
badfile 'data_log_path':'table1.bad'
nodiscardfile
logfile 'data_log_path':'table1.log'
readsize 1048576
fields ldrtrim
reject rows
with
allnull fields
( "id" (1,4) char(4) nullif ("id" = blanks),
"name" (5,24) char(20) nullif ("name" = blanks)
))location
( test1.txt,
test2.txt
)reject limit unlimited;
使用外部表需要注意一下幾點:
1、資料檔案(test1.txt,test2.txt)的存放路徑必須是資料庫伺服器能夠訪問到的地方!
這點非常關鍵,許多產品一半是資料庫伺服器跟應用後台分離的方式,所以,這就要求檔案能
夠放在資料庫伺服器上,而不是後台伺服器,或者兩者之間加一塊共享儲存,這裡兩台都能訪
問。2、建立外部表之前,需要先建立目錄物件data_file_path,也就是,資料檔案需要放在這
個目錄物件中,也就是,這個目錄物件的路徑,是資料庫伺服器上的路徑。建立語法如下:
create
orreplace directory import_data_file_path as
'/home/file'
由於上面的例子我把生成的log、bad檔案單獨存放,所以建立兩個目錄。
3、執行建立外表語句 ,可以在oracle客戶端執行,且建立表不載入資料,也就是資料如果有錯,
或者檔案不存在,不會報錯,建立是成功的,只有當insert到正式表時,才是載入資料的過程。
4、外部表只能查詢,不能做dml操作,外部表只能查詢,不能做dml操作,外部表只能查詢,
不能做dml操作,重要的事情說3遍。外部表只能當作中間工具,建立好外部表時,使用
insert into 正式表 select * from 外部表;
載入資料到正式表中。這個過程可以使用查詢並行和dml並行,提公升載入效能(這裡有坑,後面
解釋)。
現在來講講外部表的一些引數
2、default directory 就是指定目錄物件,檔案一定要在這裡面!!!
3、records delimited by newline characterset zhs16gbk 指定資料庫的字符集,
資料庫字符集可以查詢出來。
select userenv(『language』) from dual;
4、badfile 指定bad檔案存在路徑,什麼是bad檔案,就是資料裡面,違反了字段規則的資料
,就會被當中bad資料放到裡面。如果不需要生成,則寫nobadfile.
5、discardfile 丟棄的檔案,跟bad檔案不一樣,這個是違反了篩選條件的資料,上面的例
子沒寫,這裡寫下:
skip 10
badfile 'data_log_path':'table1.bad'
nodiscardfile
logfile 'data_log_path':'table1.log'
load when ("id" != blanks)
6、load when 載入條件,結合上面說,就是篩選條件,這裡面的寫法只能指定欄位的值,不
能限制型別,而且語法限制條件也很多,sql的函式不能用,只能使用and or = != 這些。上面
discardfile ,就是如果不滿足這個load when,則這行資料將會被丟棄,放到你指定的檔案中
去,如果不需要生成,則nodiscardfile。
回過來說這個load when ,寫法也很多,可以指定字段,也可以指定長度,比如:
load when (1:20) != blanks,就是說,從1到20個字元不能是空白。這個load when官方文件也
說的很少,具體的用法,需要自己慢慢摸索。
7、skip n 跳過,顧名思義,載入資料時候告訴oracle跳過多少行,這裡挺坑,乙個資料檔案,
跳過沒問題,如果有多個資料檔案,它只能跳過第乙個檔案的n行,這不坑爹嗎?還有,上面說
insert到正式表的可以使用並行,注意!!!!!skip,只能在非並行模式下使用!!!!!!!
如果需要使用並行dml或者查詢,麻煩把這個引數去掉!!!!!
8、readsize 1048576 這個是指定一次性讀取最大值。
9、fields ldrtrim 載入的時候,每個欄位都要trim一下
10、reject rows with all null fields 就是說如果字段沒有資料,則為null
11、字段規則,很簡單,如果是有分隔符的寫法,網上很多,這裡模擬的資料是沒有分隔符的,
類似於這樣:
132334342354656546646454564564564564535242
「id」 (1,4) char(4) nullif (「id」 = blanks) 分別是欄位名,擷取起始位置,型別和長度,條件是
如果為空格則字段為null。這裡是字串型別的,如果是number型別的字段,條件這麼寫:
「age」 (21,23) integer external(3)
12、location 裡面就是需要載入的檔案名字
13、reject limit unlimited 預設是有限制的載入,這裡設定的是無限制載入。
外部表的引數太多了,有一些沒用過,也不知道怎麼用,有興趣的,可以去oracle官方文件裡面
慢慢看,全英文的。
外部表的效率,還是非常可觀的,500w資料,使用sqlldr匯入的話,需要大概8-10分鐘載入完,
如果使用外部,開了並行,1分鐘搞定。
oracle外部表的使用 使用外部表
oracle外部表的使用 該執行緒包含一些使用外部表的有用技巧。使用外部表 1.將表指向外部檔案。如果外部檔案中的資料被更改,則表中的資料也將發生變化。2.外部表可以按照與聯接,檢視中的標準表相同的方式進行查詢.並可以使用外部表上的所有型別的功能。3.獲取有關外部表的資訊,查詢 user exter...
使用Oracle外部表的五個限制
外部表是指不在資料庫中的表,如作業系統上的乙個按一定格式分割的文字檔案或者其他型別的表。這個外部表對於oracle資料庫來說,就好像是一張檢視,在資料庫中可以像試圖一樣進行查詢等操作。這個試圖允許使用者在外部資料上執行任何的sql語句,而不需要先將外部表中的資料裝載進資料庫中。不過需要注意是,外部資...
Oracle 使用外部表匯入含有LOB欄位的資料
假設,你需要將某個路徑下的全部檔案txt檔案匯入資料庫,並保留對應的檔名。外部檔案中lob欄位的位置,應該存放檔名。for n in ls txt do echo n n done test load.txt 兩邊不要留空,否則外部表讀取檔案時會報錯,說找不到該檔案 cat test.txt q10...