ORACLE 外部表的简单使用
外部表概述
外部表只能在Oracle 9i之后來使用。簡(jiǎn)單地說,外部表,是指不存在于數(shù)據(jù)庫(kù)中的表。通過向Oracle提供描述外部表的元數(shù)據(jù),
我們可以把一個(gè)操作系統(tǒng)文件當(dāng)成一個(gè)只讀的數(shù)據(jù)庫(kù)表,就像這些數(shù)據(jù)存儲(chǔ)在一個(gè)普通數(shù)據(jù)庫(kù)表中一樣來進(jìn)行訪問。外部表是對(duì)數(shù)據(jù)庫(kù)表的延伸。
外部表的特性
位于文件系統(tǒng)之中,按一定格式分割,如文本文件或者其他類型的表可以作為外部表。
對(duì)外部表的訪問可以通過SQL語(yǔ)句來完成,而不需要先將外部表中的數(shù)據(jù)裝載進(jìn)數(shù)據(jù)庫(kù)中。
外部數(shù)據(jù)表都是只讀的,因此在外部表不能夠執(zhí)行DML操作,也不能創(chuàng)建索引。
ANALYZE語(yǔ)句不支持采集外部表的統(tǒng)計(jì)數(shù)據(jù),應(yīng)該使用DMBS_STATS包來采集外部表的統(tǒng)計(jì)數(shù)據(jù)。
創(chuàng)建外部表的注意事項(xiàng)
1.需要先建立目錄對(duì)象。
在建立對(duì)象的時(shí)候,需要小心,Oracle數(shù)據(jù)庫(kù)系統(tǒng)不會(huì)去確認(rèn)這個(gè)目錄是否真的存在。如果在輸入這個(gè)目錄對(duì)象的時(shí)候,不小心把路徑寫錯(cuò)了,
那可能這個(gè)外 部表仍然可以正常建立,但是卻無法查詢到數(shù)據(jù)。由于建立目錄對(duì)象時(shí),缺乏這種自我檢查的機(jī)制,為此在將路徑賦予給這個(gè)目錄對(duì)象時(shí),需要特別的注意。
另外需 要注意的是路徑的大小寫。在Windows操作系統(tǒng)中,其路徑是不區(qū)分大小寫的。而在Linux操作系統(tǒng),這個(gè)路徑需要區(qū)分大小寫。故在不同的操作系統(tǒng) 中,建立目錄對(duì)象時(shí)需要注意這個(gè)大小寫的差異。
2.對(duì)于操作系統(tǒng)文件的要求
建立外部表時(shí),必須指定操作系統(tǒng)文件所使用的分隔符號(hào)。并且該分隔符有且只有一個(gè)。創(chuàng)建外部表時(shí),不能含有標(biāo)題列。
如果這個(gè)標(biāo)題信息與外部表的字段類型不一致(如字段內(nèi)容是number數(shù)據(jù)類型,而標(biāo)題信息則是字符型數(shù)據(jù),則在查詢時(shí)就會(huì)出錯(cuò))。
如果數(shù)據(jù)類型恰巧一致的話,這個(gè)標(biāo)題信息Oracle數(shù)據(jù)庫(kù)也會(huì)當(dāng)作普通記錄來對(duì)待。當(dāng)Oracle數(shù)據(jù)庫(kù)系統(tǒng)訪問這個(gè)操作系統(tǒng)文件的時(shí)候,會(huì)在這個(gè)文件所在的目錄自動(dòng)創(chuàng)建一個(gè)日志文件。無論最后是否訪問成功,這個(gè)日志文件都會(huì)如期建立。
查看這個(gè)日志文件,可以了解數(shù)據(jù)庫(kù)訪問外部表的頻率、是否成功訪問等等。默認(rèn)情況下,該日志在與外部表的相同directory下產(chǎn)生。
3.在建立臨時(shí)表時(shí)的相關(guān)限制
對(duì)表中字段的名稱存在特殊字符的情況下,必須使用英文狀態(tài)的下的雙引號(hào)將該表列名稱連接起來。如采用”SalseID#”。
對(duì)于列名字中特殊符號(hào)未采用雙引號(hào)括起來時(shí),會(huì)導(dǎo)致無法正常查詢數(shù)據(jù)。
建議不用使用特殊的列標(biāo)題字符
在創(chuàng)建外部表的時(shí)候,并沒有在數(shù)據(jù)庫(kù)中創(chuàng)建表,也不會(huì)為外部表分配任何的存儲(chǔ)空間。
創(chuàng)建外部表只是在數(shù)據(jù)字典中創(chuàng)建了外部表的元數(shù)據(jù),以便對(duì)應(yīng)訪問外部表中的數(shù)據(jù),而不在數(shù)據(jù)庫(kù)中存儲(chǔ)外部表的數(shù)據(jù)。
簡(jiǎn)單地說,數(shù)據(jù)庫(kù)存儲(chǔ)的只是與外部文件的一種對(duì)應(yīng)關(guān)系,如字段與字段的對(duì)應(yīng)關(guān)系。而沒有存儲(chǔ)實(shí)際的數(shù)據(jù)。
由于存儲(chǔ)實(shí)際數(shù)據(jù),故無法為外部表創(chuàng)建索引,同時(shí)在數(shù)據(jù)使用DML時(shí)也不支持對(duì)外部表的插入、更新、刪除等操作。
4.刪除外部表或者目錄對(duì)象
一般情況下,先刪除外部表,然后再刪除目錄對(duì)象,如果目錄對(duì)象中有多個(gè)表,應(yīng)刪除所有表之后再刪除目錄對(duì)象。
如果在未刪除外部表的情況下,強(qiáng)制刪除了目錄,在查詢到被刪除的外部表時(shí),將收到"對(duì)象不存在"的錯(cuò)誤信息。
查詢dba_external_locations來獲得當(dāng)前所有的目錄對(duì)象以及相關(guān)的外部表,同時(shí)會(huì)給出這些外部表所對(duì)應(yīng)的操作系統(tǒng)文件的名字。 如果只是在數(shù)據(jù)庫(kù)層面上刪除外部表,并不會(huì)自動(dòng)刪除操作系統(tǒng)上的外部表文件。
5.對(duì)于操作系統(tǒng)平臺(tái)的限制
不同的操作系統(tǒng)對(duì)于外部表有不同的解釋和顯示方式
如在Linux操作系統(tǒng)中創(chuàng)建的文件是分號(hào)分隔且每行一條記錄,但該文件在Windows操作系統(tǒng)上打開則并非如此。
建議避免不同操作系統(tǒng)以及不同字符集所帶來的影響
?
創(chuàng)建外部表:
1.創(chuàng)建目錄對(duì)象:
select * from dba_directories;
drop directory DMP3;
create directory? DMP3 as '/tmp';
2.創(chuàng)建元數(shù)據(jù):
在系統(tǒng)/tmp 下創(chuàng)建 test.txt 文件,存儲(chǔ)數(shù)據(jù)
vi test.txt
3.創(chuàng)建外部表:
CREATE TABLE SMP.SN_TEMP
(
? SN? VARCHAR2(40 BYTE)
)
ORGANIZATION EXTERNAL
? (? TYPE ORACLE_LOADER
???? DEFAULT DIRECTORY DMP3
???? ACCESS PARAMETERS
?????? ( records delimited by newline
?? nobadfile
? nodiscardfile
? nologfile
??? )
???? LOCATION (DMP3:'test.txt')
? )
REJECT LIMIT UNLIMITED
NOPARALLEL
NOMONITORING;
?
5. 外部表使用:
之前外部表使用時(shí)無法和內(nèi)部表做鏈接查詢,發(fā)現(xiàn)外部表里字段竟包含了一個(gè)空格,所以使用時(shí)要截取字段,排除空格
select length(SN) from smp.SN_TEMP?
?
select substr("SN", 0,17) from smp.SN_TEMP
或者 select trim(sn) from smp.SN_TEMP
轉(zhuǎn)載于:https://www.cnblogs.com/jack-yuan/p/6509250.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的ORACLE 外部表的简单使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。