外部表介绍

ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件。因此,建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。外部表,顾名思义,存储在数据库外面的表。当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。不能对外部表建立索引。因为创建索引就意味着要存在对应的索引记录。而外部表其实在没有存储在数据库中。故在外部是无法建立索引的。如果硬要建立的话,则系统会提示“操作在外部组织表上不受支持”的错误提示。

Notice: 外部表是ORACLE 9i后引入的。

外部表特征

(1) 位于文件系统之中(一定要在数据库服务器中,而不是其它网络路径),按一定格式分割,

例如@#$等,文本文件或者其他类型的文件可以作为外部表。

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

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

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

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

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

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

外部表范例:

1:创建目录对象并授权

从9i开始,ORACLE数据库若需要存取文件系统,就必须使用目录对象,以相对路径方式存取文件,强化数据库的安全性。建立目录对象、授予权限。

SQL>CREATE OR REPLACE DIRECTORY DUMP_DIR AS '/oradata/exterltab';

给用户授予指定目录的操作权限

SQL>GRANT READ,WRITE ON DIRECTORY DUMP_DIR TO ETL;

2:创建外部表

我创建了一个平面文件作为测试用例,如下所示,总共5条记录,其中一条错误记录

[oracle@DB-Server exterltab]$ more student.data

10001@#$kerry@#$male@#$28@#$1

10002@#$jimmy@#$male@#$22@#$1

10003@#$ken@#$male@#$21@#$1

10004@#$merry@#$femal@#$20@#$1

this is a bad file

CREATE TABLE EXTER_TEST

(

     ID              NUMBER(5)      ,

     NAME            VARCHAR(12)    ,

     SEX             VARCHAR(8)     ,

     AGE             NUMBER(3)      ,

     GRADE           NUMBER(1)

) ORGANIZATION EXTERNAL

(

            type        oracle_loader

            default directory dump_dir

            access parameters

            (

                    records delimited by newline

                    fields terminated by '@#$'

            )

            location ('student.data')

);

外部表语法也是蛮复杂的,参数选项非常多,这里不做过多解释。有兴趣自然可以翻阅官方文档。

SQL> select * from exter_test;

select * from exter_test

*

ERROR at line 1:

ORA-29913: error in executing ODCIEXTTABLEFETCH callout

ORA-30653: reject limit reached

ORA-06512: at "SYS.ORACLE_LOADER", line 52

出现下面错误,是因为student.data文件中有不符合规范的记录,可以删除“this is a bad file”这一条记录,但是这是为了测试下面情况,所以可以通过执行 alter table exter_test reject limit unlimited;跳过一些限制。

SQL> alter table exter_test reject limit unlimited;

 

Table altered.

 

SQL> select * from exter_test;

 

        ID NAME         SEX             AGE      GRADE

---------- ------------ -------- ---------- ----------

     10001 kerry        male             28          1

     10002 jimmy        male             22          1

     10003 ken          male             21          1

     10004 merry        femal            20          1

 

SQL> 

此时去查看/oradata/exterltab,你会发现自动生成了EXTER_TEST_8907.bad 和 EXTER_TEST_8907.log两个文件,其中log记录访问外部表的记录信息,bad文件记录错误记录的信息。大体如下所示

[oracle@DB-Server exterltab]$ ls

EXTER_TEST_8907.bad EXTER_TEST_8907.log student.data

[oracle@DB-Server exterltab]$

3:查看外部表的目录

xxx_external_locations 可以知道当前所有的目录对象以及相关的外部表,还会查询出这些外部表所对应的操作系统文件的名字。

select * from all_external_locations;

select * from user_external_locations;

select * from dba_external_locations;

 

SQL> show user

USER is "SYS"

SQL> col owner for a20

SQL> col table_name for a30

SQL> col location for a30

SQL> col directory_owner for a3;

SQL> col directory_name for a30;

 

 

SQL> select * from dba_external_locations;

 

 

OWNER          TABLE_NAME               LOCATION           DIR DIRECTORY_NAME

--------- -------------------------- --------------- ---------------------------

SH           SALES_TRANSACTIONS_EXT    sale1v3.dat       SYS DATA_FILE_DIR

ETL          EXTER_TEST                student.data      SYS DUMP_DIR

4:查看外部表的详细信息

select * from user_external_tables;

select * from all_external_tables;

select * from dba_external_tables;

 

SQL> desc dba_external_tables;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 OWNER                                     NOT NULL VARCHAR2(30)

 TABLE_NAME                                NOT NULL VARCHAR2(30)

 TYPE_OWNER                                         CHAR(3)

 TYPE_NAME                                 NOT NULL VARCHAR2(30)

 DEFAULT_DIRECTORY_OWNER                            CHAR(3)

 DEFAULT_DIRECTORY_NAME                    NOT NULL VARCHAR2(30)

 REJECT_LIMIT                                       VARCHAR2(40)

 ACCESS_TYPE                                        VARCHAR2(7)

 ACCESS_PARAMETERS                                  VARCHAR2(4000)

 PROPERTY                                           VARCHAR2(10)

5:删除外部表

删除外部表SQL语法跟普通表一样,但是不同之处在于有可能还要删除与之对应的目录对象。当外部表不用时,需要及时删除外部表或者与之对应的目录对象。不过在删除这些内容时会有一些限制。这些限制主要是管理上的限制,而不是技术上的限制。也就是说,Oracle数据库系统没有对其进行强制的限制。但是如果数据库管理员不遵守这些限制的话,可能会出现一些问题。如要先删除外部表,然后再删除目录对象。有时候一个目录对象中可能会包含多个外部表。此时必须要确认所有的外部表都不用了,都已经删除干净了,然后才能够删除目录对象。在创建外部表时,操作系统会判断一下,与之对应的目录对象是否已经创建。但是在删除对象时,系统不会去判断跟这个目录对象关联的外部表是否已经全部删除。如果目录对象删除了,但是还有外部表存在。此时查询这个外部表的时候,系统就会提示“对象不存在”的错误信息。所以这个删除目录对象时,数据库系统缺乏一种检查,此 时只有数据库管理员在删除目录对象时,先手工确认一下这个目录对象是否存在其他的外部表。

外部表限制:

1. 只能对表进行SELECT,不能进行DELETE、UPDATE、INSERT这些DML操作。

2. 因为外部表需要在ORACLE数据库“服务端”创建目录,OS文件必须放在这些目录中。即这些文件只能放在数据库服务端。如果数据文件不位于服务器,则无法使用外部表

3. 外部表上不能创建索引。但可以建立视图

4. 外部表不支持LOB对象。如果要使用LOB类型,则不能使用外部表。

eg:删除外部表的记录

SQL> delete from exter_test where id=10001;

delete from exter_test where id=10001

            *

ERROR at line 1:

ORA-30657: operation not supported on external organized table

eg: 在外部表上创建视图

SQL> create or replace view vv

  2  as 

  3  select * from etl.exter_test;

 

View created.

 

SQL> select * from vv;

 

        ID NAME         SEX             AGE      GRADE

---------- ------------ -------- ---------- ----------

     10001 kerry        male             28          1

     10002 jimmy        male             22          1

     10003 ken          male             21          1

     10004 merry        femal            20          1

 

SQL> 

外部表优势:

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

1. SQLLDR需要将数据装载入库后才能查询相关记录,如果只是为了查询一些记录,外部表确实比SQLLDR要有优势一些,很方便又不占用数据库存储空间。尤其是很大的数据,以前做移动综合分析项目处理SGSN话单(几百G的数据,如果全部装载入库,非常浪费空间和时间)时就有这样的体会。外部表虚拟的导入过程极快

2:当平面文件改变时,外部表内的数据会跟着改变。这样避免了插入、更新、删除等操作,对于超大记录的外部表相当有优势,我只需要使用Shell命令就能搞定数据库需要很高代价才能完成的事情。

3:外部表可以使用复杂的WHERE 条件有选择地加载数据。尽管SQLLDR 有一个WHEN 子句用来选择要加载的行,但是你只能使用AND 表达式和执行相等性比较的表达式,在WHEN 子句中不能使用区间(大于、小于),没有OR 表达式,也没有IS NULL 等。

4:能够合并(MERGE)数据。可以取一个填满数据的操作系统文件,并由它更新现有的数据库记录。

5:能执行高效的代码查找。可以将一个外部表联结到另一个数据库表作为加载过程的一部分。

6:使用INSERT 更容易地执行多表插入。从Oracle9i 开始,通过使用复杂的WHEN 条件,可以用一个INSERT 语句插入一个或多个表。尽管SQLLDR 也可以加载到多个表中,但是相应的语法相当复杂。

参考资料:

http://blog.itpub.net/22578826/viewspace-703470

http://www.cnblogs.com/lanzi/archive/2010/12/28/1918755.html

http://blog.csdn.net/leshami/article/details/6078481

ORACLE外部表总结的更多相关文章

  1. 如何利用Oracle外部表导入文本文件的数据

    同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...

  2. Oracle外部表的使用

    外部表可以像其它表一样,用select语句作查询.但不能做DML操作,不能建index,不接受约束.这是因为它不是以段的形式存于数据库中,只是以数据字典构造存在,指向一个或多个操作系统文件. 外部表的 ...

  3. Oracle外部表详解(转载)

    (外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中 ...

  4. oracle外部表

    关于外部表的描述 正确描述 the create table as select statement can be used to upload data into a normal table in ...

  5. Oracle外部表详解

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

  6. 使用oracle外部表进行数据泵卸载数据

    数据泵卸载Oracle9i引入了外部表,作为向数据库中读取数据的一种方法.Oracle 10g则从另一个方向引入了这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据.从O ...

  7. Oracle外部表与SQLLDR

    两种方法建立外部表 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR: 从12C起,可以使用模式来运行SQLLDR: 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR: ...

  8. sql*loader以及oracle外部表加载Date类型列

    Oracle sqlldr LOAD DATAINFILE *INTO TABLE testFIELDS TERMINATED BY X'9'TRAILING NULLCOLS(    c2 &quo ...

  9. Oracle外部表的管理和应用

    外部表作为oracle的一种表类型,虽然不能像普通库表那么应用方便,但有时在数据迁移或数据加载时,也会带来极大的方便,有时比用sql*loader加载数据来的更为方便,下面就将建立和应用外部表的命令和 ...

随机推荐

  1. 修正IE6不支持position:fixed的bug(转)

    众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...

  2. RAC 10.2.0.5,客户端登陆间断遭遇ORA-12545

    实验环境: 服务端:OEL 5.7 + Oracle 10.2.0.5 RAC  客户端:Windows 7 + Oracle 11.2.0.1 Client   1.客户端登陆间断遭遇ORA-125 ...

  3. Oracle RAC客户端tnsnames.ora相关配置及测试

    1.Oracle RAC服务端/etc/hosts部分内容如下 2.查看服务端的local_listener和remote_listener参数 3.客户端tnsnames.ora配置参考 3.1 1 ...

  4. struts2学习笔记--ActionContext对象

    什么是ActionContext? ActionContext是Map结构的容器,ActionContext是Action的上下文,类比ServletContext,存放着Action执行过程中的数据 ...

  5. 为 Web 设计师准备的 20 款 CSS3 工具

    1.CSS3 Generator 2. Border Radius 3. CSS3 Maker 4. CSS3 Transforms 5. CSS3 Drop shadow generator 6. ...

  6. 一个简单的inno setup模板

    一.模板代码 基本功能包括多路径安装.多语言.自定义图标. [Setup] ShowLanguageDialog=yes AppCopyright=Copyright Reserved(C) , 36 ...

  7. MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章

    这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你 ...

  8. 迷惑很久,仅以个人想法谈谈MVC架构,希望大家多给点意见

    博主是非科班出身,所以和大部分新手有着一样的困惑,究竟什么才能算是MVC框架,总是在谈Model,View,Controller分离,可是究竟什么才能算是分离,而他们又是负责什么样的分工呢. 大二的时 ...

  9. 流行ORM产品优缺点分析--EntityFramework、NHibernate、PetaPoco

    什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...

  10. 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...