首页 > 代码库 > PLSQL_Oracle外部表的概念和使用(案例)(通过外部表直接查询数据文件以节数据库表空间)

PLSQL_Oracle外部表的概念和使用(案例)(通过外部表直接查询数据文件以节数据库表空间)

2014-08-25 BaoXinjian

一、摘要


ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件。

因此,建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。

外部表,顾名思义,存储在数据库外面的表。

当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。

不能对外部表建立索引。因为创建索引就意味着要存在对应的索引记录。而外部表其实在没有存储在数据库中。

故在外部是无法建立索引的,如果硬要建立的话,则系统会提示“操作在外部组织表上不受支持”的错误提示。

 

1. 外部表特征

  • 位于文件系统之中(一定要在数据库服务器中,而不是其它网络路径),按一定格式分割, 例如@#$等,文本文件或者其他类型的文件可以作为外部表。
  • 对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。
  • 外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。
  • ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。
  • 可以查询操作和连接。也可以并行操作。
  • 数据在数据库的外部组织,是操作系统文件。
  • 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。

2. 外部表限制

  • 只能对表进行SELECT,不能进行DELETE、UPDATE、INSERT这些DML操作。
  • 因为外部表需要在ORACLE数据库“服务端”创建目录,OS文件必须放在这些目录中。即这些文件只能放在数据库服务端。如果数据文件不位于服务器,则无法使用外部表。
  • 外部表上不能创建索引。但可以建立视图。
  • 外部表不支持LOB对象。如果要使用LOB类型,则不能使用外部表。

3. 外部表优势

如果要谈外部表的优势,一般会和SQLLDR来对比,外部表很多语法跟SQLLDR控制文件确实有很多类似的地方,下面谈谈自己的理解和"Oracel 9i&10g编程艺术"里面的一些对比

  • SQLLDR需要将数据装载入库后才能查询相关记录,如果只是为了查询一些记录,外部表确实比SQLLDR要有优势一些,很方便又不占用数据库存储空间。 尤其是很大的数据,以前做移动综合分析项目处理SGSN话单(几百G的数据,如果全部装载入库,非常浪费空间和时间)时就有这样的体会。外部表虚拟的导入 过程极快
  • 当平面文件改变时,外部表内的数据会跟着改变。这样避免了插入、更新、删除等操作,对于超大记录的外部表相当有优势,我只需要使用Shell命令就能搞定数据库需要很高代价才能完成的事情。
  • 外部表可以使用复杂的WHERE 条件有选择地加载数据。尽管SQLLDR 有一个WHEN 子句用来选择要加载的行,但是你只能使用AND 表达式和执行相等性比较的表达式,在WHEN 子句中不能使用区间(大于、小于),没有OR 表达式,也没有IS NULL 等。
  • 能够合并(MERGE)数据。可以取一个填满数据的操作系统文件,并由它更新现有的数据库记录。
  • 能执行高效的代码查找。可以将一个外部表联结到另一个数据库表作为加载过程的一部分。
  • 使用INSERT 更容易地执行多表插入。从Oracle9i 开始,通过使用复杂的WHEN 条件,可以用一个INSERT 语句插入一个或多个表。尽管SQLLDR 也可以加载到多个表中,但是相应的语法相当复杂。

 

二、案例 - 创建外部表,并进行增删改查操作


案例:创建外部表,并导入测试数据,进行测试

1. 创建目录

CREATE DIRECTORY extertable as /home/oracle/extertable;

 

 

2. 创建测试的数据文件,并测试

 

3. 创建外部表

CREATE TABLE exter_test_table(   ID      NUMBER  (5),   NAME    VARCHAR (12),   SEX     VARCHAR (8),   AGE     NUMBER  (3),   GRADE   NUMBER  (5))ORGANIZATION EXTERNAL   (      TYPE oracle_loader      DEFAULT DIRECTORY extertable      ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY , )      LOCATION (student.data )   );ALTER TABLE exter_test_table REJECT LIMIT UNLIMITED;

 

 

4. 创建表后,可直接查询出在数据文件中的资料

 

 

5. 外部表只能进行select,无法进行delete / update, 如需进行DML操作只能在数据文件本身中

 

6. 进行操作时,会在数据文件目录中产生log文件,记录数据导入和导出的情况

 

7. 查询数据库中外部表的情况 dba_external_locations / dba_external_tables

 

 

三、案例 - 删除外部表


删除外部表SQL语法跟普通表一样,但是不同之处在于有可能还要删除与之对应的目录对象。

当外部表不用时,需要及时删除外部表或者与之对应的目录对象。

不过在删除这些内容时会有一些限制。这些限制主要是管理上的限制,而不是技术上的限制。

也就是说,Oracle数据库系统没有对其进行强制的限制。

但是如果 数据库管理员不遵守这些限制的话,可能会出现一些问题。

如要先删除外部表,然后再删除目录对象。有时候一个目录对象中可能会包含多个外部表。

此时必须要确 认所有的外部表都不用了,都已经删除干净了,然后才能够删除目录对象。

在创建外部表时,操作系统会判断一下,与之对应的目录对象是否已经创建。

但是在删除 对象时,系统不会去判断跟这个目录对象关联的外部表是否已经全部删除。

如果目录对象删除了,但是还有外部表存在。

此时查询这个外部表的时候,系统就会提示 “对象不存在”的错误信息。所以这个删除目录对象时,数据库系统缺乏一种检查,此 时只有数据库管理员在删除目录对象时,先手工确认一下这个目录对象是否存在其他的外部表

 

 ********************作者: 鲍新建********************

 

参考:潇湘隐者大神 http://www.cnblogs.com/kerrycode/p/3894260.html

PLSQL_Oracle外部表的概念和使用(案例)(通过外部表直接查询数据文件以节数据库表空间)