详解Oracle外部表

外部表概述:


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

外部表注意事项:

  a.建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。
  b.外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。
  c.不能对外部表建立索引。
  d.对外部表不能使用analyze搜集统计信息
  c.创建外部表时access parameter内部不要加注释否则会报ORA-29913,ORA-29400

 外部表创建:

1、外部表ORACLE_LOADER

   a.创建目录对象并授权

$ mkdir -p /home/oracle/dir_orcl
SQL>create or replace directory dir_dump as '/home/oracle/dir_orcl';
SQL>grant read,write on directory dir_dump to scott;

    b.准备外部文件

-bash-4.1$ more ex_tab.dat 
MITH@@CLERK@@800.00@@RESEARCH
ALLEN@@SALESMAN@@1600.00@@SALES
WARD@@SALESMAN@@1250.00@@SALES
JONES@@MANAGER@@2975.00@@RESEARCH
MARTIN@@SALESMAN@@1250.00@@SALES
BLAKE@@MANAGER@@2850.00@@SALES
CLARK@@MANAGER@@2450.00@@ACCOUNTING
SCOTT@@ANALYST@@3000.00@@RESEARCH
KING@@PRESIDENT@@5000.00@@ACCOUNTING
TURNER@@SALESMAN@@1500.00@@SALES
ADAMS@@CLERK@@1100.00@@RESEARCH
JAMES@@CLERK@@950.00@@SALES
FORD@@ANALYST@@3000.00@@RESEARCH
MILLER@@CLERK@@1300.00@@ACCOUNTING

     c.外部表ORACLE_LOADER类型的创建语法

                  create table ex_tab1(
                       ename varchar2(60),
                       job varchar2(20),
                       sal number(9,2),
                       dname varchar(60)
                    )
                    organization external  --外部表关键词,定义该表为外部表
                    (
                       type oracle_loader  --外部表的类型为oracle_loader
                       default directory dump_dir     --目录
                       access parameters(
                       records delimited by newline 
                       fields terminated by '@@'   
                       optionally enclosed by '"'
                       lrtrim missing field values are null
                       reject rows with all null fields
                       )
                       location ('ex_tab1.dat')       --外部表数据文件
                    ) reject limit 0;  

     b.验证外部表ex_tab1

SQL> select * from ex_tab1;

ENAME	   JOB			  SAL DNAME
---------- --------------- ---------- ----------
MITH	   CLERK	       800.00 RESEARCH
ALLEN	   SALESMAN	      1600.00 SALES
WARD	   SALESMAN	      1250.00 SALES
JONES	   MANAGER	      2975.00 RESEARCH
MARTIN	   SALESMAN	      1250.00 SALES
BLAKE	   MANAGER	      2850.00 SALES
CLARK	   MANAGER	      2450.00 ACCOUNTING
SCOTT	   ANALYST	      3000.00 RESEARCH
KING	   PRESIDENT	      5000.00 ACCOUNTING
TURNER	   SALESMAN	      1500.00 SALES
ADAMS	   CLERK	      1100.00 RESEARCH
JAMES	   CLERK	       950.00 SALES
FORD	   ANALYST	      3000.00 RESEARCH
MILLER	   CLERK	      1300.00 ACCOUNTING

14 rows selected.

SQL> 

 2、外部表ORACLE_DATAPUMP类型

    a.创建目录对象及授权

        同 1.a

    b.创建ORACLE_DATAPUMP类型的外部表

  create table ex_tab2 --创建外部表
    (ename,job,sal,dname)      --表列描述,注意未指定数据类型
    organization external
    (
    type oracle_datapump     --使用datapump将查询结果填充到外部表,注,此处由select生成,故不支持oracle_loader
    default directory DUMP_DIR   --指定外部表的存放目录
    location(DUMP_DIR:'ex_tab1.dmp,ex_tab2.dmp')
    )parallel 2                       --按并行方式来填充,这里的并行度必须与生成的文件数量一致才能起作用,详细算法可
    as                              
   select ename,job,sal,dname --填充使用的原始数据
   from emp join dept
   on emp.deptno=dept.deptno  ;

    c.验证外部表

SQL> select * from ex_tab2;

ENAME	   JOB			  SAL DNAME
---------- --------------- ---------- ----------
SMITH	   CLERK	       800.00 RESEARCH
ALLEN	   SALESMAN	      1600.00 SALES
WARD	   SALESMAN	      1250.00 SALES
JONES	   MANAGER	      2975.00 RESEARCH
MARTIN	   SALESMAN	      1250.00 SALES
BLAKE	   MANAGER	      2850.00 SALES
CLARK	   MANAGER	      2450.00 ACCOUNTING
SCOTT	   ANALYST	      3000.00 RESEARCH
KING	   PRESIDENT	      5000.00 ACCOUNTING
TURNER	   SALESMAN	      1500.00 SALES
ADAMS	   CLERK	      1100.00 RESEARCH
JAMES	   CLERK	       950.00 SALES
FORD	   ANALYST	      3000.00 RESEARCH
MILLER	   CLERK	      1300.00 ACCOUNTING

14 rows selected.

SQL>

3、外部表相关的视图

    a.查看外部表信息

select TABLE_NAME,TYPE_NAME,DEFAULT_DIRECTORY_NAME,REJECT_LIMIT,ACCESS_PARAMETERS from user_external_tables;

    b.获得平面文件的位置

select * from user_external_locations order by table_name;

4、外部表的局限性 

1.SQLLDR可以指定多少提交一次,即ROWS=?, 外部表却没有,这对于大数据量的导入有些不方例。
2.sqlldr errors表示允许错误的行数,外部表用REJECT LIMIT UNLIMITED,这个功能上基本相同。
3.外部表的列不能指定为not nullable,这样就很难拒绝某列为空值的记录。
4.外部表不能使用continueif ,如果记录有换行的就比较难处理。

5、引用

https://www.cnblogs.com/ilifeilong/p/7648193.html

https://blog.csdn.net/snow1wolf/article/details/40115801

猜你喜欢

转载自blog.csdn.net/makai5521/article/details/89374153
今日推荐