Oracle外部表介绍.

1.介绍

外部表只能在Oracle 9i之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储在一个普通数据库表中一样来进行访问。外部表是对数据库表的延伸。

2.特性

(1) 位于文件系统之中,按一定格式分割,如文本文件或者其他类型的表可以作为外部表。

(2) 对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。

(3) 外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。

(4) ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。

(5) 可以查询操作和连接。可以并行操作。

(6) 数据在数据库的外部组织,是操作系统文件。

(7) 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。

3.oracle外部表类型

Oracle 提供两种访问驱动 :ORACLE_LOADER 和ORACLE_DATAPUMP(oracle 10.2 后新增的驱动 )
ORACLE_LOADER : 它利用 oracle loader 技术从外部表读取数据 . 它还具有类似 SQL*Loader 工具控制文件语法的数据映射能力 .
ORACLE_DATAPUMP :它提供卸载数据的能力 , 即把数据从数据库里导入一个外部表 , 再由一个或几个外部表导入到数据库里 . 
对于 ASsubquery 的子句必须使用 ORACLE_DATAPUMP . 创建用于卸载数据的外部表时,不能制定列名。
同时,不支持 badfile 、 discardfile 参数,
因为其无效或者丢弃数据将不予以记录为操作系统文件 ,
没有 fields erminated by

( 或者 missing field values are null) 参数ORACLE_DATAPUMP 一般使用在进行日志表等大数据表的备份和数据转移上 .

  唯一不足的是 Oracle 只能将数据写成二进制格式 , 所以用外部表来生成 Excel 报表之类的是行不通的 . 不过在 web 应用中用外部表加载 Excel 数据却是可以的而且很 大程度上提高应用的性能 , 后面会进行相关举例 . 。。。。

4.举例

(备份表数据到平面文件):      CREATE TABLE external_dkey_test (
         
 my_id,
           user_id,
           object_
type,
           
my_sequence
       )
       ORGANIZATION EXTERNAL
       (
         TYPE ORACLE_DATAPUMP
         DEFAULT DIRECTORY
  dkey_dir
         LOCATION('external_dkey_test .
dmp')
       )
       AS SELECT my_id,user_id,object_type,my_sequenceFROM
dkey_objects;
      查看平面文件可以用strings
      $strings external_dkey_test .dmp 


如果此时另一个库需要此份数据,则可以再通过外部表进行加载处理步骤:


      1.在数据库服务器上建个文件夹存放平面文件,假如路径如下:
         /data/
      2.创建一个外部表加载路径
         create or replace directory temp_dir as '/data/';
      3.进行加载数据生成外部表
          create table external_dkey_test (
             
my_id number(11),
              user_id number(11),
              object_
type number(30),
             
my_sequence varchar2(30)
          )
          organization external (
              type oracle_loader
              default directory
dkey_dir
              access parameters (fields terminated by ',' )
              location ('external_dkey_test .
dmp')
          );
       4.从外部表提取数据到正式表
         
使用: insert into
          insert into external_dkey_test _log as select *  from external_dkey_test ;
       

可以使用外部表加载Excel表格到数据中,而且性能效率很高,比web应用中使用poi上传处理上传的Excel数据要快很多.
特别是大批量数据上传时.

加载Excel数据步骤 :
        1.将Excel转换成csv的逗号相隔的文件格式
        2.同上面对加载语句只要将external_dx_sms_bak0127.DMP改成'external_dx_sms_bak0127.csv
做测试时加载成功后进行查询时出现ORA-29913 ORA-06512错误,经查询发现是由于在创建时定义的列的宽度太小或者文件路径
不正确导致. 

另外:

--使用datapump创建外部表,且数据来源于外部文件dmp
SQL> CREATE TABLE scott.countries_ext
  2 (COUNTRY_ID NUMBER,
  3 COUNTRY_NAME VARCHAR2(30),
  4 COUNTRY_REIGION VARCHAR2(30)
  5 )
  6 ORGANIZATION EXTERNAL
  7 (
  8 TYPE ORACLE_DATAPUMP
  9 DEFAULT DIRECTORY dir
 10 LOCATION ('countries_ext.dmp')
 11 );
Table created.
SQL> select * from scott.countries_ext;
COUNTRY_ID COUNTRY_NAME COUNTRY_REIGION
---------- ------------------------------ ------------------------------
         1 AMERICA america
         2 china zhuzhou
         3 JAPAN dongjing
由此可见,利用外部文件,使用datapump方式创建外部表可行。



你可能感兴趣的:(oracle)