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》
				
		
		
				
				 
		
				
						    说完!