让我们先来了解下外部表的定义:
所谓外部表,就是用于区分Oracle的普通表的一种格式。普通的表都是建立在数据库的内部,数据存储也是在Oracle的自身数据文件中,
而外部表,则是类似一个指针,直接指向外部物理文件,比如平面文件data.txt,可以直接映射成一个外部表data_ext。
外部平面文件本身只是数据存储,并不能对字段等信息进行自描述,所以还需要在引用的时候,强行指定文本文件的格式,这样就能像真正的表一样操作了.
在创建外部表之前,还要先声明一点:Oracle是一个独立的数据库系统,它的所有操作全是在它自己的进程中完成,因此如果需要引用外部操作系统的文件,必须通知它,再加上一些权限上的考虑,还需要做一些特别的配置才可以实现上述的功能,主要的动作包括以下几步:
一、 增加Oracle对文件指定目录的权限
Oracle数据库能访问哪些操作系统的目录,必须提前指定好,否则是没有权限的,这个指定需要修改Oracle的一个初始参数,比如我把平面文件放在了
/home/oracle/extenttable的目录下,就要这样修改:
SQL>alter system set utl_file_dir='/home/oracle/extenttable' scope=spfile;
SQL> select NAME,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where NAME='utl_file_dir';
NAME ISSES_MODIFIABL ISSYS_MODIFIABLE
-------------------- --------------- ---------------------------
utl_file_dir FALSE FALSE
从上面可以看出,必须重启数据库才能生效。
二、创建一个oracle内部目录
重起数据库后,就可以在Oracle内建一个目录的引用,这个引用将直接指向外部的目录,如:
create directory extenttable as '/home/oracle/extenttable';
为什么要这样做呢,其实也就是申明一下,因为在程序中不能直接引用操作系统的路径名,这样做了以后,直接引用extenttable就可以了。 经过以上两步的准备工作,正式的建表工作就要开始了
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')
)
下面我来对上面的SQL中的几个主要部分做个说明:
Create table:
这部分代码与标准的表一样,并且在里面指定字段名等内容,没有特别的地方
ORGANIZATION EXTERNAL
这个子句就表明现在声明的是一个外部表而不是一张普通的表
DEFAULT DIRECTORY extenttable
这个子句指定外部表的文件在哪个目录中取得
RECORDS DELIMITED BY NEWLINE
这个子句说明文本文件中的每一行就是一个记录。但是当数据库服务器的操作系统不同的时候,这个文本文件的换行符也需要特别注意一下,
因为在NT系统里,换行采用/n/r双字节来表示,而在UNIX/LINUX系统下,换行只用一个字节来表示,所以如果是从NT系统生成的文件,
传到LINUX进行处理的时候,有可能就会出问题。
FIELDS TERMINATED BY ','
这个子句用于表示各个字段间用什么来分隔,根据上面文件的格式,可以看出这个子句的含义。
MISSING FIELD VALUES ARE NULL
这个子句说明如果一个记录中某个字段的值没有,则按“空”来处理
regdate date "YYYY-MM-DD HH24:MI:SS"
这个子句也比较有用,它用于指定日期型字段的格式码,这个格式码将直接与文件中的格式相对应,这样才能实现数据的正确读取和导入。
LOCATION('data.txt')
这个子句用于指明外部文件的文件名,与目录名拼接在一起,就可以在操作系统中对其进行精确的定位了。
此外,还有很多的参数,我这里都没有写,全部采用了默认值,我也没有太关心过其它参数,能用就行了,
好了,到此,我们的外部表已经创建完成了,来操作一下吧:
select * from data_ext;
如果不出意外,您会看到,平面文件已经用表的形式展现在您的面前了,虽然我们能以表的形式来展现数据,但是数据实际上还是存储于外部的,
还需要把它实际的导入进来才可以。这个导入就更简单了,比如:
insert into data select * from data_ext;