oracle10G提供了一种方式可以使用外部表来抽取数据。
首先需要一个directory目录(这里继续使用前面创建的目录)
SQL> show user
USER 为 "SYS"
SQL> select * from dba_directories where DIRECTORY_NAME like '%SYS%';
OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------
SYS SYS_SQLLDR_XT_TMPDIR_00000 /u01/sqlldr
然后执行命令
SQL> show user
USER 为 "ING"
SQL> desc SYS_SQLLDR_X_EXT_DEPT
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
DEPTNO NUMBER(10)
DNAME VARCHAR2(20)
LOC VARCHAR2(20)
SQL> create table SYS_SQLLDR_X_EXT_DEPT_UNLOAD
2 organization external
3 (type oracle_datapump
4 default directory SYS_SQLLDR_XT_TMPDIR_00000
5 location('SYS_SQLLDR_X_EXT_DEPT_UNLOAD.dat')
6 ) as
7 select * from SYS_SQLLDR_X_EXT_DEPT;
表已创建。
在数据库中会创建一个SYS_SQLLDR_X_EXT_DEPT_UNLOAD表,在目录中会多出两个文件
[oracle@linux sqlldr]$ ll | grep SYS
-rw-r--r-- 1 oracle oinstall 148 10-04 22:43 SYS_SQLLDR_X_EXT_DEPT_UNLOAD_3501.log
-rw-r----- 1 oracle oinstall 12288 10-04 22:40 SYS_SQLLDR_X_EXT_DEPT_UNLOAD.dat
最后把SYS_SQLLDR_X_EXT_DEPT_UNLOAD.dat文件复制到其它数据库对应目录中,提取外部表创建脚本就可以拉
SQL> set long 20000
SQL> set pagesize 99
SQL> select dbms_metadata.get_ddl('TABLE','SYS_SQLLDR_X_EXT_DEPT_UNLOAD') from dual;
DBMS_METADATA.GET_DDL('TABLE','SYS_SQLLDR_X_EXT_DEPT_UNLOAD')
--------------------------------------------------------------------------------
CREATE TABLE "ING"."SYS_SQLLDR_X_EXT_DEPT_UNLOAD"
( "DEPTNO" NUMBER(10,0),
"DNAME" VARCHAR2(20),
"LOC" VARCHAR2(20)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY "SYS_SQLLDR_XT_TMPDIR_00000"
LOCATION
( 'SYS_SQLLDR_X_EXT_DEPT_UNLOAD.dat'
)
)
甚至可以从外包表中直接加载数据
SQL> insert /*+ append */ into dept select * from SYS_SQLLDR_X_EXT_DEPT_UNLOAD;
已创建4行。
SQL> commit;
提交完成。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
50 Sales Virginia
60 Accounting Virginia
70 Consulting Virginia
80 Finance Virginia