免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Oracle外部表詳解

外部表概述

外部表只能在Oracle 9i之后來(lái)使用。簡(jiǎn)單地說(shuō),外部表,是指不存在于數(shù)據(jù)庫(kù)中的表。通過(guò)向Oracle提供描述外部表的元數(shù)據(jù),我們可以把一個(gè)操作系統(tǒng)文件當(dāng)成一個(gè)只讀的數(shù)據(jù)庫(kù)表,就像這些數(shù)據(jù)存儲(chǔ)在一個(gè)普通數(shù)據(jù)庫(kù)表中一樣來(lái)進(jìn)行訪問(wèn)。外部表是對(duì)數(shù)據(jù)庫(kù)表的延伸。

外部表的特性 

位于文件系統(tǒng)之中,按一定格式分割,如文本文件或者其他類型的表可以作為外部表。
對(duì)外部表的訪問(wèn)可以通過(guò)SQL語(yǔ)句來(lái)完成,而不需要先將外部表中的數(shù)據(jù)裝載進(jìn)數(shù)據(jù)庫(kù)中。
外部數(shù)據(jù)表都是只讀的,因此在外部表不能夠執(zhí)行DML操作,也不能創(chuàng)建索引。
ANALYZE語(yǔ)句不支持采集外部表的統(tǒng)計(jì)數(shù)據(jù),應(yīng)該使用DMBS_STATS包來(lái)采集外部表的統(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í)候,不小心把路徑寫(xiě)錯(cuò)了,那可能這個(gè)外 部表仍然可以正常建立,但是卻無(wú)法查詢到數(shù)據(jù)。由于建立目錄對(duì)象時(shí),缺乏這種自我檢查的機(jī)制,為此在將路徑賦予給這個(gè)目錄對(duì)象時(shí),需要特別的注意。另外需 要注意的是路徑的大小寫(xiě)。在Windows操作系統(tǒng)中,其路徑是不區(qū)分大小寫(xiě)的。而在Linux操作系統(tǒng),這個(gè)路徑需要區(qū)分大小寫(xiě)。故在不同的操作系統(tǒng) 中,建立目錄對(duì)象時(shí)需要注意這個(gè)大小寫(xiě)的差異

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)作普通記錄來(lái)對(duì)待。

當(dāng)Oracle數(shù)據(jù)庫(kù)系統(tǒng)訪問(wèn)這個(gè)操作系統(tǒng)文件的時(shí)候,會(huì)在這個(gè)文件所在的目錄自動(dòng)創(chuàng)建一個(gè)日志文件。無(wú)論最后是否訪問(wèn)成功,這個(gè)日志文件都會(huì)如期建立。查看這個(gè)日志文件,可以了解數(shù)據(jù)庫(kù)訪問(wèn)外部表的頻率、是否成功訪問(wèn)等等。默認(rèn)情況下,該日志在與外部表的相同directory下產(chǎn)生。

3.在建立臨時(shí)表時(shí)的相關(guān)限制

對(duì)表中字段的名稱存在特殊字符的情況下,必須使用英文狀態(tài)的下的雙引號(hào)將該表列名稱連接起來(lái)。如采用”SalseID#”。
對(duì)于列名字中特殊符號(hào)未采用雙引號(hào)括起來(lái)時(shí),會(huì)導(dǎo)致無(wú)法正常查詢數(shù)據(jù)。
建議不用使用特殊的列標(biāo)題字符
在創(chuàng)建外部表的時(shí)候,并沒(méi)有在數(shù)據(jù)庫(kù)中創(chuàng)建表,也不會(huì)為外部表分配任何的存儲(chǔ)空間。
創(chuàng)建外部表只是在數(shù)據(jù)字典中創(chuàng)建了外部表的元數(shù)據(jù),以便對(duì)應(yīng)訪問(wèn)外部表中的數(shù)據(jù),而不在數(shù)據(jù)庫(kù)中存儲(chǔ)外部表的數(shù)據(jù)。
簡(jiǎn)單地說(shuō),數(shù)據(jù)庫(kù)存儲(chǔ)的只是與外部文件的一種對(duì)應(yīng)關(guān)系,如字段與字段的對(duì)應(yīng)關(guān)系。而沒(méi)有存儲(chǔ)實(shí)際的數(shù)據(jù)。
由于存儲(chǔ)實(shí)際數(shù)據(jù),故無(wú)法為外部表創(chuàng)建索引,同時(shí)在數(shù)據(jù)使用DML時(shí)也不支持對(duì)外部表的插入、更新、刪除等操作。

4.刪除外部表或者目錄對(duì)象

一般情況下,先刪除外部表,然后再刪除目錄對(duì)象,如果目錄對(duì)象中有多個(gè)表,應(yīng)刪除所有表之后再刪除目錄對(duì)象。
如果在未刪除外部表的情況下,強(qiáng)制刪除了目錄,在查詢到被刪除的外部表時(shí),將收到'對(duì)象不存在'的錯(cuò)誤信息。
查詢dba_external_locations來(lái)獲得當(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)上打開(kāi)則并非如此。
建議避免不同操作系統(tǒng)以及不同字符集所帶來(lái)的影響

創(chuàng)建外部表 

使用CREATE TABLE語(yǔ)句的ORGANIZATION EXTENERAL子句來(lái)創(chuàng)建外部表。外部表不分配任何盤(pán)區(qū),因?yàn)閮H僅是在數(shù)據(jù)字典中創(chuàng)建元數(shù)據(jù)。

1.外部表的創(chuàng)建語(yǔ)法

createtabletable_name
           (col1 datatype1,col2 datatype2,col3 datatype3)
            organization exteneral
           (.....)
詳細(xì)語(yǔ)法可參見(jiàn)筆者的另兩篇文章

Oracle外部表ORACLE_DATAPUMP類型的創(chuàng)建語(yǔ)法詳解:http://czmmiao.iteye.com/blog/1268453

Oracle外部表ORACLE_LOADER類型的創(chuàng)建語(yǔ)法詳解:http://czmmiao.iteye.com/blog/1268157

2.由查詢結(jié)果集,使用Oracle_datapump來(lái)填充數(shù)據(jù)來(lái)生成外部表

a.創(chuàng)建系統(tǒng)目錄以及Oracle數(shù)據(jù)目錄名來(lái)建立對(duì)應(yīng)關(guān)系,同時(shí)授予權(quán)限

$ mkdir -p /home/oracle/external_tb/data
create or replace directory data_dir as '/home/oracle/external_tb/data/';
grant read,write on directory data_dir to scott;

b.創(chuàng)建外部表

create table ex_tb1 (ename,job,sal,dname) organization external (type oracle_datapump default directory data_dir location('ex_tb1')) parallel 1 as select ename,job,sal,dname from emp join dept on emp.deptno=dept.deptno;

c.驗(yàn)證外部表

select * from ex_tb1;

ENAME                       JOB           SAL  DNAME
------------------------- -------------------- ---- -------------------------
CLARK                  MANAGER              2450 ACCOUNTING
KING                     PRESIDENT             5000 ACCOUNTING
MILLER                   CLERK                 1300 ACCOUNTING
JONES                    MANAGER               2975 RESEARCH
FORD                     ANALYST               3000 RESEARCH
ADAMS                    CLERK                 1100 RESEARCH
SMITH                    CLERK                  800 RESEARCH
SCOTT                    ANALYST               3000 RESEARCH
WARD                     SALESMAN              1250 SALES
TURNER                   SALESMAN              1500 SALES
ALLEN                    SALESMAN              1600 SALES
JAMES                    CLERK                  950 SALES
BLAKE                    MANAGER               2850 SALES
MARTIN                   SALESMAN              1250 SALES

14 rows selected.

對(duì)于使用上述方式創(chuàng)建的外部表可以將其復(fù)制到其他路徑作為外部表的原始數(shù)據(jù)來(lái)生成新的外部表,用于轉(zhuǎn)移數(shù)據(jù)。

d.將外部表文件復(fù)制一個(gè)新的文件名,用以模擬到其他服務(wù)器上

$ cp /home/oracle/external_tb/data/ex_tb1 /home/oracle/external_tb/data/in_tb1

e. 新建表,將上述外部表的數(shù)據(jù)導(dǎo)入到新表中

create table in_tb1
            (ename varchar2(10),job varchar2(9),sal number(7,2),dname varchar(14))
            organization external
            (type oracle_datapump default directory data_dir location('in_tb1'));

f.驗(yàn)證新外部表的數(shù)據(jù)

select * from in_tb1; ENAME     JOB     SAL DNAME ------------------------- -------------------- ---- ------------------------- CLARK    MANAGER    2450 ACCOUNTING KING PRESIDENT 5000 ACCOUNTING MILLER CLERK 1300 ACCOUNTING JONES MANAGER 2975 RESEARCH FORD ANALYST 3000 RESEARCH ADAMS CLERK 1100 RESEARCH SMITH CLERK 800 RESEARCH SCOTT ANALYST 3000 RESEARCH WARD SALESMAN 1250 SALES TURNER SALESMAN 1500 SALES ALLEN SALESMAN 1600 SALES JAMES CLERK 950 SALES BLAKE MANAGER 2850 SALES MARTIN SALESMAN 1250 SALES 14 rows selected.

g.創(chuàng)建正常的表,將外部表數(shù)據(jù)導(dǎo)入,這就是利用ORACLE_DATAPUMP類型的額外部表實(shí)現(xiàn)數(shù)據(jù)遷移

create table tb1 as select * from in_tb1;

3.使用外部文件數(shù)據(jù),使用oracle_loader來(lái)填充數(shù)據(jù)來(lái)生成外部表

 a.準(zhǔn)備外部數(shù)據(jù)源文件

cat /home/oracle/external_tb/data/1.txt '7369','SMITH','CLERK','7902','17-DEC-80','100','0','20' '7499','ALLEN','SALESMAN','7698','20-FEB-81','250','0','30' '7521','WARD','SALESMAN','7698','22-FEB-81','450','0','30' '7566','JONES','MANAGER','7839','02-APR-81','1150','0','20' $ cat /home/oracle/external_tb/data/2.txt '7654','MARTIN','SALESMAN','7698','28-SEP-81','1250','0','30' '7698','BLAKE','MANAGER','7839','01-MAY-81','1550','0','30' '7934','MILLER','CLERK','7782','23-JAN-82','3500','0','10'

b.創(chuàng)建外部表

create table emp_new(
                    emp_id number(4),
                    ename varchar2(15),
                    job varchar2(12),
                    mgr_id number(4),
                    hiredate date,
                    salary number(8),
                    comm number(8),
                    dept_id number(2)
                    )
            organization external
                    (
                    type oracle_loader
                    default directory data_dir
                    access parameters(
                                    records delimited by newline
                                    badfile 'emp_new%a_%p.bad'
                                    logfile 'emp_new%a_%p.log'
                                    fields terminated by ','
                                    optionally enclosed by '''
                                    lrtrim missing field values are null
                                    reject rows with all null fields
                                    )
                    location ('1.txt','2.txt')
)
parallel 
reject limit unlimited;

c.驗(yàn)證外部表

select * from emp_new; EMP_ID ENAME JOB MGR_ID HIREDATE SALARY COMM DEPT_ID ------ ---------- --------------- ---------- ------------------- ---------- ---------- ---------- 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 0 30 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 1550 0 30 7934 MILLER CLERK 7782 1982-01-23 00:00:00 3500 0 10 7369 SMITH CLERK 7902 1980-12-17 00:00:00 100 0 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 250 0 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 450 0 30 7566 JONES MANAGER 7839 1981-04-02 00:00:00 1150 0 20 7 rows selected.

 4.外部表相關(guān)視圖

a.查看外部表信息

select TABLE_NAME,TYPE_NAME,DEFAULT_DIRECTORY_NAME,REJECT_LIMIT,ACCESS_PARAMETERS from user_external_tables;

b.獲得平面文件的位置

select * from user_external_locations order by table_name; TABLE_NAME LOCATION DIRECTORY DIRECTORY_NAME ---------- ---------- --------- -------------------- EMP_NEW 1.txt SYS DATA_DIR EMP_NEW 2.txt SYS DATA_DIR EX_TB1 ex_tb1 SYS DATA_DIR IN_TB1 in_tb1 SYS DATA_DIR

外部表定義的幾個(gè)重點(diǎn) 

1.ORGANIZATION EXTERNAL關(guān)鍵字,必須要有。以表明定義的表為外部表。

2..重要參數(shù)外部表的類型

ORACLE_LOADER:定義外部表的缺省方式,只能只讀方式實(shí)現(xiàn)文本數(shù)據(jù)的裝載。
ORACLE_DATAPUMP:支持對(duì)數(shù)據(jù)的裝載與卸載,數(shù)據(jù)文件必須為二進(jìn)制dump文件??梢詮耐獠勘硖崛?shù)據(jù)裝載到內(nèi)部表,也可以從內(nèi)部表卸載數(shù)據(jù)作為二進(jìn)制文件填充到外部表。

3.DEFAULT DIRECTORY:缺省的目錄指明了外部文件所在的路徑

4.LOCATION:定義了外部表的位置

5.ACCESS PARAMETERS:描述如何對(duì)外部表進(jìn)行訪問(wèn)

RECORDS關(guān)鍵字后定義如何識(shí)別數(shù)據(jù)行  
DELIMITED BY 'XXX'——換行符,常用newline定義換行,并指明字符集。對(duì)于特殊的字符則需要單獨(dú)定義,如特殊符號(hào),可以使用OX'十六位值',例如tab(/t)的十六位是9,則DELIMITEDBY0X'09';
cr(/r)的十六位是d,那么就是DELIMITEDBY0X'0D'。
SKIP X ——跳過(guò)X行數(shù)據(jù),有些文件中第一行是列名,需要跳過(guò)第一行,則使用SKIP 1。
FIELDS關(guān)鍵字后定義如何識(shí)別字段,常用的如下:
FIELDS:TERMINATED BY 'x'——字段分割符。
ENCLOSED BY 'x'——字段引用符,包含在此符號(hào)內(nèi)的數(shù)據(jù)都當(dāng)成一個(gè)字段。
例如一行數(shù)據(jù)格式如:'abc','a''b,''c,'。使用參數(shù)TERMINATED BY ',' ENCLOSED BY '''后,系統(tǒng)會(huì)讀到兩個(gè)字段,第一個(gè)字段的值是abc,第二個(gè)字段值是a'b,'c,。
LRTRIM ——?jiǎng)h除首尾空白字符。
MISSING FIELD VALUES ARE NULL——某些字段空缺值都設(shè)為NULL。
對(duì)于字段長(zhǎng)度和分割符不確定且準(zhǔn)備用作外部表文件,可以使用UltraEdit、Editplus等來(lái)進(jìn)行分析測(cè)試,如果文件較大,則需要考慮將文件分割成小文件并從中提取數(shù)據(jù)進(jìn)行測(cè)試。

外部表對(duì)錯(cuò)誤的處理 

REJECT LIMIT UNLIMITED
在創(chuàng)建外部表時(shí)最后加入LIMIT子句,表示可以允許錯(cuò)誤的發(fā)生個(gè)數(shù)。默認(rèn)值為零。設(shè)定為UNLIMITED則錯(cuò)誤不受限制
BADFILE和NOBADFILE子句
用于指定將捕獲到的轉(zhuǎn)換錯(cuò)誤存放到哪個(gè)文件。如果指定了NOBADFILE則表示忽略轉(zhuǎn)換期間的錯(cuò)誤
如果未指定該參數(shù),則系統(tǒng)自動(dòng)在源目錄下生成與外部表同名的.BAD文件BADFILE記錄本次操作的結(jié)果,下次將會(huì)被覆蓋 LOGFILE和NOLOGFILE子句
同樣在access parameters中加入LOGFILE 'LOG_FILE.log'子句,則所有Oracle的錯(cuò)誤信息放入'LOG_FILE.log'中
而NOLOGFILE子句則表示不記錄錯(cuò)誤信息到log中,如忽略該子句,系統(tǒng)自動(dòng)在源目錄下生成與外部表同名的.LOG文件
注意以下幾個(gè)常見(jiàn)的問(wèn)題
1.外部表經(jīng)常遇到BUFFER不足的情況,因此盡可能的增大READSIZE
2.換行符不對(duì)產(chǎn)生的問(wèn)題。在不同的操作系統(tǒng)中換行符的表示方法不一樣,碰到錯(cuò)誤日志提示如是換行符問(wèn)題,可以使用
UltraEdit打開(kāi),直接看十六進(jìn)制
3.特定行報(bào)錯(cuò)時(shí),查看帶有'BAD'的日志文件,其中保存了出錯(cuò)的數(shù)據(jù),用記事本打開(kāi)看看那里出錯(cuò),是否存在于外部表定義相沖突

外部表的局限性 

1.SQLLDR可以指定多少提交一次,即ROWS=?, 外部表卻沒(méi)有,這對(duì)于大數(shù)據(jù)量的導(dǎo)入有些不方例。
2.sqlldr errors表示允許錯(cuò)誤的行數(shù),外部表用REJECT LIMIT UNLIMITED,這個(gè)功能上基本相同。
3.外部表的列不能指定為not nullable,這樣就很難拒絕某列為空值的記錄。
4.外部表不能使用continueif ,如果記錄有換行的就比較難處理。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle外連接中對(duì)非連接條件使用(+)需要注意的地方
[轉(zhuǎn)] 關(guān)于oracle外部表的使用_oracle學(xué)習(xí)筆記
Oracle筆記(四) 簡(jiǎn)單查詢、限定查詢、數(shù)據(jù)的排序
Oracle 外部表
MySQL系列(上)MySQL索引、關(guān)聯(lián)子查詢與語(yǔ)句優(yōu)化技巧
Oracle行轉(zhuǎn)列語(yǔ)法總結(jié)大全
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服