倒数第四篇:15.2外部表
倒数第三篇:15.3平面文件卸载
主页
倒数第一篇:15.5小结
第一篇:《Oracle 9i 10g编程艺术:深入数据库体系结构》
文章列表

15.4数据泵卸载

Oracle 9i 10g编程艺术:深入数据库体系结构

Oracle9i引入了外部表,作为向数据库中读取数据的一种方法。Oracle 10g则从另一个方向引入了 这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据。从Oracle 10g起,这个 数据从一种专用二进制格式抽取,这种格式称为数据泵格式(Data Pump format),Oracle提供的 EXPDP 和IMPDP工具将数据从一个数据库移动另一个数据库所用的就是这种格式。
使用外部表卸载确实相当容易,就像使用CREATE TABLE AS SELECT语句一样简单。首先,需要一个 DIRECTORY对象:
ops$tkyte@ORA10GR1> create or replace directory tmp as '/tmp'
2 /
Directory created.


现在,准备使用一个简单的SELECT语句向这个目录中卸载数据,例如:
ops$tkyte@ORA10GR1> 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
11 /

Table created.
我有意关闭了ALL_OBJECTS视图,因为这是一个相当复杂的视图,有大量的联结和谓词。这个例子显
示出,可以使用这个数据泵卸载技术从数据库中抽取任意的数据。我们可以使用谓词或所需的任何技术来 抽取一部分数据。
注意 这个例子显示出,我们可以使用这个数据泵卸载技术从数据库中抽取任意的数据。不错,我把 这句话又“啰唆“了一遍。从安全的角度看,这样一来,能访问这个信息的人可以很容易地从任 何地方”取得“这些信息。对于能够创建DIRECTORY对象并写至这些目录的人,你需要控制这些 人的访问,另外对物理服务器有必要的访问权限来得到卸载数据的人的访问也uyao有所控制。
最后一步是把allobjects.dat复制到另一个服务器(可能是一台执行测试的开发主机),并在这个服 务器上抽取DDL重建这个表:
ops$tkyte@ORA10GR1> select dbms_metadata.get_ddl( 'TABLE', 'ALL_OBJECTS_UNLOAD' )
2 from dual; DBMS_METADATA.GET_DDL('TABLE','ALL_OBJECTS_UNLOAD')
-------------------------------------------------------------------------------- CREATE TABLE "OPS$TKYTE"."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'
)
)
这样就能很容易地在另一个数据库上加载这个片段信息,因为只需:
SQL> insert /*+ append */ into some_table select * from all_objects_unload;

就万事大吉,数据则已经加载。