一,sqlldr的参数
C:\Users\cj>sqlldr
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 10:19:56 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE 用户名/口令
control -- 控制文件名
log -- 日志文件名
bad -- 错误文件名
data -- 数据文件名
discard -- 废弃文件名
discardmax -- 允许废弃的文件的数目 (全部默认)
skip -- 要跳过的逻辑记录的数目 (默认 0)
load -- 要加载的逻辑记录的数目 (全部默认)
errors -- 允许的错误的数目 (默认 50)
rows -- 常规路径绑定数组中或直接路径保存数据间的行数
(默认: 常规路径 64, 所有直接路径)
bindsize -- 常规路径绑定数组的大小 (以字节计) (默认 256000)
silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
direct -- 使用直接路径 (默认 FALSE)
parfile -- 参数文件: 包含参数说明的文件的名称
parallel -- 执行并行加载 (默认 FALSE)
file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区 (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行 (默认 FALSE)
readsize -- 读取缓冲区的大小 (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE (默认 NO
T_USED)
columnarrayrows -- 直接路径列数组的行数 (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000)
multithreading -- 在直接路径中使用多线程
resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载 (默认 FALSE)
PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlldr
scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
userid=scott/tiger'。位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
允许 'sqlldr scott/tiger control=foo logfile=log', 但是
不允许 'sqlldr scott/tiger control=foo log', 即使
参数 'log' 的位置正确。
后面将会解释一般常用的参数,一般难用到的就不详说了。
二,控制文件语法
控制文件语法格式
OPTIONS({[SKIP=integer][LOAD=integer]})
[ERRORS=integer][ROWS=integer]
[BINDSIZE=integer][SILENT=(ALL|FEEDBACK|ERROR|DISCARD)]
LOAD[DATA]
[{INFILE|INDDN}{FILE|*} --infile,inddn是同义词。他们后面是要加载的数据文件地址,
*代表数据文件在控制文件中,如infile *
infile 'e:/app/sqlldr/test1.txt'代表的是数据文件地址
{STREAM|RECORD|FIXED length[BLOCKSIZE size]}--STREAM表示一次读一个字节的数据,
--RECOED表示宿主操作系统文件及记录管理体统?
--FIXED length表示要读的记录长度 length字节
VARIABLE [length] --被读的记录中前两个字节包含的长度,length记录可能的长 度。默认为8k
[{BADFILE|BADDN} file] --两者为同义词oralce不能加载数据到数据库的那些记录
{DISCARDS|DISCARDMAX} integer] --两者为同义词记录,integer为最大放弃的文件个数
[{INDDN|INFILE}...]
[APPEND|REPLACE|INSERT] --加载方法,默认为insert为默认加载方法,只有在表为空时候才能加载
--append 在表已有基础数据上加载新的数据
--replace 清空加载之前的所有数据,再加载新的数据
--truncate 同replace
[RECLENT integer]
[{CONCATENATE integer|
CONTINUEIF{THIS|NEXT}{start[:end]}LAST}
operator{'string'|X'hex'}]
INTO TABLE [user.]table
[APPEND|REPLACE|INSERT]
[WHEN condition [ADN condition]...] --可以根据判断条件对数据进行操作
[FIELDS[delimiter]]
(
column{
RECNUM|CONSTANT value|
SEQUENCE({integer|MAX|COUNT}[,increment])|
[POSITION({start[end]*[+integer]})]
datatype
[TERMINATED [BY] {WHITESPACE|[X]'character'}] --数据之间的分隔符
[[OPTIONALLY]ENCLOSE [BY] [X]'character'] --表示数据由特殊字符括起来
[NULLIF condition]
[DEFAULTIF condition]
})
[into table]
[begindata]
三,日志文件
日志文件会记录sqlldr使用过程中的统计信息。
四,简单的用法
首先create ldr_test 作为存储加载数据的表
SQL> create table ldr_test(name varchar2(10),job varchar2(10),age int);
4.1加载数据间有分隔符的,如“,”,“ ”
数据文件#ldr_test1.dat
zhangsan,student,16
lisi,teacher,24
wangwu,student,21
控制文件#ldr_test1.ctl
load data
infile 'e:/app/sqlldr/ldr_test1.dat'
insert into table ldr_test
fields terminated by ","
(name,job,age)
在e:/app/sqlldr/ 下建立日志文件ldr_test1.log
现在可以在dos执行:
C:\Users\cj>sqlldr admin/admin control=e:/app/sqlldr/ldr_test1.ctl,log=e:/app/sq
lldr/ldr_test1.log
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 13:28:48 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
达到提交点 - 逻辑记录计数 2
达到提交点 - 逻辑记录计数 3
看下日志文件
C:\Users\cj>
C:\Users\cj>type 'e:/app/sqlldr/ldr_test1.log'
命令语法不正确。
C:\Users\cj>type E:\app\sqlldr\ldr_test1.log
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 13:28:48 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
控制文件: e:/app/sqlldr/ldr_test1.ctl
数据文件: e:/app/sqlldr/ldr_test1.dat
错误文件: e:/app/sqlldr/ldr_test1.bad
废弃文件: 未作指定
(可废弃所有记录)
要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续: 未作指定
所用路径: 常规
表 LDR_TEST,已加载从每个逻辑记录
插入选项对此表 INSERT 生效
列名 位置 长度 中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
NAME FIRST * , CHARACTER
JOB NEXT * , CHARACTER
AGE NEXT * , CHARACTER
表 LDR_TEST:
3 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
为绑定数组分配的空间: 49536 字节 (64 行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 3
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
从 星期三 10月 16 13:28:48 2013 开始运行
在 星期三 10月 16 13:28:49 2013 处运行结束
经过时间为: 00: 00: 01.25
CPU 时间为: 00: 00: 00.08
进到admin用户看下ldr_test表
SQL> select * from ldr_test;
NAME JOB AGE
-------------------- -------------------- ----------
zhangsan student 16
lisi teacher 24
wangwu student 21
注意,如果数据中存在“zhangsan”,“student”这样被特殊符号括起来的,可以在控制文件fields terminated by ","后加
optionally enclosed by '"'
4.2如果数据文件的列比要导入的目的表列少则可以通过修改控制文件来实现
for instance 现在表ldr_test有四个列,name,job,age,sex,而数据文件只有前三列
以控制文件#ldr_test1.ctl为例修改为:
load data
infile 'e:/app/sqlldr/ldr_test2.dat'
replace into table ldr_test
(name position(1:7),
job position(8:15),
age position(16:20),
telephone "0"
)
SQL> select * from ldr_test;
NAME JOB AGE TELEPHONE
-------------------- -------------------- ---------- ----------
xiaoqi student 16 0
bawei teacher 24 0
jiuwei student 21 0
这样就把数据文件缺少的列添加进来了。
4.3多个数据文件导入到同一张表,就是使用多个INFILE ‘地址’
4.4如果是CLOB字节的数据,在控制文件中用LOBFILE(filename) terminater by eof
4.5字段中存在空值,加上trailing nullcols
4.6优化从的几个参数考虑,1.steamsize,2.direct,3.rows
C:\Users\cj>sqlldr
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 10:19:56 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE 用户名/口令
control -- 控制文件名
log -- 日志文件名
bad -- 错误文件名
data -- 数据文件名
discard -- 废弃文件名
discardmax -- 允许废弃的文件的数目 (全部默认)
skip -- 要跳过的逻辑记录的数目 (默认 0)
load -- 要加载的逻辑记录的数目 (全部默认)
errors -- 允许的错误的数目 (默认 50)
rows -- 常规路径绑定数组中或直接路径保存数据间的行数
(默认: 常规路径 64, 所有直接路径)
bindsize -- 常规路径绑定数组的大小 (以字节计) (默认 256000)
silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
direct -- 使用直接路径 (默认 FALSE)
parfile -- 参数文件: 包含参数说明的文件的名称
parallel -- 执行并行加载 (默认 FALSE)
file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区 (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行 (默认 FALSE)
readsize -- 读取缓冲区的大小 (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE (默认 NO
T_USED)
columnarrayrows -- 直接路径列数组的行数 (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000)
multithreading -- 在直接路径中使用多线程
resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载 (默认 FALSE)
PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlldr
scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
userid=scott/tiger'。位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
允许 'sqlldr scott/tiger control=foo logfile=log', 但是
不允许 'sqlldr scott/tiger control=foo log', 即使
参数 'log' 的位置正确。
后面将会解释一般常用的参数,一般难用到的就不详说了。
二,控制文件语法
控制文件语法格式
OPTIONS({[SKIP=integer][LOAD=integer]})
[ERRORS=integer][ROWS=integer]
[BINDSIZE=integer][SILENT=(ALL|FEEDBACK|ERROR|DISCARD)]
LOAD[DATA]
[{INFILE|INDDN}{FILE|*} --infile,inddn是同义词。他们后面是要加载的数据文件地址,
*代表数据文件在控制文件中,如infile *
infile 'e:/app/sqlldr/test1.txt'代表的是数据文件地址
{STREAM|RECORD|FIXED length[BLOCKSIZE size]}--STREAM表示一次读一个字节的数据,
--RECOED表示宿主操作系统文件及记录管理体统?
--FIXED length表示要读的记录长度 length字节
VARIABLE [length] --被读的记录中前两个字节包含的长度,length记录可能的长 度。默认为8k
[{BADFILE|BADDN} file] --两者为同义词oralce不能加载数据到数据库的那些记录
{DISCARDS|DISCARDMAX} integer] --两者为同义词记录,integer为最大放弃的文件个数
[{INDDN|INFILE}...]
[APPEND|REPLACE|INSERT] --加载方法,默认为insert为默认加载方法,只有在表为空时候才能加载
--append 在表已有基础数据上加载新的数据
--replace 清空加载之前的所有数据,再加载新的数据
--truncate 同replace
[RECLENT integer]
[{CONCATENATE integer|
CONTINUEIF{THIS|NEXT}{start[:end]}LAST}
operator{'string'|X'hex'}]
INTO TABLE [user.]table
[APPEND|REPLACE|INSERT]
[WHEN condition [ADN condition]...] --可以根据判断条件对数据进行操作
[FIELDS[delimiter]]
(
column{
RECNUM|CONSTANT value|
SEQUENCE({integer|MAX|COUNT}[,increment])|
[POSITION({start[end]*[+integer]})]
datatype
[TERMINATED [BY] {WHITESPACE|[X]'character'}] --数据之间的分隔符
[[OPTIONALLY]ENCLOSE [BY] [X]'character'] --表示数据由特殊字符括起来
[NULLIF condition]
[DEFAULTIF condition]
})
[into table]
[begindata]
三,日志文件
日志文件会记录sqlldr使用过程中的统计信息。
四,简单的用法
首先create ldr_test 作为存储加载数据的表
SQL> create table ldr_test(name varchar2(10),job varchar2(10),age int);
4.1加载数据间有分隔符的,如“,”,“ ”
数据文件#ldr_test1.dat
zhangsan,student,16
lisi,teacher,24
wangwu,student,21
控制文件#ldr_test1.ctl
load data
infile 'e:/app/sqlldr/ldr_test1.dat'
insert into table ldr_test
fields terminated by ","
(name,job,age)
在e:/app/sqlldr/ 下建立日志文件ldr_test1.log
现在可以在dos执行:
C:\Users\cj>sqlldr admin/admin control=e:/app/sqlldr/ldr_test1.ctl,log=e:/app/sq
lldr/ldr_test1.log
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 13:28:48 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
达到提交点 - 逻辑记录计数 2
达到提交点 - 逻辑记录计数 3
看下日志文件
C:\Users\cj>
C:\Users\cj>type 'e:/app/sqlldr/ldr_test1.log'
命令语法不正确。
C:\Users\cj>type E:\app\sqlldr\ldr_test1.log
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 10月 16 13:28:48 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
控制文件: e:/app/sqlldr/ldr_test1.ctl
数据文件: e:/app/sqlldr/ldr_test1.dat
错误文件: e:/app/sqlldr/ldr_test1.bad
废弃文件: 未作指定
(可废弃所有记录)
要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续: 未作指定
所用路径: 常规
表 LDR_TEST,已加载从每个逻辑记录
插入选项对此表 INSERT 生效
列名 位置 长度 中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
NAME FIRST * , CHARACTER
JOB NEXT * , CHARACTER
AGE NEXT * , CHARACTER
表 LDR_TEST:
3 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
为绑定数组分配的空间: 49536 字节 (64 行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 3
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
从 星期三 10月 16 13:28:48 2013 开始运行
在 星期三 10月 16 13:28:49 2013 处运行结束
经过时间为: 00: 00: 01.25
CPU 时间为: 00: 00: 00.08
进到admin用户看下ldr_test表
SQL> select * from ldr_test;
NAME JOB AGE
-------------------- -------------------- ----------
zhangsan student 16
lisi teacher 24
wangwu student 21
注意,如果数据中存在“zhangsan”,“student”这样被特殊符号括起来的,可以在控制文件fields terminated by ","后加
optionally enclosed by '"'
4.2如果数据文件的列比要导入的目的表列少则可以通过修改控制文件来实现
for instance 现在表ldr_test有四个列,name,job,age,sex,而数据文件只有前三列
以控制文件#ldr_test1.ctl为例修改为:
load data
infile 'e:/app/sqlldr/ldr_test2.dat'
replace into table ldr_test
(name position(1:7),
job position(8:15),
age position(16:20),
telephone "0"
)
SQL> select * from ldr_test;
NAME JOB AGE TELEPHONE
-------------------- -------------------- ---------- ----------
xiaoqi student 16 0
bawei teacher 24 0
jiuwei student 21 0
这样就把数据文件缺少的列添加进来了。
4.3多个数据文件导入到同一张表,就是使用多个INFILE ‘地址’
4.4如果是CLOB字节的数据,在控制文件中用LOBFILE(filename) terminater by eof
4.5字段中存在空值,加上trailing nullcols
4.6优化从的几个参数考虑,1.steamsize,2.direct,3.rows
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26844646/viewspace-774495/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26844646/viewspace-774495/