SQL Loader是一个将其他数据源转换为Oracle数据库数据的工具(Export/Import转换的只能是Oracle类型的数据源)。
1.工作机制
SQL Loader从控制文件中读取指令,然后根据指令读取数据文件,然后将数据存入Oracle数据库中。所以,SQL Loader至少涉及到两个核心文件——控制文件和数据文件。
控制文件通知SQL Loader数据应放在何处,并描述装入Oracle数据库中的各类数据。
数据文件,是转换过程中的数据源,存放有要进行转换的数据。
所以整个过程为:sqlldr命令——〉读取控制文件——〉读取数据文件——〉根据规则转载数据
2.实例
2.1 sqlldr命令
下面是一个典型的数据转换的命令(在Dos窗口下运行)
sqlldr smith/baby --ID/密码
control = portnoy --控制文件的名称
parrale = true --并行,同时运行多个会话,并同时将数据装入同样的表,但目标表不能索引
direct = true --先将数据载入内存,然后直接拷贝到数据库中
skip = 500 --数据文件的前500条省略
load = 100 --装载1000条
2.2 控制文件
在命令中参数control所对应的即为控制文件portnoy.ctl,其内容如下:
load data --1、控制文件标识
infile 'dataSource.txt' --2、要输入的数据文件名为'dataSource.txt'
append into table targetTable --3、向表targetTable中追加记录,还可以是Insert/Replace/Truncate
when name <> 'Admin' --4、使用when关键字废弃name列值为'Admin'的数据行
(id position(01:8) INTEGER EXTERNAL,
name position(11:24) CHAR,
sex position(26,27) INTEGER EXTERNAL,
birthday postion(28,34) DATE 'YYYYMMDD') -----定义列对应顺序
2.3数据源文件
在控制文件中说明了转换规则,以及数据源名称,数据源名称如下,dataSource.txt
00000001 Taub 1 19980215
00000002 Sandor Penya 0 19480223
00000003 Glickman,Gayle 0 12980205
00000004 Murphy,Ann 0 19790215
3.字段分割的标准
从上面的dataSource可以看出,字段分割是以字段字符位置来截取的,在这种情况下,需要声明字段类型,如portnoy.ctl所定义的。
还有一种情况,如果字段的分割是以特定字符,例如逗号,那么只需要直接列出对应字段即可。下面是另一种字段分割方式下的控制文件和数据源文件。
数据源文件:dataSource2.txt
0001,1996,320,10,4
0001,1997,330,12,7
0002,1997,230,0,3
控制文件:portnoy2.ctl
LOAD DATA
INFILE 'STATS.TXT'
INTO TABLE PLAYER_STATISTICS
WHEN YEAR = "1997"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(player_id,year,batting_average,home_runs,stolen_bases)
4.同时装载到多个表的控制文件的例子
LOAD DATA
INFILE 'MORE_STATS.TXT'
BADFILE 'LOAD3.BAD'
DISCARDFILE 'LOAD3.DSC'
INTO TABLE baseball_player
(player_id POSITION(1:4) INTEGER EXTERNAL,
last_name POSITION(11:17) CHAR,
first_name POSITION(19:23) CHAR)
INTO TABLE player_statistics
(player_id POSITION(1:4) INTEGER EXTERNAL,
year POSITION(6:9) INTEGER EXTERNAL,
batting_average POSITION(25:27) CHAR)
5.其它文件
涉及到的文件还包括坏数据文件(保存没有成功装入数据的记录)、丢弃文件(使用When关键字而废弃的记录)、日子文件。其中需要注意的是坏数据文件:如果为连续的SQL*Loader会话使用同一个控制文件装载,那么进行下一个装载文件之前,必须对bad文件进行处理,因为后面的处理的bad文件的结果会覆盖前面的结果。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/reiskie/archive/2007/05/16/1611945.aspx