sql loader的特点
1通过网络加载数据,意味着你可以在不同于服务端操作系统上的客户端运行sql loader
2在同一个加载会话中加载不同的数据文件
3在同一个加载会话中加载到不同表中
4指定数据的字符集
5有选择的加载数据
6在加载前,使用sql操纵数据
7在特定的列生成唯一顺序值
8使用操纵系统的文件系统访问数据文件
9从磁盘,磁带,或命名管道中加载
10生成精确地错误报告,有助于troubleshooting
11加载任意负载面向对象的数据
12对lobs和集合使用二级数据文件
13使用常规或直接路径加载,常规方式灵活,直接路径方式效率高
一个典型的会话有一个输入控制文件,控制sql loader的行为,还有一个或多个输入数据文件,输出时一个log file,bad file 和discard file
参数
参数可以放到一个文件件,使用parfile参数调用
也可以使用options在控制文件中指定特定参数
在命令行中的参数会覆盖参数文件及option的参数
控制文件
控制文件告诉去哪找数据,怎么解析和翻译数据,插入到哪里等。控制文件有三部分组成
1第一部分包含会话级别的信息,例如:
bindsize,rows,records to skip
infile指定输入数据在哪里
2第二部分包含了了更多了into table块,每一个块包含了要加载的数据的信息,像是表名和表列
3第三部分是可选的,如果有,就是包含的输入数据。
一些控制文件的语法
1语法是自由格式的
2大小写不敏感
3表名和列名不要包含constant和zone
4控制文件中的注释是两个中横线
输入数据和数据文件
sqlloader在控制文件中指定的文件中读取数据,在数据文件中的数据是以记录的方式来组织的,一个特定的数据文件可以使固定的记录格式,可变的记录格式,或是流记录格式,记录的格式可以再控制文件的infile参数中指定,如果没有记录格式指定,默认的就是流记录格式。
固定格式,记录的长度都是定长的。例子
控制文件中的内容:
load data
infile 'example.dat' "fix 11"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1, col2)
example.dat:
001, cd, 0002,fghi,
00003,lmn,
1, pqrs,
0005,uvwx,
sqlldr test/test control=D:\load.ctl
SQL> select * from example;
COL1 COL2
----------- -----------
001 cd
0002 fghi
00003 lmn
1 pqrs
0005 uvwx
变长记录,infile "datafile_name" "var n",n指定了记录的前n个字节是记录的长度(长度控制数),如果n没有被指定,默认是5字节,n大于40会报错,注意n是记录的长度,分割符数量也算进来了,但是在插入的时候不会插入分隔符,terminated by标识了字段的分割符,例子
控制文件
load data
infile 'D:\load.dat' "var 3"
into table load
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
col2 char(7))
数据文件
009hello,cd,010world,im
012my,name is,,
SQL> desc load;
名称 是否为空? 类型
----------------------------------------- -------- ----------
COL1 CHAR(5)
COL2 CHAR(7)
SQL> select * from load;
COL1 COL2
----- -------
hello cd
world im
my name is
lobfiles和secondary datafiles
lob数据从logfile中加载,lob data仍然是被分域的,但是这些域不是被组织成记录,所以处理记录的开销就避免了。比如,你可以从主数据文件中读取名字,id,然后从lobfile中读取简历。你也可以再lobfile中加载xml数据,可以使用xml列来保存结构化模型数据。
secondary datafile就和主数据文件时一样的,包含一系列记录,每个记录有多个域组成,使用sdf参数指定该类型文件,sdf可以使具体的字符串,或是一个映射的包含多个具体字符串的filler域。
数据转换与数据类型
在常规的路径加载中,数据域被转换成列,有如下两步:
1用控制文件翻译数据文件的格式,解析输入数据,操作符合insert语句的数组
2数据接收数据执行insert命令
常规路径加载,直接路径加载,和外部表加载
常规路径加载,数据被拷贝到相应的绑定数组中,当数组满了就执行insert
直接路径加载,根据域的规格解析输入,转换输入数据成列类型,构造一个列数组,列数组被传输到块格式化器,在数据库中创建数据块,被格式化的数据直接写到数据库中,绕开了很多数据处理步骤,所以效率要高。
并行直接路径加载,这个可以开多个会话并发加载数据段。
外部表,使用外部表比常规路径加载及直接路径加载的优势如下:
1外部表加载数据尝试并行加载
2外部表allows在加载数据的时候,修改数据。
外部表不能远程加载。
sqlloader支持4中类型的lob加载
1blob,2clob,3nclob,4bfile
参数;
appned参数知道了在加载数据的时候表是非空的,如果没有这个参数,默认是insert,sqlloader在加载的时候要求表是空表,不是空表就报错
when指明一个或多个域条件,根据这些域条件决定是否加载数据
trailing nullcols告诉sqlloader在记录中没有对应的列设置成空
例如加载的数据如下
10 Accounting
假设控制文件如下
INTO TABLE dept
TRAILING NULLCOLS
( deptno CHAR TERMINATED BY " ",
dname CHAR TERMINATED BY WHITESPACE,
loc CHAR TERMINATED BY WHITESPACE
)
加载后的loc这个字段就是空的。
optionally enclosed by '"',指的是双引号内按字符串处理