Oracle9i引入了外部表,作为向数据库中读取数据的一种方法。Oracle 10g则从另一个方向引入了这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据。从Oracle 10g起,这个数据从一种专用二进制格式抽取,这种格式称为数据泵格式(Data Pump format),Oracle提供的EXPDP和IMPDP工具将数据从一个数据库移动另一个数据库所用的就是这种格式。
使用外部表卸载确实相当容易,就像使用CREATE TABLE AS SELECT语句一样简单。首先,需要一个DIRECTORY对象:
create or replace directory tmp as '/tmp'
现在,准备使用一个简单的SELECT语句向这个目录中卸载数据,例如:
scott@ORCL> create table all_objects_unload
2 organization external
3 ( type oracle_datapump
4 default directory TMP
5 location( 'allobjects.dat' )
6 )
7 as
8 select
9 *
10 from all_objects;
表已创建。
这个例子显示出,可以使用这个数据泵卸载技术从数据库中抽取任意的数据。我们可以使用谓词或所需的任何技术来抽取一部分数据。
最后一步是把allobjects.dat复制到另一个服务器(可能是一台执行测试的开发主机),并在这个服务器上抽取DDL重建这个表:
scott@ORCL> select dbms_metadata.get_ddl( 'TABLE', 'ALL_OBJECTS_UNLOAD' )
2 from dual;
DBMS_METADATA.GET_DDL('TABLE','ALL_OBJECTS_UNLOAD')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."ALL_OBJECTS_UNLOAD"
( "OWNER" VARCHAR2(30),
"OBJECT_NAME" VARCHAR2(30),
"SUBOBJECT_NAME" VARCHAR2(30),
"OBJECT_ID" NUMBER,
"DATA_OBJECT_ID" NUMBER,
"OBJECT_TYPE" VARCHAR2(19),
"CREATED" DATE,
"LAST_DDL_TIME" DATE,
"TIMESTAMP" VARCHAR2(19),
"STATUS" VARCHAR2(7),
"TEMPORARY" VARCHAR2(1),
"GENERATED" VARCHAR2(1),
"SECONDARY" VARCHAR2(1)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY "TMP"
LOCATION
( 'allobjects.dat'
)
)
根据DDL创建这个外部表
ALL_OBJECTS_UNLOAD
这样就能很容易地在另一个数据库上加载这个片段信息,因为只需:
SQL> insert /*+ append */ into some_table select * from all_objects_unload;
就万事大吉,数据则已经加载。