Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
SQL*Loader使用介绍
 
 
    今天学习一下使用SQL*Loader导入数据的方法。首先看一下对于SQLLDR命令的介绍:
 
    SQL_Loader
 
 
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了,随便举个例子:
    D:\Test>sqlldr userid=wangxiaoqi/wangxiaoqi@dodo control=sqlldr.ctl
 
    需要注意的是:最好先转到相应目录下面在执行操作,另外可以对远程数据库进行操作!
 
    再具体一点的操作说明可以上该网站: http://www.psoug.org/reference/sqlloader.html
 
 
 
    总结:实在没有太多的时间去仔细研究文档,所以直接找了网上一篇记载得比较详细的文章,粗略的看了一遍,修改了一下格式,文章错误的地方有很多,没有看明白的地方也有很多,不过总得来说,SQL*Loader的实际应用还是相对比较简单的,下一篇打算找一些实例加深一下了解,具体的参数可参见Oracle的官方文档 《Utilities》
 
    说完!
 
 
posted on 2008-12-25 21:57 decode360 阅读(144) 评论(0)  编辑  收藏 所属分类: 10.DB_Tools

只有注册用户登录后才能发表评论。


网站导航: