- 相關(guān)推薦
外部表在Oracle數據庫中使用的限制
外部表是指不在數據庫中的表,如操作系統上的一個(gè)按一定格式分割的文本文件或者其他類(lèi)型的表。這個(gè)外部表對于Oracle數據庫來(lái)說(shuō),就好像是一張視圖,在數據庫中可以像試圖一樣進(jìn)行查詢(xún)等操作。這個(gè)試圖允許用戶(hù)在外部數據上運行任何的SQL語(yǔ)句,而不需要先將外部表中的數據裝載進(jìn)數據庫中。不過(guò)需要注意是,外部數據表都是只讀的,不能夠更改。不過(guò)在使用外部表時(shí)仍然有不少的限制。
限制一:需要先建立目錄對象。
在使用外部數據表的時(shí)候,需要先建立目錄對象。也就是說(shuō),要想Oracle數據庫系統(在Oracle中實(shí)現控制文件多路復用)訪(fǎng)問(wèn)操作系統文件,就必須在數據庫中建立指向這個(gè)操作系統文件的目錄對象,然后通過(guò)這個(gè)目錄對象訪(fǎng)問(wèn)相應的操作系統文件,即用目錄對象存儲操作文件的保存位置。不過(guò)需要注意,這個(gè)目錄對象普通用戶(hù)是無(wú)權創(chuàng )建的。一般情況下只有特權用戶(hù)或者數據庫管理員角色才可以創(chuàng )建目錄對象。如果允許其他用戶(hù)也可以創(chuàng )建目錄對象的話(huà),就需要授權給其他用戶(hù)。
其實(shí)這個(gè)目錄對象就是操作系統中文件或者表格的存儲位置。不過(guò)在建立對象的時(shí)候,需要小心,Oracle數據庫系統不會(huì )去確認這個(gè)目錄是否真的存在。如果在輸入這個(gè)目錄對象的時(shí)候,不小心把路徑寫(xiě)錯了,那可能這個(gè)外部表仍然可以正常建立,但是卻無(wú)法查詢(xún)到數據。由于建立目錄對象時(shí),缺乏這種自我檢查的機制,為此在將路徑賦予給這個(gè)目錄對象時(shí),需要特別的注意。另外需要注意的是路徑的大小寫(xiě)。在Windows操作系統中,其路徑是不區分大小寫(xiě)的。而在Linux操作系統,這個(gè)路徑需要區分大小寫(xiě)。故在不同的操作系統中,建立目錄對象時(shí)需要注意這個(gè)大小寫(xiě)的差異。最好數據庫管理員可以養成一個(gè)習慣,無(wú)論在什么操作系統中,都采用小寫(xiě)的目錄名與文件名。那么在不同的操作系統中,就不用受到這個(gè)大小寫(xiě)的困擾了。最后需要注意的是,目錄對象名必須唯一。如果目錄對象名字有重復的話(huà),系統會(huì )提示錯誤信息:“名稱(chēng)已有現有對象引用”,而不會(huì )自動(dòng)覆蓋原有的對象名設置。
雖然這個(gè)對象名設置比較簡(jiǎn)單,但是其是數據庫尋找操作系統上文件的唯一途徑。所以這個(gè)目錄對象的創(chuàng )建必須確保準確。否則的話(huà),外部表就可能無(wú)法正常使用。
限制二:對于操作系統文件的限制。
其實(shí)外部表簡(jiǎn)單的說(shuō),就是跟操作系統上固定格式的文件或者表格的一個(gè)連接。為了Oracle數據庫系統能夠正確鏈接外部表,對于外部表的格式就提出了比較嚴格的要求。如果不符合這些要求的話(huà),數據庫系統就無(wú)法正確讀取外部表中的數據。如對于分隔符有比較嚴格的要求。雖然在外部文件或者表格中,可以使用多種分隔符,如英文狀態(tài)下的逗號或者分號等等。但是有一個(gè)限制,即在同一個(gè)操作系統文件中只能夠使用一個(gè)分割符號,要么逗號或者分號等等。因為在建立外部表時(shí),必須指定操作系統文件所使用的分隔符號。如果有多種分隔符號的話(huà),數據庫系統將無(wú)法識別。
另外在外部表格中,不能夠帶有標題信息。如現在有一張表格,以逗號分隔。而在其第一列數據中有各個(gè)列的標題信息。而數據庫系統在連接這個(gè)表的時(shí)候,會(huì )將這些標題信息當作普通的紀錄來(lái)對待。即會(huì )將這些信息也顯示在外部表中。為此如果這個(gè)標題信息與外部表的字段類(lèi)型不一致(如字段內容是number 數據類(lèi)型,而標題信息則是字符型數據,則在查詢(xún)時(shí)就會(huì )出錯)。如果數據類(lèi)型恰巧一致的話(huà),這個(gè)標題信息Oracle數據庫也會(huì )當作普通記錄來(lái)對待。如在建立外部表的時(shí)候,最好確認一下操作系統文件中是否包含標題信息。如果有的話(huà),需要刪除。否則的話(huà),可能會(huì )出錯。
最后需要說(shuō)明的是,當Oracle數據庫系統訪(fǎng)問(wèn)這個(gè)操作系統文件的時(shí)候,會(huì )在這個(gè)文件所在的目錄自動(dòng)創(chuàng )建一個(gè)日志文件。無(wú)論最后是否訪(fǎng)問(wèn)成功,這個(gè)日志文件都會(huì )如期建立。查看這個(gè)日志文件,可以了解數據庫訪(fǎng)問(wèn)外部表的頻率、是否成功訪(fǎng)問(wèn)等等。
限制三:在建立臨時(shí)表時(shí)的限制。
在建立臨時(shí)表時(shí),也會(huì )有不少的限制。如表中字段的名稱(chēng)有一些特殊字符的話(huà),那么這個(gè)表列的名稱(chēng)必須使用英文狀態(tài)的下的雙引號連接起來(lái)。如采用 ”studentno#”。遇到列名字中有特殊符號時(shí),如果不采用雙引號括起來(lái),雖然臨時(shí)表可以正常創(chuàng )建,但是在采用的時(shí)候會(huì )出現錯誤,無(wú)法正常查詢(xún)數據。如數據庫系統可能會(huì )提醒:“數據庫插件錯誤”等信息。為此最好在創(chuàng )建臨時(shí)表時(shí)不要在列名中使用一些特殊的字符。其實(shí)不光光是建立臨時(shí)表有這種限制,建立其他標或者試圖都有類(lèi)似的限制。
其次,這個(gè)外部表畢竟與內部表不同。在創(chuàng )建外部表的時(shí)候,其實(shí)在數據庫中跟本沒(méi)有創(chuàng )建表。也就是說(shuō),不會(huì )為外部表分配任何的存儲空間。創(chuàng )建外部表只是在數據字典中創(chuàng )建了外部表的元數據,以便對應訪(fǎng)問(wèn)外部表中的數據,而不在數據庫中存儲外部表的數據。簡(jiǎn)單地說(shuō),數據庫存儲的只是與外部文件的一種對應關(guān)系,如字段與字段的對應關(guān)系。而沒(méi)有存儲實(shí)際的數據。為此在表的操作與管理上,就會(huì )受到很大的限制。如在外部表上,是不能夠為表創(chuàng )建索引。因為創(chuàng )建索引就意味著(zhù)要存在對應的索引記錄。而外部表其實(shí)在數據庫不會(huì )有存儲。故在外部中是無(wú)法建立索引的。如果硬要建立的話(huà),則系統會(huì )提示“操作在外部組織表上不受支持”的錯誤提示。同樣的道理,在數據庫中也不能夠更新外部表中的數據,如插入記錄、刪除記錄或者更新信息等等。簡(jiǎn)而言之,這個(gè)外部表對于數據庫來(lái)說(shuō),是只讀的,不可更新。
限制四:刪除外部表或者目錄對象。
當外部表不用時(shí),需要及時(shí)刪除外部表或者與之對應的目錄對象。不過(guò)在刪除這些內容時(shí)會(huì )有一些限制。這些限制主要是管理上的限制,而不是技術(shù)上的限制。也就是說(shuō),Oracle數據庫系統沒(méi)有對其進(jìn)行強制的限制。但是如果數據庫管理員不遵守這些限制的話(huà),可能會(huì )出現一些問(wèn)題。如要先刪除外部表,然后再刪除目錄對象。有時(shí)候一個(gè)目錄對象中可能會(huì )包含多個(gè)外部表。此時(shí)必須要確認所有的外部表都不用了,都已經(jīng)刪除干凈了,然后才能夠刪除目錄對象。在創(chuàng )建外部表時(shí),操作系統會(huì )判斷一下,與之對應的目錄對象是否已經(jīng)創(chuàng )建。但是在刪除對象時(shí),系統不會(huì )去判斷跟這個(gè)目錄對象關(guān)聯(lián)的外部表是否已經(jīng)全部刪除。如果目錄對象刪除了,但是還有外部表存在。此時(shí)查詢(xún)這個(gè)外部表的時(shí)候,系統就會(huì )提示“對象不存在”的錯誤信息。所以這個(gè)刪除目錄對象時(shí),數據庫系統缺乏一種檢查,此時(shí)只有數據庫管理員在刪除目錄對象時(shí),先手工確認一下這個(gè)目錄對象是否存在其他的外部表。
要了解這個(gè)信息,則可以通過(guò)查詢(xún)dba_external_locations。通過(guò)查詢(xún)這張表,系統會(huì )反映當前所有的目錄對象以及相關(guān)的外部表,還會(huì )查詢(xún)出這些外部表所對應的操作系統文件的名字。先查詢(xún)這張表格,確定要刪除的對象沒(méi)有其他關(guān)聯(lián)的外部表時(shí),再進(jìn)行刪除。否則的話(huà),需要先確認其他外部表的可用性。免得因為誤刪除而導致外部表無(wú)法正常使用。
限制五:對于操作系統平臺的限制。
雖然Oracle數據庫是支持跨平臺的數據庫系統,即同時(shí)支持Windows或者Linux等多種操作系統。但是在使用外部表的時(shí)候需要注意一個(gè)問(wèn)題,即在兩個(gè)操作系統上文本文件的存儲方式是不同的。如在Windows操作系統上利用txt文件建立了一個(gè)以逗號作為分隔符的文件,其一行一條記錄。但是在Linux操作系統上打開(kāi)的話(huà),在其就可能使在同一行中顯示了。故為了數據庫系統能夠正確識別操作系統文件,最好這個(gè)操作系統文件能夠和Oracle數據庫系統部署在同一臺服務(wù)器上或者同一種操作系統上。否則的話(huà),很可能因為格式的沖突,而導致數據庫系統無(wú)法正確讀取外部文件中的數據。
【外部表在Oracle數據庫中使用的限制】相關(guān)文章:
Oracle數據庫語(yǔ)句大全10-08
ORACLE數據庫碎片的整理08-18
oracle數據庫基本語(yǔ)句08-21
Oracle數據庫認證層次08-29
Oracle數據庫的基本介紹09-04
Oracle數據庫SQLPLUS介紹10-09
Oracle 數據庫查詢(xún)小技巧10-17