ITPub博客

首页 > 数据库 > Oracle > ORACLE学习之外部表

ORACLE学习之外部表

原创 Oracle 作者:静以致远√团团 时间:2013-11-20 10:49:45 0 删除 编辑
################    ORACLE学习之外部表     ################

    外部表只能在Oracle 9i之后来使用。外部表是指不在数据库内的表,如操作系统内有一个以逗号为分隔符的存储数据的文件,可以通过外部表将该文件的内容显示在数据库内,外部表的功能类似于视图,只能读,不能修改。
    创建外部表时首先要创建目录指定外部表的数据文件的位置,然后编辑外部表的创建语法:
    这里利用sqlldr生成一个外部表的标准,例如:
[oracle@orcl2 sqlldr2]$ pwd
/u01/myscript/sqlldr2
[oracle@orcl2 sqlldr2]$ ls
sqlldr2.ctl  sqlldr2.dat
[oracle@orcl2 sqlldr2]$ 
在/u01/myscript/sqlldr2目录下有sqlldr2.ctl和sqlldr2.dat两个文件,其中sqlldr2.ctl是sqlldr的控制文件,用来描述要导入数据的详细规则,sqlldr2.dat是数据文件,内部存有要加载的数据,并且以逗号为分隔符。具体内容如下,此处稍加解释,有关sqlldr的内容请看上篇详解。
[oracle@orcl2 sqlldr2]$ cat sqlldr2.ctl 
LOAD DATA //指定加载数据
INFILE sqlldr2.dat //指定加载的数据文件位置
APPEND INTO TABLE BONUS //指定要加载的表
FIELDS TERMINATED BY "," //指定数据文件以逗号为分隔符
(ENAME,JOB,SAL) //指定加载数据的列明


[oracle@orcl2 sqlldr2]$ cat sqlldr2.dat //此处为数据文件,以逗号为分隔符,不在赘述 
USER1,EMP,100
USER2,EMP,101
USER3,EMP,102
USER4,EMP,103
USER5,EMP,104
USER6,EMP,105
USER7,MGR,106
USER8,MGR,107
USER9,HR,108


先在数据内创建目录,并授权给scott(以scott用户为例):


SQL> create directory sqlldr2 as '/u01/myscript/sqlldr2';
Directory created.
SQL> grant read,write on directory sqlldr2 to scott;
Grant succeeded.


利用sqlldr生成创建外部表的语句:
[oracle@orcl2 sqlldr2]$ sqlldr scott/oracle control=sqlldr2.ctl external_table=generate_only


SQL*Loader: Release 10.2.0.1.0 - Production on Wed Nov 20 10:21:27 2013
Copyright (c) 1982, 2005, Oracle.  All rights reserved.


同目录下回生成一个.log结尾的日志文件,查看日志文件并获得sql语句
[oracle@orcl2 sqlldr2]$ cp sqlldr2.log sqlldr2.sql
[oracle@orcl2 sqlldr2]$ vi sqlldr2.sql 
删除无用的行,只保留一下语句即可:
CREATE TABLE "SYS_SQLLDR_X_EXT_BONUS"   //创建的外部表名,可自行修改
(
  "ENAME" VARCHAR2(20), //要创建外部表的列的属性
  "JOB" VARCHAR2(15),
  "SAL" NUMBER
)
ORGANIZATION external //指定该表为外部表,以下为外部表的属性
(
  TYPE oracle_loader    
/****加载数据的方式,ORACLE_LOADER是传统方式,还有皮ORACLE_DATAPUMP是数据泵的方式****/


  DEFAULT DIRECTORY SQLLDR2 //默认的加载路径,看,指定的是刚创建的目录
  ACCESS PARAMETERS
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII  //记录结束标记,此处为换行结束
    BADFILE 'SQLLDR2':'sqlldr2.bad' //生成.bad文件,导入过程中记录坏的数据
    LOGFILE 'sqlldr2.log_xt' //生成日志文件
    READSIZE 1048576 //读取日志文件缓存区的大小,默认1M
    FIELDS TERMINATED BY "," LDRTRIM //指定分隔符
    REJECT ROWS WITH ALL NULL FIELDS //指定若为空值,则加载是为NUll(若整列均为空,则不予加载)
    (
      "ENAME" CHAR(255) //以下为列的属性
        TERMINATED BY ",",
      "JOB" CHAR(255)
        TERMINATED BY ",",
      "SAL" CHAR(255)
        TERMINATED BY ","
    )
  )
  location
  (
    'sqlldr2.dat' //要加载的数据文件名
  )
)REJECT LIMIT UNLIMITED //指定查询数据能结束的错误次数,此处不限制




好了,外部表语法解释完毕,熟悉的情况下可以自己手动创建,接下来去数据库执行创建该外部表:
SQL> get /u01/myscript/sqlldr2/sqlldr2.sql
  1  CREATE TABLE BONUS_TEST
  2  (
  3    "ENAME" VARCHAR2(20),
  4    "JOB" VARCHAR2(15),
  5    "SAL" NUMBER
  6  )
  7  ORGANIZATION external
  8  (
  9    TYPE oracle_loader
 10    DEFAULT DIRECTORY SQLLDR2
 11    ACCESS PARAMETERS
 12    (
 13      RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
 14      BADFILE 'SQLLDR2':'sqlldr2.bad'
 15      LOGFILE 'sqlldr2.log_xt'
 16      READSIZE 1048576
 17      FIELDS TERMINATED BY "," LDRTRIM
 18      REJECT ROWS WITH ALL NULL FIELDS
 19      (
 20        "ENAME" CHAR(255)
 21          TERMINATED BY ",",
 22        "JOB" CHAR(255)
 23          TERMINATED BY ",",
 24        "SAL" CHAR(255)
 25          TERMINATED BY ","
 26      )
 27    )
 28    location
 29    (
 30      'sqlldr2.dat'
 31    )
 32* )REJECT LIMIT UNLIMITED
SQL> /
Table created.
SQL> select * from bonus_test;
ENAME                JOB                    SAL
-------------------- --------------- ----------
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108
9 rows selected.


数据文件中的9条数据完全加入到了数据库中
[oracle@orcl2 sqlldr2]$ ls
sqlldr2.ctl  sqlldr2.dat  sqlldr2.log  sqlldr2.log_xt  sqlldr2.sql
同目录下生成了一个.log_xt的日志文件
[oracle@orcl2 sqlldr2]$ cat sqlldr2.log_xt 




 LOG file opened at 11/20/13 10:36:42


Field Definitions for table BONUS_TEST
  Record format DELIMITED BY NEWLINE
  Data in file has same endianness as the platform
  Reject rows with all null fields


  Fields in Data Source: 


    ENAME                           CHAR (255)
      Terminated by ","
      Trim whitespace same as SQL Loader
    JOB                             CHAR (255)
      Terminated by ","
      Trim whitespace same as SQL Loader
    SAL                             CHAR (255)
      Terminated by ","
      Trim whitespace same as SQL Loader
该文件记录外部表的操作信息
若向sqlldr2.dat文件中加入一行数据USER10,HR,108,再次进入数据库查询该外部表会发现多出了一条,好神奇~
SQL> select * from bonus_test;
ENAME                JOB                    SAL
-------------------- --------------- ----------
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108
USER10               HR                     108
10 rows selected.




再次查看sqlldr2.log_xt日志会发现多出几条日志信息


未完待续...




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-777062/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103384