外部表概述:
Oracle外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件。
外部表注意事项:
a.建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。
b.外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。
c.不能对外部表建立索引。
d.对外部表不能使用analyze搜集统计信息
c.创建外部表时access parameter内部不要加注释否则会报ORA-29913,ORA-29400
外部表创建:
1、外部表ORACLE_LOADER
a.创建目录对象并授权
$ mkdir -p /home/oracle/dir_orcl
SQL>create or replace directory dir_dump as '/home/oracle/dir_orcl';
SQL>grant read,write on directory dir_dump to scott;
b.准备外部文件
-bash-4.1$ more ex_tab.dat
MITH@@CLERK@@800.00@@RESEARCH
ALLEN@@SALESMAN@@1600.00@@SALES
WARD@@SALESMAN@@1250.00@@SALES
JONES@@MANAGER@@2975.00@@RESEARCH
MARTIN@@SALESMAN@@1250.00@@SALES
BLAKE@@MANAGER@@2850.00@@SALES
CLARK@@MANAGER@@2450.00@@ACCOUNTING
SCOTT@@ANALYST@@3000.00@@RESEARCH
KING@@PRESIDENT@@5000.00@@ACCOUNTING
TURNER@@SALESMAN@@1500.00@@SALES
ADAMS@@CLERK@@1100.00@@RESEARCH
JAMES@@CLERK@@950.00@@SALES
FORD@@ANALYST@@3000.00@@RESEARCH
MILLER@@CLERK@@1300.00@@ACCOUNTING
c.外部表ORACLE_LOADER类型的创建语法
create table ex_tab1(
ename varchar2(60),
job varchar2(20),
sal number(9,2),
dname varchar(60)
)
organization external --外部表关键词,定义该表为外部表
(
type oracle_loader --外部表的类型为oracle_loader
default directory dump_dir --目录
access parameters(
records delimited by newline
fields terminated by '@@'
optionally enclosed by '"'
lrtrim missing field values are null
reject rows with all null fields
)
location ('ex_tab1.dat') --外部表数据文件
) reject limit 0;
b.验证外部表ex_tab1
SQL> select * from ex_tab1;
ENAME JOB SAL DNAME
---------- --------------- ---------- ----------
MITH CLERK 800.00 RESEARCH
ALLEN SALESMAN 1600.00 SALES
WARD SALESMAN 1250.00 SALES
JONES MANAGER 2975.00 RESEARCH
MARTIN SALESMAN 1250.00 SALES
BLAKE MANAGER 2850.00 SALES
CLARK MANAGER 2450.00 ACCOUNTING
SCOTT ANALYST 3000.00 RESEARCH
KING PRESIDENT 5000.00 ACCOUNTING
TURNER SALESMAN 1500.00 SALES
ADAMS CLERK 1100.00 RESEARCH
JAMES CLERK 950.00 SALES
FORD ANALYST 3000.00 RESEARCH
MILLER CLERK 1300.00 ACCOUNTING
14 rows selected.
SQL>
2、外部表ORACLE_DATAPUMP类型
a.创建目录对象及授权
同 1.a
b.创建ORACLE_DATAPUMP类型的外部表
create table ex_tab2 --创建外部表
(ename,job,sal,dname) --表列描述,注意未指定数据类型
organization external
(
type oracle_datapump --使用datapump将查询结果填充到外部表,注,此处由select生成,故不支持oracle_loader
default directory DUMP_DIR --指定外部表的存放目录
location(DUMP_DIR:'ex_tab1.dmp,ex_tab2.dmp')
)parallel 2 --按并行方式来填充,这里的并行度必须与生成的文件数量一致才能起作用,详细算法可
as
select ename,job,sal,dname --填充使用的原始数据
from emp join dept
on emp.deptno=dept.deptno ;
c.验证外部表
SQL> select * from ex_tab2;
ENAME JOB SAL DNAME
---------- --------------- ---------- ----------
SMITH CLERK 800.00 RESEARCH
ALLEN SALESMAN 1600.00 SALES
WARD SALESMAN 1250.00 SALES
JONES MANAGER 2975.00 RESEARCH
MARTIN SALESMAN 1250.00 SALES
BLAKE MANAGER 2850.00 SALES
CLARK MANAGER 2450.00 ACCOUNTING
SCOTT ANALYST 3000.00 RESEARCH
KING PRESIDENT 5000.00 ACCOUNTING
TURNER SALESMAN 1500.00 SALES
ADAMS CLERK 1100.00 RESEARCH
JAMES CLERK 950.00 SALES
FORD ANALYST 3000.00 RESEARCH
MILLER CLERK 1300.00 ACCOUNTING
14 rows selected.
SQL>
3、外部表相关的视图
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;
4、外部表的局限性
1.SQLLDR可以指定多少提交一次,即ROWS=?, 外部表却没有,这对于大数据量的导入有些不方例。
2.sqlldr errors表示允许错误的行数,外部表用REJECT LIMIT UNLIMITED,这个功能上基本相同。
3.外部表的列不能指定为not nullable,这样就很难拒绝某列为空值的记录。
4.外部表不能使用continueif ,如果记录有换行的就比较难处理。