sql loader

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

你可能感兴趣的:(sqlloader)