SQL*Loader使用介绍
今天学习一下使用SQL*Loader导入数据的方法。首先看一下对于SQLLDR命令的介绍:
1、SQL*Loader的基本特点:
01. 能装入不同数据类型文件及多个数据文件的数据
02. 可装入固定格式、自由定界以及可度长格式的数据
03. 可以装入二进制,压缩十进制数据
04. 一次可对多个表装入数据
05. 连接多个物理记录装到一个记录中
06. 对一单记录分解再装入到表中
07. 可以用 数对制定列生成唯一的Key
08. 可对磁盘或磁带数据文件装入制表中
09. 提供装入错误报告
10. 可以将文件中的整型字符串,自动转成压缩十进制并装入列表中。
2、SQL*Loader各类文件说明:
① 控制文件
SQL*Loader根据控制文件找到需要加载的数据,并且分析和解释这些数据。控制文件由三个部分组成:
01.
全局选件、行、跳过的记录数等;
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开始执行后,它就自动建立日志文件。
日志文件包含有加载的总结,加载中的错误信息等。
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]
说明:
①要加载的数据文件:
01.INFILE和INDDN是同义词,它们后面都是要加载的数据文件;如果用 * 则表示数据就在控制文件内;在INFILE后可以跟几个文件;
02.STRAM表示一次读一个字节的数据。新行代表新物理记录(逻辑记录可由几个物理记录组成);
03.RECORD使用宿主操作系统文件及记录管理系统。如果数据在控制文件中则使用这种方法;
0
4.FIXED length要读的记录长度为length字节;
05.VARIABLE 被读的记录中前两个字节包含的长度,length记录可能的长度。缺省为8k字节;
06.BADFILE和BADDN同义,存放Oracle不能加载数据到数据库的那些记录;
07.DISCARDFILE和DISCARDDN是同义词,记录没有通过的数据;
0
8.DISCARDS和DISCARDMAX是同义词,Integer为最大放弃的文件个数。
② 加载的方法:
01.APPEND 给表添加行
02.INSERT 给空表增加行(如果表中有记录则退出)
03.REPLACE 先清空表在加载数据
04.RECLEN 用于两种情况:
1> SQLLDR不能自动计算记录长度
2> 或用户想看坏文件的完整记录时(Oracle只能按常规把坏记录部分写到错误的地方,如果看整条记录,则可以将整条记录写到坏文件中)
③ 指定最大的记录长度:
CONCATENATE允许用户设定一个整数,表示要组合逻辑记录的数目。
④建立逻辑记录:
01. THIS 检查当前记录条件,如果为真则连接下一个记录。
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)='*'
⑥介绍并括起记录中的字段:
FIELDS给出记录中字段的分隔符,FIELDS格式为:
FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
[[OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
01. TERMINATED:读完前一个字段即开始读下一个字段直到结束。
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])
DOUBLE:双精度符点二进制
格式:DOUBLE
FLOAT:普通浮点二进制
格式:FLOAT
FLOAT EXTERNAL:字符格式浮点数
格式:FLOAT EXTERNAL [(length)] [delimiter]
GRAPHIC:双字节字符串数据
格式:GRAPHIC [(legth)]
GRAPHIC EXTERNAL:双字节字符串数据
格式:GRAPHIC EXTERNAL[(legth)]
INTEGER:常规全字二进制整数
INTEGER EXTERNAL:字符格式整数
SMALLINT:常规全字二进制数据
VARCHAR:可变长度字符串
VARGRAPHIC:可变双字节字符串数据
4、
数据文件的内容
数据文件可以是在OS下的一个文件;或跟在控制文件下的具体数据。数据文件可以是:
01. 二进制与字符格式:SQL*Loader可以把二进制文件读(当成字符读)到列表中;
02. 固定格式:记录中的数据、数据类型、数据长度固定;
03. 可变格式:每个记录至少有一个可变长数据字段,一个记录可以是一个连续的字符串;
04. 数据段的分界(如姓名、年龄)如用','作字段的划分;用'"'作数据括号等;
05. SQL*Loader可以使用多个连续字段的物理记录组成一个逻辑记录,记录文件运行情况文件,包括以下内容:
1、运行日期、软件版本号
2、全部输入、输出文件名;对命令行的展示信息、补充信息,
3、对每个装入信息报告:如表名,装入情况;对初始装入、加截或更新装入的选择情况
4、数据错误报告:错误码;放弃记录报告
5、每个装X报告:装入行、装入行数、可能跳过行数、可能拒绝行数、可能放弃行数等
6、统计概要:使用空间(包大小、长度)、读入记录数、装入记录数、跳过记录数;拒绝记录数、放弃记录数;运行时间等。
5、SQLLDR的命令:
基本看最最上面的那个图就OK了,随便举个例子:
需要注意的是:最好先转到相应目录下面在执行操作,另外可以对远程数据库进行操作!
总结:实在没有太多的时间去仔细研究文档,所以直接找了网上一篇记载得比较详细的文章,粗略的看了一遍,修改了一下格式,文章错误的地方有很多,没有看明白的地方也有很多,不过总得来说,SQL*Loader的实际应用还是相对比较简单的,下一篇打算找一些实例加深一下了解,具体的参数可参见Oracle的官方文档 《Utilities》
说完!