Oracle外部表与SQLLDR
两种方法建立外部表
在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR;
从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
external_table为generate_only时,会生成ddl和dml语句防在日志中,不加载数据,然后手动执行这些语句,最后将数据重外部表导入dept表
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:
必须通过网络加载数据,文件不在数据库服务器上。
多用户必须使用相同外部表来处理不同的输入文件
多用户与并行问题
可以直接修改外部表指向:
EODA@muphy> alter table sys_sqlldr_x_ext_dept location('file1.bat','file2.bat');
按照特殊字符串区分命名文件:
%p:PID
%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等参数来加载数据
INFILE demo.dat "fix 80" --表示每条记录80字节
INFILE demo.dat "var 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的更多相关文章
- ORACLE外部表总结
外部表介绍 ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表 ...
- Oracle外部表详解(转载)
(外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中 ...
- Oracle外部表详解
外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数 ...
- 如何利用Oracle外部表导入文本文件的数据
同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...
- Oracle外部表的使用
外部表可以像其它表一样,用select语句作查询.但不能做DML操作,不能建index,不接受约束.这是因为它不是以段的形式存于数据库中,只是以数据字典构造存在,指向一个或多个操作系统文件. 外部表的 ...
- oracle外部表
关于外部表的描述 正确描述 the create table as select statement can be used to upload data into a normal table in ...
- sql*loader以及oracle外部表加载Date类型列
Oracle sqlldr LOAD DATAINFILE *INTO TABLE testFIELDS TERMINATED BY X'9'TRAILING NULLCOLS( c2 &quo ...
- 使用oracle外部表进行数据泵卸载数据
数据泵卸载Oracle9i引入了外部表,作为向数据库中读取数据的一种方法.Oracle 10g则从另一个方向引入了这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据.从O ...
- Oracle外部表的管理和应用
外部表作为oracle的一种表类型,虽然不能像普通库表那么应用方便,但有时在数据迁移或数据加载时,也会带来极大的方便,有时比用sql*loader加载数据来的更为方便,下面就将建立和应用外部表的命令和 ...
随机推荐
- 第66章 视频 - Identity Server 4 中文文档(v1.0.0)
第66章 视频 66.1 2019 January [NDC] - 使用ASP.NET Core 2.2和3.0保护Web应用程序和API 1月[NDC] - 为基于OpenID Connect / ...
- asp.net 仿微信端菜单设置
第一步:添加引用文件 <link rel="stylesheet" href="~/assets/css/bootstrap.min.css"> & ...
- 由于服务主机:DCOM服务进程占用过多CPU,导致系统卡死
最近在使用电脑的时候,总是出现电脑死机,而且鼠标也是经常卡在那里不动了,开始以为是鼠标的问题,还换了个鼠标(飙泪中),这还是一个血的教训啊!!!之后打开任务管理器发现CPU占用已经达到100%,而且一 ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- MySQL逻辑架构概述
1.MySQL逻辑架构 MySQL逻辑架构图 MySQL逻辑架构分四层 1.连接层:主要完成一些类似连接处理,授权认证及相关的安全方案. 2.服务层:在 MySQL据库系统处理底层数据之前的所有工作都 ...
- VS Code怎样设置成中文
打开 VS Code Ctrl + Shift +p打开搜索框 搜索框内输入Configure Display Language 回车 修改代码中“locale”后面引号内内容为zh-CH 重新启动V ...
- android - TextView单行显示...或者文字左右滚动(走马灯效果)
条件 TextView单行显示,文字左右滚动(走马灯效果)实现条件: 实现单行设置固定宽度或者设置权重都行 代码 TextView滚动必须写下面几个属性 android:singleLine=&quo ...
- 在Windows Phone 8.1中使用Sqlite数据库
前言 我的工作目前不涉及到Windows phone的开发,但是业余时间也开发过几款app.以前由于各种条件的限制,只接触到WP8.0设备的app开发. 最近几个月开始将WP8的应用迁移到WP8.1, ...
- 使用 phpstudy 搭建本地测试环境
最近在为另一个部门配置一个多语言的网站,因为之前他们已经做过 英文和中文两种语言,这次帮他们添加其它几种语言,从GitLab 上拉下来的代码,是php环境做的,需要在本地跑起来,做完测试通过后再一次性 ...
- redis -hash(哈希.对象)
hash 用于储存对象,对象的结构为属性.值 值的类型string 增加.修改: 设置单个属性: hset 键 field 值 例如: 设置键 user 的属性name 为 python hset u ...