外部表的使用

常用的表形式包括:普通表、分区表、嵌套表、临时表、簇表、外部表等。

不同于其他表形式,外部表是存储在操作系统的文件中的,而不是在数据库中。

下面实验一下外部表的使用方法:


一、外部表创建

1.创建directory:

SQL> conn scott/tiger@admin
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott

SQL> show user;
User is "scott"

SQL> CREATE DIRECTORY admin AS 'e:\oracle';

Directory created


2、创建外部表:
SQL>  CREATE  TABLE empext
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY admin
      LOCATION ('empext.dmp')
    )
    AS SELECT * FROM emp;

执行后在e:\oracle目录下产生文件EMP_EXT.DMP和EMP_EXT_1660_5544.log

3、查看表内容:
SQL> select * from emp_ext;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2964.50               10
 7839 KING       PRESIDENT       1981-11-17    6050.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
 7900 JAMES      CLERK      7698 1981-12-3      950.00               30
 7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
 7934 MILLER     CLERK      7782 1982-1-23     1573.00               10

12 rows selected

执行时,在e:\oracle目录下又产生了文件EMP_EXT_1660_2204.log

日志文件的内容为“ LOG file opened at 09/26/12 13:39:52”

可以推测,每次在数据库中查询外部表时,默认都会在其存储的directory下产生一个日志文件,记录。

4.删除外部表:
SQL> drop table emp_ext;

Table dropped

SQL> select * from emp_ext;

select * from emp_ext

ORA-00942: 表或视图不存在

在e:\oracle下的emp文件仍然存在。

//但我们在数据库打开状态下删除物理文件是可以的!当再次浏览此表时会报错:

SQL> select * from empext t;

select * from empext t

ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误KUP-11010: unable to open at least one dump file for load
ORA-06512: 在 "SYS.ORACLE_DATAPUMP", line 19

5.更改外部表:
SQL> update empext set comm='1000' where empno=7369;

update empext set comm='1000' where empno=7369

ORA-30657: 操作在外部组织表上不受支持

//证明外部表是不支持更新操作的,数据库中只能读取、导入和导出。

二、使用已产生的pump文件创建外部表

由于环境所限,我们实现在同一台机器上的不同数据库实例间进行外部表的导出和导入

1、把产生的dmp文件复制到其它目录下

C:\Documents and Settings\Administrator>expdp scott/tiger@admin directory='exp_d
ir' dumpfile=EMPEXT.DMP tables=empext

Export: Release 10.2.0.1.0 - Production on 星期三, 26 9月, 2012 14:22:58

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
启动 "SCOTT"."SYS_EXPORT_TABLE_01":  scott/********@admin directory='exp_dir' du
mpfile=EMPEXT.DMP tables=empext
正在使用 BLOCKS 方法进行估计...
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的总估计: 0 KB
处理对象类型 TABLE_EXPORT/TABLE/TABLE
已成功加载/卸载了主表 "SCOTT"."SYS_EXPORT_TABLE_01"
******************************************************************************
SCOTT.SYS_EXPORT_TABLE_01 的转储文件集为:
  E:\EMPEXT.DMP
作业 "SCOTT"."SYS_EXPORT_TABLE_01" 已于 14:23:56 成功完成

可以看到,这个操作是相对耗时的,十几条数据,用了一分钟才完成。
导出时,在e:\下产生了日志文件和复制出来的dmp文件。

2、在数据库实例admin1中创建directory:

SQL> create directory temp_dir as 'e:\';

Directory created

3、创建外部表:
SQL>  CREATE TABLE empext2
    (
  EMPNO NUMBER(4),
 ENAME VARCHAR2(10),
 JOB VARCHAR2(9),
 MGR NUMBER(4),
 HIREDATE DATE,
 SAL NUMBER(7,2),
 COMM NUMBER(7,2),
 DEPTNO NUMBER(2) 
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY temp_dir
     LOCATION ('EMPEXT.DMP')
   );

Table created

SQL> select * from empext2;

select * from empext2

ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-31619: 转储文件 "e:\EMPEXT.DMP" 无效
ORA-06512: 在 "SYS.ORACLE_DATAPUMP", line 19

//我们看到,虽然表创建成功,并已经找到了外部表的位置,但读取数据出错了。

SQL> drop table empext2;

Table dropped

//将转储文件删除,直接将e:\oracle下的文件EMPEXT.DMP复制到e:\,再次创建表:

SQL>  CREATE TABLE empext2
    (
  EMPNO NUMBER(4),
 ENAME VARCHAR2(10),
 JOB VARCHAR2(9),
 MGR NUMBER(4),
 HIREDATE DATE,
 SAL NUMBER(7,2),
 COMM NUMBER(7,2),
 DEPTNO NUMBER(2) 
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY admin1
     LOCATION ('EMPEXT.DMP')
   );

Table created

SQL> select * from empext2;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2964.50               10
 7839 KING       PRESIDENT       1981-11-17    6050.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
 7900 JAMES      CLERK      7698 1981-12-3      950.00               30
 7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
 7934 MILLER     CLERK      7782 1982-1-23     1573.00               10

12 rows selected


//也可以将路径直接指向e:\oracle,也可以正常查到数据。


三、如果基表发生改变,如何更新数据源:
1、先删除原数据库的外部表以及创建外部表产生的dmp文件。
2、重新创建外部表。
3、把新产生的dmp文件复制到远程主机上即可。

四、创建多个外部文件(dmp)组成的表(Create an external table with three dump files and with a degree of parallelism of three.)

创建三个dump文件的外部表,并行度3的意思是把emp的数据导出到3个文件,以后如果1个文件丢失,则查询的时候会丢失这个文件里面记录的数据:
SQL> CREATE TABLE emp_xt3
    ORGANIZATION EXTERNAL
    (                   
      TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY admin
      LOCATION ('emp_xt1.dmp', 'emp_xt2.dmp', 'emp_xt3.dmp')
    )                   
    PARALLEL 3          
    AS SELECT * FROM emp;

这时,将emp_xt1.dmp、emp_xt3.dmp移除后无影响,emp_xt2.dmp移除后会查询不到数据。这部分有待进一步研究,但至少不会报错。
用更多数据的表进行实验,看到:几个文件的大小不等,且内容没有冗余。


五、外部表可以通过数据文件进行合并

1、创建包含有部分数据的外部表
SQL> CREATE TABLE emp_part_xt
    ORGANIZATION EXTERNAL
    (
    TYPE ORACLE_DATAPUMP
    DEFAULT DIRECTORY admin
    LOCATION ('emp_p1_xt.dmp')
    )
    AS SELECT * FROM emp WHERE empno < 7654;
   
SQL> drop table emp_part_xt;
 
Table dropped.
 
SQL> CREATE TABLE emp_part_xt
    ORGANIZATION EXTERNAL
    (
    TYPE ORACLE_DATAPUMP
    DEFAULT DIRECTORY admin
    LOCATION ('emp_p2_xt.dmp')
    )
    AS SELECT * FROM emp WHERE empno >= 7654;
 
SQL> CREATE TABLE emp_part_all_xt
    (
  EMPNO NUMBER(4),
 ENAME VARCHAR2(10),
 JOB VARCHAR2(9),
 MGR NUMBER(4),
 HIREDATE DATE,
 SAL NUMBER(7,2),
 COMM NUMBER(7,2),
 DEPTNO NUMBER(2)
    )
    ORGANIZATION EXTERNAL
    (
   TYPE ORACLE_DATAPUMP
   DEFAULT DIRECTORY admin
   LOCATION ('emp_p1_xt.dmp','emp_p2_xt.dmp')
   );

//以上操作实际是将两个外部表文件'emp_p1_xt.dmp','emp_p2_xt.dmp'定义为表emp_part_all_xt的数据源。

六、外部表的存储
SQL> select * from dba_objects where object_name='EMPEXT';

OWNER                          OBJECT_NAME                                                                      SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED     LAST_DDL_TIME TIMESTAMP           STATUS  TEMPORARY GENERATED SECONDARY
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------- ----------- ------------- ------------------- ------- --------- --------- ---------
SCOTT                          EMPEXT                                                                                                               52745                TABLE               2012-9-26 1 2012-9-26 14: 2012-09-26:14:47:15 VALID   N         N         N

SQL> select * from dba_segments where segment_name='EMPEXT';

OWNER                          SEGMENT_NAME                                                                     PARTITION_NAME                 SEGMENT_TYPE       TABLESPACE_NAME                HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ----------- ------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------------ -----------

//通过上述查询看到,虽然外部表的定义信息是在数据库中的,但其数据并没有存储在数据库中。


七、外部表创建再述
上面的创建语句格式为:
 CREATE  TABLE table_name
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY directory_name
      LOCATION ('file_name')
    )
    AS SELECT statement;
另外看到的一种格式:
  create table table_name(column_name datatype ……)
  organization external (
  type oracle_loader
  default directory directory_name
  access parameters (
  records delimited by newline
  nobadfile
  nodiscardfile
  nologfile
  )
  location('file_name')
  )
  reject limit unlimited

格式3:
create table data_ext(
USER_ID VARCHAR2(20) ,
USER_NAME VARCHAR2(20),
regdate date)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY extenttable
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(user_id,user_name,
regdate date "YYYY-MM-DD HH24:MI:SS"
)
)
LOCATION('data.txt')
)

//后两种是通过sqlldr从外部文件中导入。猜想,大概sqlldr的实际语句类似这个吧。

综上,外部表可以通过数据库表或sqlldr导入文件创建;可以推出外部表的一些用途:转储数据、实现安全性和一致性;外部表的局限性在于不能进行dml操作或创建索引,但从安全角度也算是优点了。
个人认为,外部表也可以作为数据备份、迁移的一种手段(dmp格式的文件存储更加安全),避免了在使用过程中对数据的误操作,但在各个版本间的通用性上无法保证。

 

参考:http://wenku.baidu.com/view/ae70e3ea4afe04a1b071de47.html
http://www.cnblogs.com/lanzi/archive/2010/12/28/1918755.html

等等

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-745166/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-745166/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值