External table和正规的表很相似,具体的定义可以参见《Oracle概念手册》,以下的几点需要注意:
>创建的语法类似于: "CREATE TABLE ... ORGANIZATION EXTERNAL"
>数据在数据库的外部组织,是操作系统文件。
>操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
>数据是只读的。(外部表相当于一个只读的虚表)
>不可以在上面运行任何DML操作,不可以创建索引。
>可以查询操作和连接。可以并行操作。
一、将警告日志映射成外部表,可以方便警告日志的管理:
创建一个逻辑目录:
SQL> CREATE DIRECTORY alertlog AS '/home/oracle/admin/centdb/bdump';
SQL> CREATE TABLE alert_tab ( text VARCHAR2(80) )
2 ORGANIZATION EXTERNAL (
TYPE oracle_loader
DEFAULT DIRECTORY alertlog
ACCESS PARAMETERS (
3 4 5 6 RECORDS DELIMITED BY NEWLINE
)
LOCATION('alert_centdb.log')
7 8 9 )
REJECT LIMIT 9999;
10
Table created.
然后就可以在工具中查询该表的纪录。
这是一个将外部数据对应成外部表的例子,也就是说对于以前将数据用pb或者其他工具倒入数据库的操作都可以通过外部表的方式读取,只要不对外部表进行insert update delete,简单的操作select都是支持的。
二、下面的试验是使用外部表将数据库的数据导出的步骤:
创建逻辑目录:
SQL> CREATE DIRECTORY ext_dir AS '/home/lisa';
Directory created.
创建外部表:
SQL> SQL> CREATE TABLE emp_test
2 (id, name, SUBSYSTEM_ID)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY ext_dir
LOCATION ('emp1.exp')
3 4 5 6 7 8 )
REJECT LIMIT UNLIMITED AS
SELECT id, name, SUBSYSTEM_ID
FROM product_tab;
9 10 11
Table created.
查询该表纪录:
SQL> select count(*) from emp_test
2 ;
COUNT(*)
----------
27
在/home/lisa目录下可以看到到处的exp文件:
-rw-r----- 1 oracle oinstall 12288 Apr 25 14:14 emp1.exp
随后我试验了导出一个四百多万行纪录的表:
SQL> select count(*) from USER_TAB;
COUNT(*)
----------
4972208
SQL> select to_char(SYSTIMESTAMP,'yyyymmdd hh24:mi:ss.ff3') from dual;
TO_CHAR(SYSTIMESTAMP,'YYYYMMDD
---------------------------------------------------------------------------
20050425 14:38:22.633
SQL>
SQL> CREATE TABLE emp_test ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir LOCATION ('emp1.exp')) REJECT LIMIT UNLIMITED AS SELECT id,user_name FROM USER_TAB;
select to_char(SYSTIMESTAMP,'yyyymmdd hh24:mi:ss.ff3') from dual;
Table created.
SQL> SQL>
TO_CHAR(SYSTIMESTAMP,'YYYYMMDD
---------------------------------------------------------------------------
20050425 14:38:25.740
只要3秒多钟,我瞠目结舌了半天。
文件154M:
-rw-r----- 1 oracle oinstall 154574848 Apr 25 14:38 emp1.exp
删除外部表:
SQL> drop table emp_test;
Table dropped.
导入数据:
SQL> CREATE TABLE user_tabtest(id number,USER_NAME VARCHAR2(32)) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir LOCATION ('emp1.exp') );
Table created.
察看user_tabtest表的数据,与源表相同。
用TYPE ORACLE_DATAPUMP导出的文件必须用TYPE ORACLE_DATAPUMP建立外部表导入,我开始以为用TYPE oracle_loader,费了半天劲也不对。oracle对导出的文件格式进行了处理,这样不是限制了这个功能的时候吗?
虽然导出的速度很快,但是我们通常导出成文本的操作并不能取代,因为格式不能符合我们的要求,所以只是在数据迁移的时候有优势。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/51862/viewspace-180637/ ,如需转载,请注明出处,否则将追究法律责任。