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 '"',指的是双引号内按字符串处理