目录
定义
External tables access data in external sources as if it were in a table in the database.
You can connect to the database and create metadata for the external table using DDL.
The DDL for an external table consists of two parts: one part that describes the Oracle
column types, and another part (the access parameters) that describes the mapping of
the external data to the Oracle data columns.
外部表是指不在库里的表,是操作系统上的一个按照一定格式分割的文本文件,或是其他类型的表,对oracle来说类似于视图,可以在数据库中像视图一样进行查询等操作,但是外部表在数据库中只有表结构,而数据存放在操作系统中。
外部表是通过如下语句创建,创建时需指定如下属性
create table TABLE_NAME …organization external |
1、TYPE:指定外部表的类型,也就是驱动访问,于SQL*Loader不同的是访问驱动运行在服务器内部,有两种可用的类型
ORACLE_LOADER:默认的访问驱动,它可将数据从外部表加载到内部表,数据必须要来自文本数据文件,但他不能将数据从内部表卸载到外部表。
ORACLE_DATAPUMP:它可以执行数据的加载和卸载,数据必须来自二进制转储文件,从外部表加载到内部表时,是通过二进制转储文件中提取来完成的(相当于导入),而从内部表卸载到外部表是通过填充外部表的二进制转储文件来完成(相当于导出)。转储文件一旦创建,可以读取任意次数,但是不能被修改(不能对其进行DML操作)。
2、DEFAULT DIRECTORY:所有输入输出文件使用的默认目录,位置是一个目录对象,数据逻辑位置,而不是一个具体在操作系统上的路径。在使用外部表之前必须创建(同数据泵)
3、ACCESS PARAMETER:描述外部数据源,每一种类型的外部表都有自己的访问驱动程序,该驱动程序为该类型的外部表提供唯一的访问参数
4、LOACATION:制定外部表的数据文件,文件命名方式directory:file,若不指定directory,则使用默认目录
外部表的创建
目录对象创建并赋权
SQL> show user; |
使用DATAPUMP创建
SQL> create table emp_ext01(no,name,work) organization external ( TYPE oracle_datapump DEFAULT DIRECTORY ext_scott LOCATION ('emp01.dmp','emp02.dmp') ) parallel as select empno,ename,job from emp where rownum<=5; |
查看外部表所创建的二进制文件
[oracle@oracle12c scott]$ cd /home/oracle/scott/ |
定义其他的外部表,并从中读取文件数据。
SQL> create table emp_ext_scott(no number(4),name varchar2(10),work varchar2(9)) organization external ( TYPE oracle_datapump DEFAULT DIRECTORY ext_scott LOCATION ('emp01.dmp','emp02.dmp') ); |
注意:外部表 emp_ext_scott 中的字段名、类型、长度,要和外部表中的一致
如果这个时候在造作系统层面把二进制文 件移走的话会怎么样呢?
[oracle@oracle12c scott]$ mkdir bak
SQL> DESC EMP_EXT_SCOTT;
Name Null? Type ----------------------------------------- -------- ---------------------- NO NUMBER(4) NAME VARCHAR2(10) WORK VARCHAR2(9)
|
当然是读不到数据了,只能看到表的定义,由此可以看出来数据并没有存到数据库中.
使用ORACLE_LOADER创建外部表并导入数据
创建测试数据
[oracle@oracle12c scott]$ cat ext_scott_oracle_loder.txt |
创建外部表
SQL> create table emp_ext_loader (no number(3),name varchar2(10),job varchar2(10)) organization external( TYPE oracle_loader DEFAULT DIRECTORY ext_scott ACCESS PARAMETERS( records delimited by newline fields terminated by ',' missing field values are null ) LOCATION('ext_scott_oracle_loder.txt') ); |
注意:
读取数据时,每行数据为 1 条记录
字段之间以逗号隔开
未赋值的字段为 null
如果再使坏,移走改文件又会是什么样呢?
[oracle@oracle12c scott]$ mv ext_scott_oracle_loder.txt bak |
虽然看不到数据了,但是可以看见表结构。