SQL*Loader使用介绍
SQL*Loader使用介绍
今天学习一下使用SQL*Loader导入数据的方法。首先看一下对于SQLLDR命令的介绍:
1、SQL*Loader的基本特点:
01. 能装入不同数据类型文件及多个数据文件的数据
02. 可装入固定格式、自由定界以及可度长格式的数据
03. 可以装入二进制,压缩十进制数据
04. 一次可对多个表装入数据
05. 连接多个物理记录装到一个记录中
06. 对一单记录分解再装入到表中
07. 可以用 数对制定列生成唯一的Key
08. 可对磁盘或磁带数据文件装入制表中
09. 提供装入错误报告
10. 可以将文件中的整型字符串,自动转成压缩十进制并装入列表中。
02. 可装入固定格式、自由定界以及可度长格式的数据
03. 可以装入二进制,压缩十进制数据
04. 一次可对多个表装入数据
05. 连接多个物理记录装到一个记录中
06. 对一单记录分解再装入到表中
07. 可以用 数对制定列生成唯一的Key
08. 可对磁盘或磁带数据文件装入制表中
09. 提供装入错误报告
10. 可以将文件中的整型字符串,自动转成压缩十进制并装入列表中。
2、SQL*Loader各类文件说明:
① 控制文件
SQL*Loader根据控制文件找到需要加载的数据,并且分析和解释这些数据。控制文件由三个部分组成:
01. 全局选件、行、跳过的记录数等;
02. INFILE子句指定的输入数据;
03. 数据特性的说明;
02. INFILE子句指定的输入数据;
03. 数据特性的说明;
② 输入文件
需要在控制文件中指定输入文件(INFILE)的格式,具体性质如下:
01. 正常指定文件格式 INFILE 'example.dat'
02. 若导入的数据直接在控制文件中,则用 INFILE * ... BEGINDATA ...
03. 若导入数据在其他文件中,且每条记录定长,则使用 INFILE 'example.dat' "FIX 11"
04. 若导入数据在其他文件中,且每条记录不定长,则使用 INFILE 'example.dat' "VAR 3"
注:长度包括分隔符,具体使用案例见下文
③ 坏文件
坏文件包含那些被SQL*Loader拒绝的记录,被拒绝的记录可能是不符合要求的记录。
坏文件的名字由SQL*Loader命令的BADFILE参数来给定。
坏文件的名字由SQL*Loader命令的BADFILE参数来给定。
④ 日志文件及日志信息
当SQL*Loader开始执行后,它就自动建立日志文件。
日志文件包含有加载的总结,加载中的错误信息等。
3、编写控制文件
OPTIONS
({[SKIP
=
integer] [LOAD = integer]
[ERRORS = integer] [ROWS
=
integer]
[BINDSIZE
=
integer]
[SILENT
=
(ALL|FEEDBACK|ERROR|DISCARD)]
})
LOAD[DATA]
[ { INFILE | INDDN } {file | * } ]
[ STREAM | RECORD | FIXED length [BLOCKSIZE size]| VARIABLE [length] ]
[ {BADFILE | BADDN } file ]
[ {DISCARDS | DISCARDMAX} integr ]
[ {INDDN | INFILE} . . . ]
[ APPEND | REPLACE | INSERT ]
[RECLENT integer]
[ { CONCATENATE integer |
CONTINUEIF { [THIS | NEXT] (start[: end]) LAST }
Operator { 'string' | X 'hex' } } ]
INTO TABLE [user.]table
[APPEND | REPLACE|INSERT]
[WHEN condition [AND 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]'charcter']
[NULLIF condition ]
[DEFAULTIF condotion]
}
[ ,...]
)
[INTO TABLE...]
[BEGINDATA]
LOAD[DATA]
[ { INFILE | INDDN } {file | * } ]
[ STREAM | RECORD | FIXED length [BLOCKSIZE size]| VARIABLE [length] ]
[ {BADFILE | BADDN } file ]
[ {DISCARDS | DISCARDMAX} integr ]
[ {INDDN | INFILE} . . . ]
[ APPEND | REPLACE | INSERT ]
[RECLENT integer]
[ { CONCATENATE integer |
CONTINUEIF { [THIS | NEXT] (start[: end]) LAST }
Operator { 'string' | X 'hex' } } ]
INTO TABLE [user.]table
[APPEND | REPLACE|INSERT]
[WHEN condition [AND 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]'charcter']
[NULLIF condition ]
[DEFAULTIF condotion]
}
[ ,...]
)
[INTO TABLE...]
[BEGINDATA]
说明:
①
要加载的数据文件:
01.INFILE和INDDN是同义词,它们后面都是要加载的数据文件;如果用 * 则表示数据就在控制文件内;在INFILE后可以跟几个文件;
02.STRAM表示一次读一个字节的数据。新行代表新物理记录(逻辑记录可由几个物理记录组成);
03.RECORD使用宿主操作系统文件及记录管理系统。如果数据在控制文件中则使用这种方法;
02.STRAM表示一次读一个字节的数据。新行代表新物理记录(逻辑记录可由几个物理记录组成);
03.RECORD使用宿主操作系统文件及记录管理系统。如果数据在控制文件中则使用这种方法;
0
4.FIXED length要读的记录长度为length字节;
0 5.VARIABLE 被读的记录中前两个字节包含的长度,length记录可能的长度。缺省为8k字节;
0 6.BADFILE和BADDN同义,存放Oracle不能加载数据到数据库的那些记录;
0 7.DISCARDFILE和DISCARDDN是同义词,记录没有通过的数据;
0 5.VARIABLE 被读的记录中前两个字节包含的长度,length记录可能的长度。缺省为8k字节;
0 6.BADFILE和BADDN同义,存放Oracle不能加载数据到数据库的那些记录;
0 7.DISCARDFILE和DISCARDDN是同义词,记录没有通过的数据;
0
8.DISCARDS和DISCARDMAX是同义词,Integer为最大放弃的文件个数。
② 加载的方法:
01.APPEND 给表添加行
02.INSERT 给空表增加行 (如果表中有记录则退出 )
03.REPLACE 先清空表在加载数据
04.RECLEN 用于两种情况 :
02.INSERT 给空表增加行 (如果表中有记录则退出 )
03.REPLACE 先清空表在加载数据
04.RECLEN 用于两种情况 :
1
> SQLLDR不能自动计算记录长度
2
> 或用户想看坏文件的完整记录时
(Oracle只能按常规把坏记录部分写到错误的地方,如果看整条记录,则可以将整条记录写到坏文件中)
③ 指定最大的记录长度:
CONCATENATE允许用户设定一个整数,表示要组合逻辑记录的数目。
④
建立逻辑记录:
01
. THIS 检查当前记录条件,如果为真则连接下一个记录。
02. NEXT 检查下一个记录条件。如果为真,则连接下一个记录到当前记录来。
03. start:end 表示要检查在THIS或NEXT字串是否存在继续串的列,以确定是否进行连接。
02. NEXT 检查下一个记录条件。如果为真,则连接下一个记录到当前记录来。
03. start:end 表示要检查在THIS或NEXT字串是否存在继续串的列,以确定是否进行连接。
如:continueif next(1-3)='WAG' 或
continueif next(1-3)=X'0d03if'
⑤
指定要加载的表:
01
. INTO TABLE 要加的表名。
02 . WHEN 和select WHERE类似。用来检查记录的情况,如:when(3-5)='SSM' and (22)='* '
02 . WHEN 和select WHERE类似。用来检查记录的情况,如:when(3-5)='SSM' and (22)='* '
⑥
介绍并括起记录中的字段:
FIELDS给出记录中字段的分隔符,FIELDS格式为:
FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
[[OPTIONALLY] ENCLOSE [BY] [X] 'charcter' ]
[[OPTIONALLY] ENCLOSE [BY] [X] 'charcter' ]
01. TERMINATED:读完前一个字段即开始读下一个字段直到结束。
02. WHITESPACE:是指结束符是空格的意思。包括空格、Tab、换行符、换页符及回车符。如果是要判断结束字符,可以用单引号括起,如X '1B'等。
03. OPTIONALLY ENCLOSED:表示数据应由特殊字符括起来,也可以括在TERMINATED字符内,使用OPTIONALLY要同时用TERMINLATED。
04. ENCLOSED:指两个分界符内的数据。如果同时用 ENCLOSED和TERMINAED ,则它们的顺序决定计算的顺序。
02. WHITESPACE:是指结束符是空格的意思。包括空格、Tab、换行符、换页符及回车符。如果是要判断结束字符,可以用单引号括起,如X '1B'等。
03. OPTIONALLY ENCLOSED:表示数据应由特殊字符括起来,也可以括在TERMINATED字符内,使用OPTIONALLY要同时用TERMINLATED。
04. ENCLOSED:指两个分界符内的数据。如果同时用 ENCLOSED和TERMINAED ,则它们的顺序决定计算的顺序。
[X]算法 select utl_raw.cast_to_raw('gdj3') from dual;
⑦
定义列:
column是表列名,列的取值可以是:
01. BECHUM 表示逻辑记录数。第一个记录为1,第2个记录为2。
02. CONSTANT 表示赋予常数。
03. SEQUENCE 表示序列可以从任意序号开始,格式为:
SEQUENCE ( { integer | MAX |COUNT} [,increment]
04. POSITION 给出列在逻辑记录中的位置。可以是绝对的,或相对前一列的值。格式为:
POSITION ( {start[end] | * [+integer] } )
05. Start 开始位置
* 表示前字段之后立刻开始。
+ 从前列开始向后条的位置数。
⑧
定义数据类型:
可以定义14种数据类型:
CHAR:字符类型数据,length缺省为1
格式:CHAR
[(length)] [delimiter]
DATE:日期类型数据,使用to_date函数来限制
格式:DATE [(length)]['date_format'] [delimiter]
DECIMAL EXTERNAL:字符格式中的十进制,用于常规格式的十进制数
格式:DECIMAL EXTERNAL [(length)] [delimiter]
DECIMAL:压缩十进制格式数据
格式:DECIMAL (digtial [,divcision])
格式:DECIMAL (digtial [,divcision])
DOUBLE:双精度符点二进制
格式:DOUBLE
FLOAT:普通浮点二进制
格式:FLOAT
FLOAT EXTERNAL:字符格式浮点数
格式:FLOAT EXTERNAL [(length)] [delimiter]
GRAPHIC:双字节字符串数据
格式:GRAPHIC [(legth)]
格式:GRAPHIC [(legth)]
GRAPHIC EXTERNAL:双字节字符串数据
格式:GRAPHIC EXTERNAL[(legth)]
INTEGER:常规全字二进制整数
INTEGER EXTERNAL:字符格式整数
SMALLINT:常规全字二进制数据
VARCHAR:可变长度字符串
VARGRAPHIC:可变双字节字符串数据
4、
数据文件的内容
数据文件可以是在OS下的一个文件;或跟在控制文件下的具体数据。数据文件可以是:
01. 二进制与字符格式:SQL*Loader可以把二进制文件读
(当成字符读
)到列表中;
02. 固定格式:记录中的数据、数据类型、数据长度固定;
03. 可变格式:每个记录至少有一个可变长数据字段,一个记录可以是一个连续的字符串;
02. 固定格式:记录中的数据、数据类型、数据长度固定;
03. 可变格式:每个记录至少有一个可变长数据字段,一个记录可以是一个连续的字符串;
04. 数据段的分界(如姓名、年龄)如用
','作字段的划分;用
'
"
'作数据括号等
;
05. SQL*Loader可以使用多个连续字段的物理记录组成一个逻辑记录,记录文件运行情况文件,包括以下内容:
1、运行日期、软件版本号
2、全部输入、输出文件名;对命令行的展示信息、补充信息,
3、对每个装入信息报告:如表名,装入情况;对初始装入、加截或更新装入的选择情况
4、数据错误报告:错误码;放弃记录报告
5、每个装X报告:装入行、装入行数、可能跳过行数、可能拒绝行数、可能放弃行数等
6、统计概要:使用空间 (包大小、长度 )、读入记录数、装入记录数、跳过记录数;拒绝记录数、放弃记录数;运行时间等。
05. SQL*Loader可以使用多个连续字段的物理记录组成一个逻辑记录,记录文件运行情况文件,包括以下内容:
1、运行日期、软件版本号
2、全部输入、输出文件名;对命令行的展示信息、补充信息,
3、对每个装入信息报告:如表名,装入情况;对初始装入、加截或更新装入的选择情况
4、数据错误报告:错误码;放弃记录报告
5、每个装X报告:装入行、装入行数、可能跳过行数、可能拒绝行数、可能放弃行数等
6、统计概要:使用空间 (包大小、长度 )、读入记录数、装入记录数、跳过记录数;拒绝记录数、放弃记录数;运行时间等。
5、SQLLDR的命令:
基本看最最上面的那个图就OK了,随便举个例子:
D:\Test>sqlldr userid=
wangxiaoqi/
wangxiaoqi@
dodo control=sqlldr.ctl
需要注意的是:最好先转到相应目录下面在执行操作,另外可以对远程数据库进行操作!
再具体一点的操作说明可以上该网站: http://www.psoug.org/reference/sqlloader.html
总结:实在没有太多的时间去仔细研究文档,所以直接找了网上一篇记载得比较详细的文章,粗略的看了一遍,修改了一下格式,文章错误的地方有很多,没有看明白的地方也有很多,不过总得来说,SQL*Loader的实际应用还是相对比较简单的,下一篇打算找一些实例加深一下了解,具体的参数可参见
Oracle的官方文档 《Utilities》
说完!