日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Oracle之外部表

發(fā)布時(shí)間:2024/8/26 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle之外部表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Oracle之外部表

?

??? 有時(shí)候,數(shù)據(jù)庫海量數(shù)據(jù)的存儲(chǔ),是一個(gè)令人頭疼的問題。別的不說,光是頻繁的執(zhí)行insert(1000次/秒)都是一場惡夢。但是,如果將數(shù)據(jù)保存到文家里,而不是數(shù)據(jù)庫中,數(shù)據(jù)序列化的開銷就小得多了。但是,對于文件的各種復(fù)雜檢索,又是一件相當(dāng)麻煩的事。

?

???

幸好,Oracle有這樣一種特性,它可以將某些特定格式的文件映射到數(shù)據(jù)庫中,形成一個(gè)“表”,稱為“外部表”。單用戶更改文件內(nèi)容時(shí),外部表中的數(shù)據(jù)即隨之改變。同時(shí),用戶又可以像檢索普通表一樣,以只讀的方式對外部表進(jìn)行檢索。

?

??? 我們假設(shè)有這樣一個(gè)文件(DATA.TXT):

1|this is a string

2|這里是個(gè)字符串

3|ABC

??? 要把這樣一個(gè)文件映射成外部表,有以下工作要做:

??? 首先,我們需要為Oracle創(chuàng)建一個(gè)Directory,

??? 創(chuàng)建方式為,在數(shù)據(jù)庫中執(zhí)行,須用DBA用戶創(chuàng)建,并給應(yīng)用授權(quán)。

??? create directory EXT_TABLE_DIR as'/home/oracle/app/oracle/oradata/php/'

??? 注意“/home/oracle/app/oracle/oradata/php/”是一個(gè)存在于Oracle數(shù)據(jù)庫服務(wù)器本身上邊的實(shí)際存在的文件夾;

??? 然后,將DATA.TXT文件拷貝到上述文件夾下;

??? 最后,創(chuàng)建一個(gè)對應(yīng)外部表,

create table EXT_TABLE_NAME

(

COL_1 NUMBER,

COL_2 VARCHAR2(512)

)

organization external

(

type oracle_loader

default directory EXT_TABLE_DIR

access parameters (fields terminated by '|' )

location ('DATA.TXT')

)

reject limit unlimited;

???

注意藍(lán)色部分,EXT_TABLE_NAME是要映射成的外部表名稱,EXT_TABLE_DIR是第一步里我們創(chuàng)建的Oracle的Directory,“|”是文件里的分割符,DATA.TXT是文件名。

?

??? 需要補(bǔ)充的是,最后有一句“reject limit

unlimited”,告訴Oracle這個(gè)外部表沒有行數(shù)限制。否則,當(dāng)文件中的數(shù)據(jù)量超過200萬行時(shí),在對表進(jìn)行檢索時(shí),就會(huì)出現(xiàn)ORA-30653,“reject

limit reached”錯(cuò)誤。

?

Oracle 9i 的一項(xiàng)新特性就是 External

Table,它就象通常的數(shù)據(jù)庫表一樣,擁有字段和數(shù)據(jù)類型約束,并且可以查詢,但是表中的數(shù)據(jù)卻不存儲(chǔ)在數(shù)據(jù)庫中,而是在與數(shù)據(jù)庫相關(guān)聯(lián)的普通外部文件里。當(dāng)你查詢

External Table 時(shí),Oracle 將解析該文件并返回符合條件的數(shù)據(jù),就象該數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫表中一樣。

具體的定義可以參見《Oracle 概念手冊》,以下的幾點(diǎn)需要注意:

<一>:外部表的描述:

> 創(chuàng)建的語法類似于: "CREATE TABLE ... ORGANIZATION EXTERNAL"

> 數(shù)據(jù)在數(shù)據(jù)庫的外部組織,是操作系統(tǒng)文件。

> 操作系統(tǒng)文件在數(shù)據(jù)庫中的標(biāo)志是通過一個(gè)邏輯目錄來映射的。

> 數(shù)據(jù)是只讀的。(外部表相當(dāng)于一個(gè)只讀的虛表)

> 不可以在上面運(yùn)行任何 DML 操作,不可以創(chuàng)建索引。

> 可以查詢操作和連接??梢圆⑿胁僮鳌?/p>

例子:

假如有如下兩個(gè)數(shù)據(jù)文件:

1: 數(shù)據(jù)文件的格式

F1.TXT文件:

13234,FIRSTS

46464,TESTA

F2.TEXT文件:

13234,SECONDS

46464,TEST

2:創(chuàng)建目錄,并用DBA進(jìn)行授權(quán);

sql> create directory test_dir as'E:temp';

sql>grant read,write on directorytest_dir to users;

注意:創(chuàng)建完畢邏輯目錄之后要把平面文件拷貝到該目錄下,另外還要注意文件名字不要寫錯(cuò)。

?????一定要給oracle用戶對這個(gè)目錄可讀可寫的權(quán)限,操作系統(tǒng)層面,如使用chmod -R 777 test_dir;

3:使用被授權(quán)的用戶users創(chuàng)建外部表:

create table test_table

(ms_no varchar(20),

tip varchar(20),

descs varchar(20))

ORGANIZATIONEXTERNAL

(

TYPEORACLE_LOADER

DEFAULTDIRECTORY test_dir

ACCESS Parameters

(

RECORDSDELIMITED BY NEWLINE

badfile 'bad_dev.txt'

LOGFILE 'log_dev.txt'

FIELDS TERMINATED BY ','

MISSING FIELD VALUES ARE NULL

(ms_no,tip,descs)

)

LOCATION('F1.txt','F2.txt')

)

;

表創(chuàng)建完成.當(dāng)然也可以導(dǎo)入一個(gè)文件

?

4:進(jìn)行SELECT 操作看是否正確;

SQL>select * from test_table

結(jié)果如下:

MS_NO TIP DESCS

-------------------- ----------------------------------------

13234 FIRSTS

46464 TESTA

13234 SECONDS

46464 TEST

?

<二>: 如何得到外部表的有關(guān)信息:

SQL> DESCDBA_EXTERNAL_TABLES;

Name TypeNullable

----------------------- ------------- -----

OWNERVARCHAR2(30)

TABLE_NAMEVARCHAR2(30)

TYPE_OWNERCHAR(3) Y

TYPE_NAME VARCHAR2(30)

DEFAULT_DIRECTORY_OWNERCHAR(3) Y

DEFAULT_DIRECTORY_NAME VARCHAR2(30)

REJECT_LIMITVARCHAR2(40) Y

ACCESS_TYPEVARCHAR2(7) Y

ACCESS_PARAMETERS VARCHAR2(4000) Y

SQL>SELECTOWNER,TABLE_NAME,DEFAULT_DIRECTORY_NAME,ACCESS_PARAMETERSFRFROM

DBA_EXTERNAL_TABLES;

可以得到外部表的相關(guān)信息;

?

<三>:如何得到外部路徑的信息:

SQL> desc DBA_EXTERNAL_LOCATIONS;

得到該表結(jié)構(gòu):

Name Type Nullable

--------------- -------------- --------

OWNERVARCHAR2(30)

TABLE_NAMEVARCHAR2(30)

LOCATIONVARCHAR2(4000) Y

DIRECTORY_OWNERCHAR(3) Y

DIRECTORY_NAME VARCHAR2(30) Y

SQL> select * fromDBA_EXTERNAL_LOCATIONS;

得到具體信息




?外部表的含義:

外部表是指不在數(shù)據(jù)庫中的表,如操作系統(tǒng)上的一個(gè)按一定格式分割的文本文件或者其他類型的表。這個(gè)外部表對于Oracle數(shù)據(jù)庫來說,就好像是一張視圖, 在數(shù)據(jù)庫中可以像視圖一樣進(jìn)行查詢等操作。這個(gè)視圖允許用戶在外部數(shù)據(jù)上運(yùn)行任何的SQL語句,而不需要先將外部表中的數(shù)據(jù)裝載進(jìn)數(shù)據(jù)庫中。不過需要注意是,外部數(shù)據(jù)表都是只讀的,不能夠更改。

外部表使用限制:(來源于http://www.examda.com/oracle/zonghe/20101031/141746967.html)

??? 需要先建立目錄對象:在創(chuàng)建外部表之前先要?jiǎng)?chuàng)建一個(gè)這個(gè)外部表要指向的文件所在目錄路徑的目錄;

? ??對于操作系統(tǒng)文件的限制

其實(shí)外部表簡單的說,就是跟操作系統(tǒng)上固定格式的文件或者表格的一個(gè)連接。為了Oracle數(shù)據(jù)庫系統(tǒng)能夠正確鏈接外部表,對于外部表的格式就提出 了比較嚴(yán)格的要求。如果不符合這些要求的話,數(shù)據(jù)庫系統(tǒng)就無法正確讀取外部表中的數(shù)據(jù)。如對于分隔符有比較嚴(yán)格的要求。雖然在外部文件或者表格中,可以使 用多種分隔符,如英文狀態(tài)下的逗號或者分號等等。但是有一個(gè)限制,即在同一個(gè)操作系統(tǒng)文件中只能夠使用一個(gè)分割符號,要么逗號或者分號等等。因?yàn)樵诮⑼?部表時(shí),必須指定操作系統(tǒng)文件所使用的分隔符號。如果有多種分隔符號的話,數(shù)據(jù)庫系統(tǒng)將無法識別。

  另外在外部表格中,不能夠帶有標(biāo)題信息。如現(xiàn)在有一張表格,以逗號分隔。而在其第一列數(shù)據(jù)中有各個(gè)列的標(biāo)題信息。而數(shù)據(jù)庫系統(tǒng)在連接這個(gè)表的時(shí) 候,會(huì)將這些標(biāo)題信息當(dāng)作普通的紀(jì)錄來對待。即會(huì)將這些信息也顯示在外部表中。為此如果這個(gè)標(biāo)題信息與外部表的字段類型不一致(如字段內(nèi)容是number 數(shù)據(jù)類型,而標(biāo)題信息則是字符型數(shù)據(jù),則在查詢時(shí)就會(huì)出錯(cuò))。如果數(shù)據(jù)類型恰巧一致的話,這個(gè)標(biāo)題信息Oracle數(shù)據(jù)庫也會(huì)當(dāng)作普通記錄來對待。如在建 立外部表的時(shí)候,最好確認(rèn)一下操作系統(tǒng)文件中是否包含標(biāo)題信息。如果有的話,需要?jiǎng)h除。否則的話,可能會(huì)出錯(cuò)。

  最后需要說明的是,當(dāng)Oracle數(shù)據(jù)庫系統(tǒng)訪問這個(gè)操作系統(tǒng)文件的時(shí)候,會(huì)在這個(gè)文件所在的目錄自動(dòng)創(chuàng)建一個(gè)日志文件。無論最后是否訪問成功,這個(gè)日志文件都會(huì)如期建立。查看這個(gè)日志文件,可以了解數(shù)據(jù)庫訪問外部表的頻率、是否成功訪問等等。??

在建立臨時(shí)表時(shí)的限制: 在建立臨時(shí)表時(shí),也會(huì)有不少的限制。如表中字段的名稱有一些特殊字符的話,那么這個(gè)表列的名稱必須使用英文狀態(tài)的下的雙引號連接起來。如采用 “studentno#”。遇到列名字中有特殊符號時(shí),如果不采用雙引號括起來,雖然臨時(shí)表可以正常創(chuàng)建,但是在采用的時(shí)候會(huì)出現(xiàn)錯(cuò)誤,無法正常查詢數(shù) 據(jù)。如數(shù)據(jù)庫系統(tǒng)可能會(huì)提醒:“數(shù)據(jù)庫插件錯(cuò)誤”等信息。為此最好在創(chuàng)建臨時(shí)表時(shí)不要在列名中使用一些特殊的字符。其實(shí)不光光是建立臨時(shí)表有這種限制,建 立其他標(biāo)或者試圖都有類似的限制。

  其次,這個(gè)外部表畢竟與內(nèi)部表不同。在創(chuàng)建外部表的時(shí)候,其實(shí)在數(shù)據(jù)庫中跟本沒有創(chuàng)建表。也就是說,不會(huì)為外部表分配任何的存儲(chǔ)空間。創(chuàng)建外部 表只是在數(shù)據(jù)字典中創(chuàng)建了外部表的元數(shù)據(jù),以便對應(yīng)訪問外部表中的數(shù)據(jù),而不在數(shù)據(jù)庫中存儲(chǔ)外部表的數(shù)據(jù)。簡單地說,數(shù)據(jù)庫存儲(chǔ)的只是與外部文件的一種對 應(yīng)關(guān)系,如字段與字段的對應(yīng)關(guān)系。而沒有存儲(chǔ)實(shí)際的數(shù)據(jù)。為此在表的操作與管理上,就會(huì)受到很大的限制。如在外部表上,是不能夠?yàn)楸韯?chuàng)建索引。因?yàn)閯?chuàng)建索 引就意味著要存在對應(yīng)的索引記錄。而外部表其實(shí)在數(shù)據(jù)庫不會(huì)有存儲(chǔ)。故在外部中是無法建立索引的。如果硬要建立的話,則系統(tǒng)會(huì)提示“操作在外部組織表上不 受支持”的錯(cuò)誤提示。同樣的道理,在數(shù)據(jù)庫中也不能夠更新外部表中的數(shù)據(jù),如插入記錄、刪除記錄或者更新信息等等。簡而言之,這個(gè)外部表對于數(shù)據(jù)庫來說, 是只讀的,不可更新。

??? 刪除外部表或者目錄對象: 當(dāng)外部表不用時(shí),需要及時(shí)刪除外部表或者與之對應(yīng)的目錄對象。不過在刪除這些內(nèi)容時(shí)會(huì)有一些限制。這些限制主要是管理上的限制,而不是技術(shù)上的限 制。也就是說,Oracle數(shù)據(jù)庫系統(tǒng)沒有對其進(jìn)行強(qiáng)制的限制。但是如果數(shù)據(jù)庫管理員不遵守這些限制的話,可能會(huì)出現(xiàn)一些問題。如要先刪除外部表,然后再 刪除目錄對象。有時(shí)候一個(gè)目錄對象中可能會(huì)包含多個(gè)外部表。此時(shí)必須要確認(rèn)所有的外部表都不用了,都已經(jīng)刪除干凈了,然后才能夠刪除目錄對象。在創(chuàng)建外部 表時(shí),操作系統(tǒng)會(huì)判斷一下,與之對應(yīng)的目錄對象是否已經(jīng)創(chuàng)建。但是在刪除對象時(shí),系統(tǒng)不會(huì)去判斷跟這個(gè)目錄對象關(guān)聯(lián)的外部表是否已經(jīng)全部刪除。如果目錄對 象刪除了,但是還有外部表存在。此時(shí)查詢這個(gè)外部表的時(shí)候,系統(tǒng)就會(huì)提示“對象不存在”的錯(cuò)誤信息。所以這個(gè)刪除目錄對象時(shí),數(shù)據(jù)庫系統(tǒng)缺乏一種檢查,此 時(shí)只有數(shù)據(jù)庫管理員在刪除目錄對象時(shí),先手工確認(rèn)一下這個(gè)目錄對象是否存在其他的外部表。

  要了解這個(gè)信息,則可以通過查詢dba_external_locations。通過查詢這張表,系統(tǒng)會(huì)反映當(dāng)前所有的目錄對象以及相關(guān)的外部 表,還會(huì)查詢出這些外部表所對應(yīng)的操作系統(tǒng)文件的名字。先查詢這張表格,確定要?jiǎng)h除的對象沒有其他關(guān)聯(lián)的外部表時(shí),再進(jìn)行刪除。否則的話,需要先確認(rèn)其他 外部表的可用性。免得因?yàn)檎`刪除而導(dǎo)致外部表無法正常使用。

??? 對于操作系統(tǒng)平臺的限制: 雖然Oracle數(shù)據(jù)庫是支持跨平臺的數(shù)據(jù)庫系統(tǒng),即同時(shí)支持Windows或者Linux等多種操作系統(tǒng)。但是在使用外部表的時(shí)候需要注意一個(gè)問題,即 在兩個(gè)操作系統(tǒng)上文本文件的存儲(chǔ)方式是不同的。如在Windows操作系統(tǒng)上利用txt文件建立了一個(gè)以逗號作為分隔符的文件,其一行一條記錄。但是在 Linux操作系統(tǒng)上打開的話,在其就可能使在同一行中顯示了。故為了數(shù)據(jù)庫系統(tǒng)能夠正確識別操作系統(tǒng)文件,最好這個(gè)操作系統(tǒng)文件能夠和Oracle數(shù)據(jù) 庫系統(tǒng)部署在同一臺服務(wù)器上或者同一種操作系統(tǒng)上。否則的話,很可能因?yàn)楦袷降臎_突,而導(dǎo)致數(shù)據(jù)庫系統(tǒng)無法正確讀取外部文件中的數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的Oracle之外部表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。