oracle 外部表使用詳解

2021-07-16 02:35:45 字數 3487 閱讀 8986

外部表,相對於資料庫內部表來說的,意思是將作業系統檔案作為乙個資料庫,資料從檔案而來。

我把它理解成類似指標的東西,告訴使用者,這個表的資料是從哪些檔案來的。

語法如下:

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...