此处会引用部分潇湘隐者的内容。
RACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件。因此,建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。外部表,顾名思义,存储在数据库外面的表。当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。不能对外部表建立索引。因为创建索引就意味着要存在对应的索引记录。而外部表其实在没有存储在数据库中。故在外部是无法建立索引的。如果硬要建立的话,则系统会提示“操作在外部组织表上不受支持”的错误提示。
(我的理解是直接读取数据库外的文件,与传统的数据文件存储方式不同,可以读取,单不能以普通的数据库表的操作来操作)
外部表特征
(1) 位于文件系统之中(一定要在数据库服务器中,而不是其它网络路径),按一定格式分割,
例如@#$等,文本文件或者其他类型的文件可以作为外部表。(远程文件不行)
(2) 对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。
(3) 外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。
(4) ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。
(5) 可以查询操作和连接。也可以并行操作。
(6) 数据在数据库的外部组织,是操作系统文件。
(7) 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
实验部分:
1.从9i开始,ORACLE数据库若需要存取文件系统,就必须使用目录对象,以相对路径方式存取文件,强化数据库的安全性。建立目录对象、授予权限。
conn / as sysdba
create or replace directory mydir as '/home/oracle/';
给用户授予指定目录的操作权限
grant read,write on directory mydir to scott;
注:select * from dba_directories; 查询用户的的逻辑目录。
2:创建外部表
我创建了一个平面文件作为测试用例。
在/home/oracle/ 创建1.txt
[oracle@11g ~]$ vi 1.txt
[oracle@11g ~]$ cat 1.txt
10,'job','TOkyo'
3.数据库中在用户下创建外部表。
conn scott/tiger
CREATE TABLE dept_external (
deptno NUMBER(6),
dname VARCHAR2(20),
loc VARCHAR2(25)
)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY mydir
ACCESS PARAMETERS
(
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
(
deptno INTEGER EXTERNAL(6),
dname CHAR(20),
loc CHAR(25)
)
)
LOCATION ('1.txt')
)
REJECT LIMIT UNLIMITED;
Table created.
4.查询外部表
SCOTT@ db>select * from dept_external;
DEPTNO DNAME LOC
---------- -------------------- -------------------------
10 'job' 'TOkyo'
Elapsed: 00:00:00.08
注:
此处可以测试往外部表中添加数据,会提示错误。
===================================================
SCOTT@ db>insert into dept_external values (20,'job','test');
insert into dept_external values (20,'job','test')
*
ERROR at line 1:
ORA-30657: operation not supported on external organized table