External Table是由create table ... organization external语句创建的。4个主要参数:type, default directory, access parameters, location
有两种类型oracle_loader和oracle_datapump。
oracle_loader是默认的,它将数据从外部表导入到内部表。这些数据只能来自文本数据文件。该方法不能将数据从内部表导出到外部表。
oracle_datapump可以导入导出,只能是二进制的dump文件。
在数据文件与外部表之间的转换错误只会导致该行被忽略;而外部表与数据库表之间的转换错误会导致整个导入失败。
外部表的一些限制:
# 不支持含有加密字段(Encrypted column)的导入与导出。
# 外部表不知道保存在数据库中的数据。
# 外部表不知道数据是如何在外部数据源中保存的。这是access parameter的功能。
# 外部表不能导入数据到LONG字段。
一个简单的例子:
1. 创建一个数据文件/tmp/info.dat
56november, 15, 1980 baker mary alice 09/01/2004
87december, 20, 1970 roper lisa marie 01/01/2002
2. 创建一个directory并授予read/write on权限给test用户
create directory def_dir as '/tmp';
grant read,write on directory def_dir to test;
3. 用test登录并创建一个普通表emp
CREATE TABLE emp (emp_no CHAR(6), last_name CHAR(25), first_name CHAR(20), middle_initial CHAR(1), hire_date DATE, dob DATE);
4. 用test创建一个external table emp_load
create table emp_load
(employee_number char(5),
employee_dob char(20),
employee_last_name char(20),
employee_first_name char(15),
employee_middle_name char(15),
employee_hire_date date)
organization external
(type oracle_loader
default directory def_dir
access parameters
(records delimited by newline
fields (employee_number char(2),
employee_dob char(20),
employee_last_name char(18),
employee_first_name char(11),
employee_middle_name char(11),
employee_hire_date char(10) date_format date mask "mm/dd/yyyy"
)
)
location ('info.dat')
);
5. 从外部表emp_load导入数据到内部表emp
insert into emp (emp_no, first_name, middle_initial, last_name, hire_date, dob)
(select employee_number,
employee_first_name,
substr(employee_middle_name, 1, 1),
employee_last_name,
employee_hire_date,
to_date(employee_dob, 'month, dd, yyyy')
from emp_load);
6. 查询结果
select * from emp;
EMP_NO LAST_NAME FIRST_NAME M HIRE_DATE DOB
------ ------------------------- -------------------- - ------------ ------------
56 baker mary a 01-SEP-04 15-NOV-80
87 roper lisa m 01-JAN-02 20-DEC-70