日期:2014-05-16  浏览次数:20552 次

Oraclei外部表(External Table)的使用

什么是外部表?

????? 有时候,数据库海量数据的存储,是一个令人头疼的问题。别的不说,光是频繁的执行insert(1000次/秒)都是一场恶梦。但是,如果将数据保存到文家里,而不是数据库中,数据序列化的开销就小得多了。但是,对于文件的各种复杂检索,又是一件相当麻烦的事。
??? 幸好,Oracle有这样一种特性,它可以将某些特定格式的文件映射到数据库中,形成一个“表”,称为“外部表”。单用户更改文件内容时,外部表中的数据即随之改变。同时,用户又可以像检索普通表一样,以只读的方式对外部表进行检索。

 

1.外部表适用于通过海量文本数据文件导入数据库情况。支持SQL语法,可以封装到应用程序代码中进行灵活的定义和调度。也适用于数据迁移,表数据重建。

2.多线程机制,性能优异,对于大数据情况,导入性能比HPL性能高23

?


  External table和正规的表非常相似,具体的定义能参见《Oracle概念手册》,以下的几点需要注意: 
   
    >创建的语法类似于: "CREATE TABLE ... ORGANIZATION EXTERNAL" 
    >数据在数据库的外部组织,是操作系统文件。 
    >操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。    
    >数据是只读的。(外部表相当于一个只读的虚表) 
    >不能在上面运行所有DML操作,不能创建索引。  
    >能查询操作和连接。能并行操作。 
   
  例子:
   
  假定有如下的两个数据文件:
   
  1 平面文件数据的描述
    假设如下的两个平面文件
    1.dat:
  
   Code: [Copy to clipboard] 
  
    7369,SMITH,CLERK,7902,17-DEC-80,100,0,20                     
    7499,ALLEN,SALESMAN,7698,20-FEB-81,250,0,30                   
    7521,WARD,SALESMAN,7698,22-FEB-81,450,0,30                    
    7566,JONES,MANAGER,7839,02-APR-81,1150,0,20  

bitscn.com
  
  2.dat:
  
  
   Code: [Copy to clipboard] 
                  
    7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,0,30                   
    7698,BLAKE,MANAGER,7839,01-MAY-81,1550,0,30                    
    7934,MILLER,CLERK,7782,23-JAN-82,3500,0,10           
  
  (要有对操作系统中该目录的读写权限。) 
     
  2 创建一个逻辑目录并进行适当授权:
  
   Code: [Copy to clipboard] 
  
     SQL> CREATE DIRECTORY TESTDIR AS ’D:\TEMP\’;
     目录已创建。
   
     SQL> GRANT READ ON DIRECTORY TESTDIR TO DEMO;
     授权成功。
   
     SQL> GRANT WRITE ON DIRECTORY TESTDIR TO DEMO;
     授权成功。
  
  注意:创建完毕逻辑目录之后要把平面文件拷贝到该目录下,另外还要注意文件名字不要写错。 bitsCN.nET中国网管博客
   
  3 创建外部表
  
   Code: [Copy to clipboard] 
  
  SQL> ED
  已写入文件 afiedt.buf
   
    1 CREATE TABLE DEMO.EXT
    2 (emp_id number(4),
    3  ename varchar2(12),
    4  job varchar2(12) ,
    5  mgr_id number(4) ,
    6  hiredate date,
    7  salary number(8),
    8  comm number(8),
    9  dept_id number(2))
   10 [color=blue] ORGANIZATION EXTERNAL[/color]
   11 ([color=blue]TYPE ORACLE_LOADER[/color]
   12 DEFAULT DIRECTORY TESTDIR
   13 ACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINE
   14 FIELDS TERMINATED BY ’,’)
   15* LOCATION(’1.DAT’,’2.DAT’))
  SQL> /
   
  表已创建。
  
  4  进行Select选择操作看看是否正确:
  
   Code: [Copy to clipboard] 
  
      SQL> select * from DEMO.EXT;
bbs.bitsCN.com
   
      EMP_ID ENAME  JOB     MGR_ID HIREDATE  SALARY    COMM