使用外部表

目录:

1、CREATE TABLE 语句创建

2、SQL Loader创建

3、外部表参数

4、修改外部表


1、CREATE TABLE语句创建

(1)创建Directory 对象,并授予用户读写Directory的权限

SQL> CREATE DIRECTORY EXTDIR AS '/home/oracle/text';


Directory created.

SQL> GRANT READ,WRITE ON DIRECTORY EXTDIR TO SCOTT;

Grant succeeded.

(2)执行Create table 语句

使用SQL*Loader 的一个控制文件,作为外部表的数据源,Directory对象使用前面创建的EXTDIR。

文件:ldr_case2.dat

SMITH,CLEAK,3904
ALLEN,"SALER,M",2891
WARD,"SALER,""S""",3128
KING,PRESIDENT,2523

________________________________

SQL> CREATE TABLE EXT_CASE
   (ENAME VARCHAR2(10),
    JOB VARCHAR2(20),
    SAL  NUMBER)
    ORGANIZATION EXTERNAL
    ( TYPE ORACLE_LOADER
    DEFAULT DIRECTORY EXTDIR
    ACCESS PARAMETERS
    (
     RECORDS DELIMITED BY NEWLINE
     BADFILE 'EXTDIR' : 'ldr_case.bad'
     LOGFILE 'EXTDIR' : 'ldr_case.log'
     SKIP 1
     FIELDS TERMINATED BY ","
     OPTIONALLY ENCLOSED BY '"'
     REJECT ROWS WITH ALL NULL FIELDS
     (ENAME,JOB,SAL)
   )
   LOCATION('ldr_case2.dat')
   );


Table created.


SQL> select * from ext_case;


ENAME      JOB                         SAL
---------- -------------------- ----------
ALLEN      SALER,M                    2891
WARD       SALER,"S"                  3128
KING       PRESIDENT                  2523


2、SQL Loader创建

SQLLDR 有一个参数:external_table,该参数有三个属性值:

       NOT_USED:不使用外部表,通过常规路径或直接路径加载数据,也是该参数的默认值。

       GENERATE_ONLY:SQLLDR并不执行加载,而是生成创建外部表的SQL和处理数据的SQL,并保存在log文件中。DBA可以修改后拿到SQL*Plus中执行。   

       EXECUTE:首先创建外部表,然后通过外部表方式加载数据


[oracle@oracledb text]$ sqlldr scott/tiger control=ldr_case2.ctl external_table=generate_only;

在目录下查看日志文件ldr_case2.log,发现与创建外部表相关脚本

CREATE TABLE "SYS_SQLLDR_X_EXT_BONUS" 
(
  "ENAME" VARCHAR2(10),
  "JOB" VARCHAR2(10),
  "SAL" NUMBER
)
ORGANIZATION external 
(
  TYPE oracle_loader
  DEFAULT DIRECTORY EXTDIR
  ACCESS PARAMETERS 
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
    BADFILE 'EXTDIR':'ldr_case2.bad'
    LOGFILE 'ldr_case2.log_xt'
    READSIZE 1048576
    FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' LDRTRIM 
    REJECT ROWS WITH ALL NULL FIELDS 
    (
      "ENAME" CHAR(255)
        TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
      "JOB" CHAR(255)
        TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
      "SAL" CHAR(255)
        TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
    )
  )
  location 
  (
    'ldr_case2.dat'
  )
)REJECT LIMIT UNLIMITED

该脚本只能够用做参考,直接执行不了,修改表名,目录名,结尾加上分号才行。



3、外部表参数

   第一部分:指定表结构

    如同常规建表的方式一样,先创建表名,列名,定义字段类型。

    ORGANIZATION  exernal 则指定这是一个外部表。

 

   第二部分:指定访问驱动的路径

  (1)TYPE:有两个选择

     ORACLE_LOADER:采用SQLLDR方式,参数众多,应用广泛。

     ORACLE_DATAPUMP :采用数据泵(Datapump),这是11gR2中新增的访问方式,但是数据文件采用数据泵产生的专有二进制文件(DMP文件)。但是既可以加载外部表,也可以生成外部表。

 (2)DEFAULT DIRECTORY:指定数据文件所在路径对应的Directory对象名称。

 

  第三部分:指定加载参数

  加载参数决定了外部表如何访问数据文件。具体需要哪些参数,这要看采用的那种访问驱动,不同的驱动有不同的加载参数。

  使用SQLLDR命令生成的是ORACLE_LOADER的加载参数。常用的参数介绍如下:

 (1)RECORDS:该子句指定记录结束标记,默认是RECORDS DELIMITED BY NEWLINE,即以换行符结束。

 (2)BADFILE:错误文件名称和Directory对象名。

 (3)LOGFILE:日志文件名称和Directory对象名。

 (4)READSIZE:(优化)读取日志文件的缓冲区大小,默认是1MB,与SQLLDR命令中的同参数具有相同功能。

 (5)SKIP:跳过的记录数。( 注意:不能有SQL*Loader中的 LOAD 参数限制加载的行数)

 (6)FIELDS TERMINATED BY 

 (7)OPTIONALLY ENCLOSED BY '"'

 (8)REJECT ROWS WITH ALL NULL FIELDS:该子句表示如果要加载的行所有字段均为空值,则外部表不加载,如果不指定则会加载空行。


  第四部分:指定数据来源

(1) LOCATION子句用来指定数据来源,语法就是LOCATION('filename1','filename2'...)可以同时指定多个数据来源文件,按序读入

(2)REJECT LIMIT 子句,用来指定查询数据时能够接受的错误数,如果不指定默认是0,即不允许出现错误,UNLIMITED则是不限制。



4、修改外部表

    外部表的修改受到很大的限制。只有部分属性能够修改。如上介绍,外部表分为了4个部分,有些时候你你想修改单独的属性是不可以的,要修改必须整个部分都修改

 第一部分    表结构: 这部分修改与操作普通表完全相同,你可以添加列,删除列、修改列,不过需要注意,对列修改后,ACCESS PARAMETERS子句中也需要相应修改。

 第二部分    访问驱动:一般不需要修改,如果你要修改Directory对象,则语法如下:

                      SQL> ALTER TABLE EXT_CASE DEFAULT DIRECTORY EXTDIR;

 第三部分     加载参数:这部分很复杂,无法单独修改。也就是说,你要修改ACCESS PARAMETERS 中任何参数,你都需要重写一遍ACCESS PARAMETERS 子句。

SQL> ALTER TABLE EXT_CASE ACCESS PARAMETERS (
  2  RECORDS DELIMITED BY NEWLINE
  3    BADFILE 'EXTDIR' : 'ldr_case.bad'
  4    LOGFILE 'EXTDIR' : 'ldr_case.log'
  5    SKIP 1
  6    FIELDS TERMINATED BY ","
  7    OPTIONALLY ENCLOSED BY '"'
  8    REJECT ROWS WITH ALL NULL FIELDS
  9    (ENAME,JOB,SAL)
 10  );

 第四部分:加载路径:可以直接修改

    ALTER TABLE EXT_CASE LOCATION ('ldr_case2.dat');




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值