两种方法建立外部表

  1. 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR;

  2. 从12C起,可以使用模式来运行SQLLDR;

在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR:

创建表dept,如下:

create table dept as select * from scott.dept where 1 = 2;

建立控制文件,如下:

LOAD DATA

INFILE --指定数据文件,*表示数据就在此控制文件中(BEGINDATA后面的时数据部分)

INTO TABLE DEPT

FIELDS TERMINATED BY ','

(DEPTNO, DNAME, LOC)

BEGINDATA

10,Sales,Virginia

20,Accounting,Virginia

30,Consulting,Virginia

40,Finance,Virginia

abc,xyz,hello

运行sqlldr命令,如下:

D:\app\Orcl\data_dir>sqlldr eoda/foo@muphy dept.ctl external_table=generate_only

  1. external_table为generate_only时,会生成ddl和dml语句防在日志中,不加载数据,然后手动执行这些语句,最后将数据重外部表导入dept表

  2. external_table为execute时,会直接加载数据到存在的外部表,需要先创建对应合适的表

从12C起,可以使用模式来运行SQLLDR

数据文件dept.dat,文件内容CSV格式,如下:

10,Sales,Virginia

20,Accounting,Virginia

30,Consulting,Virginia

40,Finance,Virginia

abc,xyz,hello

创建表dept,如下:

create table dept(

   deptno number(2) constraint dept_pk primary key,

   dname varchar2(14),

   loc        varchar2(13)

)

运行sqlldr命令,如下:

D:\app\Orcl\data_dir>sqlldr eoda/foo@muphy table=dept

查询表数据

EODA@muphy> select * from dept;

   DEPTNO DNAME          LOC

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

       10 Sales          Virginia

       20 Accounting     Virginia

       30 Consulting     Virginia

       40 Finance        Virginia

 

外部表的限制

在以下两种情况下不宜使用外部表,更应该使用sqlldr:

  1. 必须通过网络加载数据,文件不在数据库服务器上。

  2. 多用户必须使用相同外部表来处理不同的输入文件

多用户与并行问题

可以直接修改外部表指向:

EODA@muphy> alter table sys_sqlldr_x_ext_dept location('file1.bat','file2.bat');

按照特殊字符串区分命名文件:

  1. %p:PID

  2. %a:并行执行服务器代理ID,并行执行服务器指定了数字001,002,003等。

外部表预处理

预处理可以执行脚本,将脚本的处理后的输出作为数据源(脚本也可以读取数据)

create table csv3

 ( col1 varchar2(20)

  ,col2 varchar2(20)

 )

 organization external

 (

  type oracle_loader

  default directory data_dir

  access parameters

   (

     records delimited by newline

     preprocessor exec_dir:'run_sed.bsh'

     fields terminated by '|' ldrtrim

   )

   location

   (

     data_dir:'load.csv'

   )

)

 

外部表数据泵卸载,与expdp工具文件格式一样

创建目录:

EODA@muphy>create or replace directory  data_dir as 'D:\app\Orcl\data_dir';

卸载数据:

create table all_objects_unload

organization external

( type oracle_datapump

 default directory data_dir

 location('allobjects.dat')

) as

select * from all_objects;

 

SQLLDR加载数据

加载定界数据:

LOAD DATA

INFILE --指定数据文件,*表示数据就在此控制文件中(BEGINDATA后面的时数据部分)

INTO TABLE DEPT

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'--可以保护逗号和分号

(DEPTNO,

DNAME char(1000), --默认char255

LOC  "upper(:loc)", --使用函数

LAST_UPDATE date  'dd/mm/yyyy')  --加载时间

BEGINDATA

10,Sales,"Virginia,USA",1/5/2014

20,Accounting,"Virginia,""USA""",6/5/2014

30,Consulting,Virginia,15/3/2014

加载定长数据:

LOAD DATA

INFILE --指定数据文件,*表示数据就在此控制文件中(BEGINDATA后面的时数据部分)

INTO TABLE DEPT

REPLACE

( DEPTNO position(1:2),

 DNAME position(3) char(10),--固定长度,位置3-12

 LOC       position(*:20) --*表示上一个结束位置12加1 可以使用*+2

 LAST_UPDATE date  'dd/mm/yyyy'

)

BEGINDATA

20AccountingVirginia

加载LOB:

  • 创建表:

create table lob_demo

(...

filename      varchar2(255),

data      blob

  • lob内联在普通数据中

数据与控制文件必须分开

可以使用str,var和fix等参数来加载数据

  1. INFILE demo.dat "fix 80" --表示每条记录80字节

  2. INFILE demo.dat "var 3" --表示每条记录前三字节用于该条记录的长度

  3. INFILE demo.dat "str X'7C0A'" --表示自定义|每条记录的分隔符

  • lob外联存储数据

.....

filename position(44:100),

data        lobfile(filename) terminated by eof

)

bigindata

-rwxr-xr-x 1 oracle dba 14889 Jui 22 22:01 dl.sql

运行命令:

D:\app\Orcl\data_dir>sqlldr userid=eoda control=dept.ctl

 

PL/SQL加载lob

创建表

EODA@muphy> create table demo ( id int primary key, theClob clob);

创建测试文件

EODA@muphy> host echo 'hello world!' > D:\app\Orcl\data_dir\test.txt

读取文件

EODA@muphy> declare

l_clob clob;

l_bfile bfile;

begin

insert into demo values(1,empty_clob()) returning theClob into l_clob; --让l_clob指向lob

l_bfile := bfilename('DATA_DIR','test.txt');

dbms_lob.fileopen(l_bfile);

dbms_lob.loadfromfile(l_clob,l_bfile,dbms_lob.getlength(l_bfile));

dbms_lob.fileclose(l_bfile);

end;

读取文件,解决乱码

EODA@muphy> declare

l_clob clob;

l_bfile bfile;

dest_offset integer :=1;

src_offset  integer :=1;

src_csidnumber  :=NLS_CHARSET_ID('WE8ISO8859P1');

lang_context integer :=dbms_lob.default_lang_ctx;

warning integer;

begin

insert into demo values(1,empty_clob()) returning theClob into l_clob; --让l_clob指向lob

l_bfile := bfilename('DATA_DIR','test.txt');

dbms_lob.fileopen(l_bfile);

dbms_lob.loadclobfromfile(l_clob,l_bfile,dbms_lob.getlength(l_bfile),dest_offset,src_offset,src_csid,lang_context,warining);

dbms_lob.fileclose(l_bfile);

end;

查询表

EODA@muphy> select dbms_lob.getlength(theClob),theClob from demo;

 

来自《Oracle编程艺术深入理解数据库体系结构第三版》的学习总结

Oracle外部表与SQLLDR的更多相关文章

  1. ORACLE外部表总结

    外部表介绍 ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表 ...

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

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

  3. Oracle外部表详解

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

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

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

  5. Oracle外部表的使用

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

  6. oracle外部表

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

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

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

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

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

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

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

随机推荐

  1. Centos7+LVS-NAT+apache实验

    一.简介 1.理论已经在上一篇博客简述,不了解得可以看看 https://www.cnblogs.com/zhangxingeng/p/10497279.html 2.LVS-NAT优缺点复习 关于这 ...

  2. [Javascript] encodeURIComponent()方法

    在vue項目中使用vue-router通过url进行传值 encodeURIComponent encodeURIComponent() 函数可把字符串作为 URI 组件进行编码.encodeURIC ...

  3. Css-移动端适配总结

    前言 工作以后,大部分的业务工作都是基于移动端H5的,开发过程中学习了很多东西,遇到过许多问题,诸如rem\em\css px\device px等,本文纯属个人的归纳总结,如有问题,请指出亲喷~ P ...

  4. 数据库缓存mybatis,redis

    简介 处理并发问题的重点不在于你的设计是怎样的,而在于你要评估你的并发,并在并发范围内处理.你预估你的并发是多少,然后测试r+m是否支持.缓存的目的是为了应对普通对象数据库的读写限制,依托与nosql ...

  5. mac 卸载通过官网下载包安装的node

    sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}

  6. 关于在Idea 创建Maven项目时,无法在source文件下创建servlet文件问题解决!

    很简单:打开.iml文件,

  7. UEFI引导的简单恢复方法

    装系统,尤其是双系统,总是无法绕过引导的坑. linux的grub是非常复杂的引导系统,学习它非常累.而windows又不能引导linux.你可能会想,怎么就没有一种简单的引导方式,就好像引导光盘,引 ...

  8. 一分钟了解Allegro导入DXF文件

    Allegro, pads,PCB线路板设计,小北PCB 很高兴与大家分享一分钟了解Allegro导入DXF文件的方法,请问您们,刚学习这个软件时,您是否遇到过同样的问题呢?应该我们每一个刚学习者都会 ...

  9. pyspider安装提示:got an unexpected keyword argument 'io_loop'的解决办法

    此问题解决办法学习自pyspider的github的issues 原地址:https://github.com/binux/pyspider/issues/771 解决方法: 由于最新版的Tornad ...

  10. 从0开始的Python学习015输入与输出

    简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...