什么是外部表?
External table和正规的表很相似具体的定义可以参见《Oracle概念手册》以下的几点需要注意
>创建的语法类似于 CREATE TABLE ORGANIZATION EXTERNAL
>数据在数据库的外部组织是操作系统文件
>操作系统文件在数据库中的标志是通过一个逻辑目录来映射的
>数据是只读的(外部表相当于一个只读的虚表)
>不可以在上面运行任何DML操作不可以创建索引
>可以查询操作和连接可以并行操作
例子
假定有如下的两个数据文件
平面文件数据的描述
假设如下的两个平面文件
dat
Code: [Copy to clipboard]
SMITHCLERKDEC
ALLENSALESMANFEB
WARDSALESMANFEB
JONESMANAGERAPR
dat
Code: [Copy to clipboard]
MARTINSALESMANSEP
BLAKEMANAGERMAY
MILLERCLERKJAN
(要有对操作系统中该目录的读写权限)
创建一个逻辑目录并进行适当授权
Code: [Copy to clipboard]
SQL> CREATE DIRECTORY TESTDIR AS D:\TEMP\;
目录已创建
SQL> GRANT READ ON DIRECTORY TESTDIR TO DEMO;
授权成功
SQL> GRANT WRITE ON DIRECTORY TESTDIR TO DEMO;
授权成功
注意创建完毕逻辑目录之后要把平面文件拷贝到该目录下另外还要注意文件名字不要写错
创建外部表
Code: [Copy to clipboard]
SQL> ED
已写入文件 afiedtbuf
CREATE TABLE DEMOEXT
(emp_id number()
ename varchar()
job varchar()
mgr_idnumber()
hiredate date
salary number()
comm number()
dept_id number())
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY TESTDIR
ACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY )
* LOCATION(DATDAT))
SQL> /
表已创建
进行Select选择操作看看是否正确
Code: [Copy to clipboard]
SQL> select * from DEMOEXT
EMP_ID ENAME JOB MGR_ID HIREDATESALARY COMM DEPT_ID
SMITH CLERK DEC
ALLEN SALESMAN FEB
WARDSALESMAN FEB
JONES MANAGER APR
MARTINSALESMAN SEP
BLAKE MANAGER MAY
MILLERCLERK JAN
如果要得到外部表的有关信息
Code: [Copy to clipboard]
SQL> DESC DBA_EXTERNAL_TABLES;
名称
OWNER
TABLE_NAME
TYPE_OWNER
TYPE_NAME
DEFAULT_DIRECTORY_OWNER
DEFAULT_DIRECTORY_NAME
REJECT_LIMIT
ACCESS_TYPE
ACCESS_PARAMETERS
SQL> SELECT OWNERTABLE_NAMEDEFAULT_DIRECTORY_NAMEACCESS_PARAMETERS
FROM
DBA_EXTERNAL_TABLES;
OWNERTABLE_NAMEDEFAULT_DIRECTORY_NAME ACCESS_PARAMETERS
DEMOEXTTESTDIR RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY
如果DBA想要知道平面文件的位置使用如下的查询
Code: [Copy to clipboard]
SQL> desc DBA_EXTERNAL_LOCATIONS;
名称
OWNER
TABLE_NAME
LOCATION
DIRECTORY_OWNER
DIRECTORY_NAME
SQL>select * from DBA_EXTERNAL_LOCATIONS;
OWNER TABLE_NAME LOCATIONDIRDIRECTORY_NAME
DEMO EXT DAT SYSTESTDIR
DEMO EXT DAT SYS TESTDIR