今天在看Oracle的CONCEPT文档时发现Oracle的外部表也可以用来卸载数据了
从中开始Oracle增加了外部表的一个新的访问驱动ORACLE_DATAPUMP而再次之前只有一个默认的驱动ORACLE_LOADER
使用ORACLE_DATAPUMP驱动带来的一个优点是可以利用外部表将数据库中的数据卸载到磁盘文件中而这是及以前版本所无法做到的
下面看一个最简单的例子
SQL>CREATETABLET_EXTERNAL
(
ID
NAME
)
ORGANIZATIONEXTERNAL
(
TYPEORACLE_DATAPUMP
DEFAULTDIRECTORYD_OUTPUT
LOCATION(TESTDMP)
)
ASSELECTROWNUMRNTNAME
FROMTAB;
表已创建
在这张外部表创建的同时在D_OUTPUT所指向的操作系统目录下生成了一个TESTDMP二进制文件
显示这个二进制文件中的可显示字符
$stringsTESTDMP
IBMPC/WIN_NT
ZHSGBK
LBBEMBGHCJWDSDEBEWMFDDGJGSJHSRHJGKCLEGMBJMRAPRLPRPKRPARMSMRSJLSCETHLT
T
ZHSGBK
ALUTF
+:
YANGTK
T_EXTERNAL
ID
NAME
T_LOG<
TEST_LOB<
T_COMPRESS<
T_TEMP<
T_RECORD<
T_SESSION_STAT<
T_TEMP<
T_NO_EXISTS_BEFORE<
T_CHAR<
SYS_EXPORT_SCHEMA_<
T_EXTERNAL<
T_LOAD_SPACE<
T_LEVEL<
T_LEVEL<
CHAINED_ROWS<
T_TREE
这个二进制文件可以用于在其他数据库中创建外部表
SQL>CREATETABLET_EXTERNAL
(
IDNUMBER
NAMEVARCHAR()
)
ORGANIZATIONEXTERNAL
(
TYPEORACLE_DATAPUMP
DEFAULTDIRECTORYD_OUTPUT
LOCATION(TESTDMP)
);
表已创建
SQL>SELECT*FROMT_EXTERNAL;
IDNAME
T_LOG
TEST_LOB
T_COMPRESS
T_TEMP
T_RECORD
T_SESSION_STAT
T_TEMP
T
T_NO_EXISTS_BEFORE
T_CHAR
SYS_EXPORT_SCHEMA_
T_EXTERNAL
T_LOAD_SPACE
T_LEVEL
T_LEVEL
CHAINED_ROWS
T_TREE
已选择行
唯一可惜的是Oracle只能将数据写为二进制格式因此可以考虑使用这种方法进行数据迁移或发布不过想利用这种方法来生成文本报表也是行不通的
最后提一下外部表是只读表可以利用外部表卸载数据不过必须在建表时完成一旦表建立成功外部表就变成不可修改了
SQL>INSERTINTOT_EXTERNALVALUES(A);
INSERTINTOT_EXTERNALVALUES(A)
*第 行出现错误:
ORA: 操作在外部组织表上不受支持
SQL> DROP TABLE T_EXTERNAL;
表已删除
SQL>CREATETABLET_EXTERNAL
(
IDNUMBER
NAMEVARCHAR()
)
ORGANIZATIONEXTERNAL
(
TYPEORACLE_DATAPUMP
DEFAULTDIRECTORYD_OUTPUT
LOCATION(TESTDMP)
);
表已创建
SQL>INSERTINTOT_EXTERNALVALUES(A);
INSERTINTOT_EXTERNALVALUES(A)
*第 行出现错误:
ORA: 操作在外部组织表上不受支持