- 浏览: 118235 次
- 性别:
- 来自: 上海
文章分类
最新评论
标例:
load data
infile * ---指定加载文件 *表示数据就在控制文件后面
into table bonus ---指定表名
fields terminated by "," ---指定区域分隔符就是逗号
(ename,job,sal) ---指定表的列名
begindata ---仅当infile 指定*时有效
smith,cleak,3904
allen,salesman,2891
ward,salesman,3128
........
把上术文件保存成a.ctl文件,用如下命令就可以导入
sqlldr userid/pass control=a.ctl
一,要加载的文件不是以逗号作分隔
a,修改原始数据,将分隔符替换成逗号
b,修改控制文件,将fields terminated by 的值修改成实际的分隔符
二,要加载的数据中包含分隔符怎么办,如下表kkk.dat
smith,cleak,3904
allen,"salesman,"ak"",2891
ward,"salesman,M",3128
这个时候就要修改控制文件
load data
infile kkk.dat ---指定加载文件 *表示数据就在控制文件后面
into table bonus ---指定表名
fields terminated by "," optinonally enclosed by ' " ' ---指定区域分隔符就是逗号
(ename,job,sal) ---指定表的列名
optinonally enclosed by ' " ' 默认就是双引号,如果是其他的,把双引号更改就可以了
三,数据文件没有分隔符怎么办,是定长字符串kkk,dat
smith cleak 3904
allen salesman 2891
ward salesman 3128
修改控制文件
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5), position(1:5)指的是从第一个字符载止到第五个字符作为ename的值,绝对偏移量
job position(7:15),
sal position(17:20)
)
position(*+2:15) ,相对偏移量, 表示从上一个位置结束后偏移二个开始取字符,载止到实际第15个字符
position(*)char(9) 相对偏移量+类型和长度的优势在于,你只需要为第一列指定开始位置,其他的只需要指定列长度就可以了
四,数据文件中的列比要导入的表的列少,且空列又必须赋值
如bonus中多一列comm,并赋初始值0,则可以这么写
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm '0'
)
如果要输入特殊值,则可以用函数来解决
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm "substr(:sal,1,1)" 取sal值的第一列,并赋值给comm列
)
当然也可以用pl/sql编写自定义的函数来赋值
五,数据文件中的列比要导入的表中列多怎么办
a,将数据文件中多的列删除
b,采用过滤,或在控制文件中不录这列数据
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
tcol filler position(22:30) , --tcol假设这列不录入,就过滤掉,或这行根本不出现在控制文件中
)
如果此时数据文件是以分隔符出现的则这样写
load data
infile kkk.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal, tcol filler)
六,多个数据文件导同一张表,条件就是这些数据文件的格式要相同
load data
infile kkk.dat
infile kkk2.dat
infile kkk3.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal )
七,同一个数据文件要导入不同的表
bon smith cleak 3904
bon allen saler 2891
mgr king tech 2543
mgr smm admd 3032
要把这里面的数据导到b和m表
load data
infile kkk.dat
discardfile ldr_case9.dsc
truncate
into table b
when tab='bon' 如果此处判断关键字有多个,只能用and,不能用or
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)
into table m
when tab='mgr'
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)
八,数据文件前n行不导入
sqlddr scott/scott control=ldr_case1.ctl skip=3 意思前三行不导入,从第四行工始
sqlddr scott/scott control=ldr_case1.ctl skip=3 load=6 前三行不导入,导入接下来的6行
九,要加载的数据中有换行符
手工指定的换行符,数据文件的换行符并不是标准的换行标志,而是用户自定义的一个标识字符或多个字符组成,
10, smith,sales amnager,this is amith,/nhe is a sales manager.
11, allen.w,tech manager,this is allen.w./nhe is a tech manager.
16, blake,hr manager,this is blake./nhe is a hr manager.
控制文件的写法
load data
infile ldr_case11_1.dat
truncate into table manager
fields terminated by ","
( mgrno,mname,job,
remark "replace(:remark,'//n',chr(10))"
)
如果数据文件是定长字符呢.
smith sales manager this is smith
he is a sales manager
allenw tech manager this is allen w
he is a tech manager.
blake hr manager this is blake
he is a hr manager.
load data infile ldr_case11_2.dat "fix 68" 就是加载文件之前,先通过fix值属性指定每行的长度,这里每行68个字符包括换行符在内,
到了指定长度就换行,不管中间有没有换行符,因此仅能用于定长字符串的数据文件,
因为只有字符串定长,你才知道应该在infile处指定什么值
truncate into table manager
(
ename position(1:8),
job position(10:16),
zhiwei position(*+1:22),
remark position(*+1:65)
)
windows中换行实际上由二个字符组成,回车加换行 chr(13)+chr(10), linux/unix下只需一个字符chr(10)即可
char_string:普通字符,即标准的可见字符,
/n,表示换行, /t 表示行制表符, /f 表示换页 /v 表示列制表符 /r 表示回车
windows下用/r/n linux/unix下用/n就可以了
行尾部换行标识例:
数据文件
10,smith,sales manager,this is smith.
he is a sales manager. |
11,allen.w,tech manager,this is allen.w.
he is a tech manager. |
控制文件
load data
infile ldr_case1_4.dat "str ' | /r/n"
truncate into table manager
fields terminated by ','
(mgrno,maname,job,remarek)
十,要导入大字段(lob类型)
1,数据保存在数据文件中
load data
infile ldr_case12_1.dat "str '|/r/n'"
truncate into table manager
fields terminated by "," optionally enclosed by '"',
(mgrno,mname,job,remark char(10000))
假定remark列有大量文本,就可以这么定义
2,数据文件保存在独立的文件中
SQL> create table lobtbl(
2 fileowner varchar2(30),
3 filename varchar2(200),
4 filesize number,
5 filedata clob,
6 create_date date);
数据文件如下 ldr_case12_2.dat
2009-03-17 09:43 154 junsansi f:/oracle/script/ldr_case11_1.ctl
2009_03_17 09:44 189 junsansi f:/oracle/script/ldr_case11_1.dat
2009_03_17 09:45 2,639 junsansi f:/oracle/script/ldr_case11_4.log
控制文件如下
load date
infile ldr__case12_2.dat
truncate into table lobtbl
(create_date position(1:17) date 'yyyy-mm-dd hh24:mi',
filesize position(*+1:25) "to_number(:filesize, '99,999,999')",
fileowner position(*+1:34),
filename position(*+1) char(200) "substr(:FILENAME,INSTR(:FILENAME,'//',-1)+1)",
filedata lobfile(filename) terminated by eof)
十一,某些字段有空值:
load data
infile ldr_case13.dat
truncate into table bonus
fields terminated by "," trailing nullcols
(ename,job,sal)
十二,大量数据的导入
sqlldr scott/scott control=ldr_object.ctl errors=10 rows=640
表示10行出错就跳出,每次加载640行.默认是64行
如果640行太大,日志信息里面有提示,这个时候就要修改bindsize参数,默认就是256k,我们将其修改为10m(
1024X1024X10=10485760)同时这一次将行提高到5000行.
这样会更快,
sqlldr scott/scott@riso_192.168.1.250 control=ldr_object.ctl errors=10 rows=5000 bindsize=10485760
但还可以更快.
sqlldr scott/scott control=ldr_object.ctl direct=true;
但还可以更快
streamsize:直接路径加载默认读取全部记录, 因此不需要设置rows参数,读取到的数据处理后存入缓存区,即
streamsize参数,该参数为256k,这里加大到10mb
date_cache: 该参数指定一个转换后日期格式的缓存区,以条为单位,默认值1000条,即保存1000条转换后的日期格式,
由于我们要导入的数据中有日期格式,因此加大该参数到5000,以降低日期转换操作带来的开销.
sqlldr scott/tiger control=ldr_object.ctl direct=true streamsize=10485760 date_cache=5000
转载至:
http://blog.csdn.net/ssky87/article/details/5989445
load data
infile * ---指定加载文件 *表示数据就在控制文件后面
into table bonus ---指定表名
fields terminated by "," ---指定区域分隔符就是逗号
(ename,job,sal) ---指定表的列名
begindata ---仅当infile 指定*时有效
smith,cleak,3904
allen,salesman,2891
ward,salesman,3128
........
把上术文件保存成a.ctl文件,用如下命令就可以导入
sqlldr userid/pass control=a.ctl
一,要加载的文件不是以逗号作分隔
a,修改原始数据,将分隔符替换成逗号
b,修改控制文件,将fields terminated by 的值修改成实际的分隔符
二,要加载的数据中包含分隔符怎么办,如下表kkk.dat
smith,cleak,3904
allen,"salesman,"ak"",2891
ward,"salesman,M",3128
这个时候就要修改控制文件
load data
infile kkk.dat ---指定加载文件 *表示数据就在控制文件后面
into table bonus ---指定表名
fields terminated by "," optinonally enclosed by ' " ' ---指定区域分隔符就是逗号
(ename,job,sal) ---指定表的列名
optinonally enclosed by ' " ' 默认就是双引号,如果是其他的,把双引号更改就可以了
三,数据文件没有分隔符怎么办,是定长字符串kkk,dat
smith cleak 3904
allen salesman 2891
ward salesman 3128
修改控制文件
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5), position(1:5)指的是从第一个字符载止到第五个字符作为ename的值,绝对偏移量
job position(7:15),
sal position(17:20)
)
position(*+2:15) ,相对偏移量, 表示从上一个位置结束后偏移二个开始取字符,载止到实际第15个字符
position(*)char(9) 相对偏移量+类型和长度的优势在于,你只需要为第一列指定开始位置,其他的只需要指定列长度就可以了
四,数据文件中的列比要导入的表的列少,且空列又必须赋值
如bonus中多一列comm,并赋初始值0,则可以这么写
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm '0'
)
如果要输入特殊值,则可以用函数来解决
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm "substr(:sal,1,1)" 取sal值的第一列,并赋值给comm列
)
当然也可以用pl/sql编写自定义的函数来赋值
五,数据文件中的列比要导入的表中列多怎么办
a,将数据文件中多的列删除
b,采用过滤,或在控制文件中不录这列数据
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
tcol filler position(22:30) , --tcol假设这列不录入,就过滤掉,或这行根本不出现在控制文件中
)
如果此时数据文件是以分隔符出现的则这样写
load data
infile kkk.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal, tcol filler)
六,多个数据文件导同一张表,条件就是这些数据文件的格式要相同
load data
infile kkk.dat
infile kkk2.dat
infile kkk3.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal )
七,同一个数据文件要导入不同的表
bon smith cleak 3904
bon allen saler 2891
mgr king tech 2543
mgr smm admd 3032
要把这里面的数据导到b和m表
load data
infile kkk.dat
discardfile ldr_case9.dsc
truncate
into table b
when tab='bon' 如果此处判断关键字有多个,只能用and,不能用or
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)
into table m
when tab='mgr'
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)
八,数据文件前n行不导入
sqlddr scott/scott control=ldr_case1.ctl skip=3 意思前三行不导入,从第四行工始
sqlddr scott/scott control=ldr_case1.ctl skip=3 load=6 前三行不导入,导入接下来的6行
九,要加载的数据中有换行符
手工指定的换行符,数据文件的换行符并不是标准的换行标志,而是用户自定义的一个标识字符或多个字符组成,
10, smith,sales amnager,this is amith,/nhe is a sales manager.
11, allen.w,tech manager,this is allen.w./nhe is a tech manager.
16, blake,hr manager,this is blake./nhe is a hr manager.
控制文件的写法
load data
infile ldr_case11_1.dat
truncate into table manager
fields terminated by ","
( mgrno,mname,job,
remark "replace(:remark,'//n',chr(10))"
)
如果数据文件是定长字符呢.
smith sales manager this is smith
he is a sales manager
allenw tech manager this is allen w
he is a tech manager.
blake hr manager this is blake
he is a hr manager.
load data infile ldr_case11_2.dat "fix 68" 就是加载文件之前,先通过fix值属性指定每行的长度,这里每行68个字符包括换行符在内,
到了指定长度就换行,不管中间有没有换行符,因此仅能用于定长字符串的数据文件,
因为只有字符串定长,你才知道应该在infile处指定什么值
truncate into table manager
(
ename position(1:8),
job position(10:16),
zhiwei position(*+1:22),
remark position(*+1:65)
)
windows中换行实际上由二个字符组成,回车加换行 chr(13)+chr(10), linux/unix下只需一个字符chr(10)即可
char_string:普通字符,即标准的可见字符,
/n,表示换行, /t 表示行制表符, /f 表示换页 /v 表示列制表符 /r 表示回车
windows下用/r/n linux/unix下用/n就可以了
行尾部换行标识例:
数据文件
10,smith,sales manager,this is smith.
he is a sales manager. |
11,allen.w,tech manager,this is allen.w.
he is a tech manager. |
控制文件
load data
infile ldr_case1_4.dat "str ' | /r/n"
truncate into table manager
fields terminated by ','
(mgrno,maname,job,remarek)
十,要导入大字段(lob类型)
1,数据保存在数据文件中
load data
infile ldr_case12_1.dat "str '|/r/n'"
truncate into table manager
fields terminated by "," optionally enclosed by '"',
(mgrno,mname,job,remark char(10000))
假定remark列有大量文本,就可以这么定义
2,数据文件保存在独立的文件中
SQL> create table lobtbl(
2 fileowner varchar2(30),
3 filename varchar2(200),
4 filesize number,
5 filedata clob,
6 create_date date);
数据文件如下 ldr_case12_2.dat
2009-03-17 09:43 154 junsansi f:/oracle/script/ldr_case11_1.ctl
2009_03_17 09:44 189 junsansi f:/oracle/script/ldr_case11_1.dat
2009_03_17 09:45 2,639 junsansi f:/oracle/script/ldr_case11_4.log
控制文件如下
load date
infile ldr__case12_2.dat
truncate into table lobtbl
(create_date position(1:17) date 'yyyy-mm-dd hh24:mi',
filesize position(*+1:25) "to_number(:filesize, '99,999,999')",
fileowner position(*+1:34),
filename position(*+1) char(200) "substr(:FILENAME,INSTR(:FILENAME,'//',-1)+1)",
filedata lobfile(filename) terminated by eof)
十一,某些字段有空值:
load data
infile ldr_case13.dat
truncate into table bonus
fields terminated by "," trailing nullcols
(ename,job,sal)
十二,大量数据的导入
sqlldr scott/scott control=ldr_object.ctl errors=10 rows=640
表示10行出错就跳出,每次加载640行.默认是64行
如果640行太大,日志信息里面有提示,这个时候就要修改bindsize参数,默认就是256k,我们将其修改为10m(
1024X1024X10=10485760)同时这一次将行提高到5000行.
这样会更快,
sqlldr scott/scott@riso_192.168.1.250 control=ldr_object.ctl errors=10 rows=5000 bindsize=10485760
但还可以更快.
sqlldr scott/scott control=ldr_object.ctl direct=true;
但还可以更快
streamsize:直接路径加载默认读取全部记录, 因此不需要设置rows参数,读取到的数据处理后存入缓存区,即
streamsize参数,该参数为256k,这里加大到10mb
date_cache: 该参数指定一个转换后日期格式的缓存区,以条为单位,默认值1000条,即保存1000条转换后的日期格式,
由于我们要导入的数据中有日期格式,因此加大该参数到5000,以降低日期转换操作带来的开销.
sqlldr scott/tiger control=ldr_object.ctl direct=true streamsize=10485760 date_cache=5000
转载至:
http://blog.csdn.net/ssky87/article/details/5989445
发表评论
-
获取oracle数据库中表中记录行数,不使用select count()方式
2014-05-23 15:56 1495逐个表统计数据行数,使用Select count语句统计,比较 ... -
修改Oracle10g的默认8080端口
2013-12-03 01:07 467Oracle10g在安装完成后,默认占用8080端口,而这个 ... -
Oracle的分页查询语句优化
2013-08-07 16:56 754Oracle的分页查询语句基本上可以按照本文给出的格式来进行套 ... -
如何查看LINUX 硬件配置信息
2013-07-04 12:51 374在网上找了N久,发现了一篇不错的文档,转载一下: 1.查看机 ... -
oracle 回收站管理
2013-04-12 17:02 641oracle10g,在pl/sql中选中删除后会出现类似:BI ... -
plsql中的异常
2013-03-21 17:51 1209如果没有异常,在程序中,应当检查每个命令的成功还是失败,使用异 ... -
在oracle中通过connect by prior来实现递归查询
2012-11-05 22:36 1090Start with...Connect By子句递归查询一般 ... -
分页.
2012-05-25 15:59 607select * from (select rownum as ... -
Oracle维护常用SQL语句
2012-05-11 14:34 7131:查看表空间的名称及大小 select t.ta ... -
SQL语句优化技术分析
2012-05-25 16:00 685SQL语句优化技术分析- - 操作符优化 ... -
有关sqlldr的一个具体应用
2012-04-09 15:59 1098今天接到生管给的生产报表,需要删除2000台SEQ状态下 ... -
oracle11g密码区分大小写问题
2012-03-26 14:05 1373自11g开始,oracle缺省区分帐号的密码大小写(ca ... -
shell远程获取文件
2012-03-26 14:06 970根据输入的参数(文件名称),逐个获取远程主机制定目录的文 ... -
自动取远程服务器的文件到本地的脚本
2012-03-26 14:06 904自动取远程服务器的文件到本地,中间无需人工参与 a. ... -
如何删除所有目录下与目录同名的文件?
2012-03-26 14:06 1176#!/bin/bash for i in $(f ... -
Linux 脚本编写基础
2012-03-22 11:03 18411. Linux 脚本编写基础1.1 语法基本介绍1.1.1 ... -
shell脚本实现查找目录下同名但不同后缀名的文件
2012-03-22 10:59 2502原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ... -
怎么样判断文件是否存在
2012-03-22 10:58 759[[ -e file ]] && ech ... -
shell获取目录下最新的文件,文件是以日期命名
2012-03-22 10:56 4964shell编程:一个目录下面有很多文件,这些文件都是以日 ... -
PL/SQL教程
2012-03-22 10:55 937课程 一 PL/SQL 基本查 ...
相关推荐
oracle sqlldr 工具应用说明,将固定格式的文件数据导入到数据库中
oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...
oracle sqlldr多文件批量导入
涉及sqlldr的参数说明和常见应用
用的是11.2.0.4的Instant Client,Oracle没给sqlldr,Tools里面也没有(12C就有)。 网上下载了几个都是11.2.0.1的sqlldr,包括标了版本号的,都需要替换库文件。 这个是自己安装p13390677_112040_Linux-x86-64_4of7...
主要用于sqlldr,里面有例子的代码,可以参考
1. sqlldr简介 3 2. sqlldr结构 4 2.1. sqlldr结构图 4 2.2. sqlldr功能描述 5 2.3. 命令结构 6 2.3.1. 程序参数 6 2.4. 控制文件 8 2.4.1. 控制文件语法 8 2.4.2. 控制文件结构说明 9 2.5. 数据文件 11 2.5.1. 数据...
sqlldr配置文件详解 python脚本根据csv文件批量生成sqlldr传输所需ctl文件和sqlldr脚本, 修改参数为自己本机配置后,运行脚本,复制输出结果到cmd下,直接运行即可批量将excel文件内容传输至指定Oracle表格中。 ...
oracle sqlldr导入带有自动增加的数据实例
oracle最强大的sqlldr上传工具
利用oracle的sqlldr功能可添加控制规则的导入数据
Oracle SQLLDR介绍及基于SQLLDR的数据库同步系统实现,刘苑琦,邹仕洪,SQL*Loader是Oracle数据库系统提供的一个高速批量数据加载工具,它可以在极短的时间内加载数量庞大的数据,可以直接被前端应用程序调��
sqlldr报超出字符长度错误,可以参考的好资料。
在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...
SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)
oracle 11.2客户端(linux) sqlldr相关文件 如果oracle客户端用的是rpm方式安装: sqlldr命令放在bin 其他文件放在lib 如果oracle客户端用的是直接解压方式: 所有都放在根目录即可
oracle11g基本客户端,主要是用于windows环境下sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...
oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...
利用sqlldr大量数据导入,方便,快速
windowns下利用bat命令+oracle的sqlldr功能导入数据,导入速度很快