控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置、数据的格式、以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件。sql
在上一篇中咱们讲过命令行参数能够配置在三个地方,其中一个就是可使用控制文件的OPTIONS字句(这也是最经常使用的方式),以下所示:数据库
OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) )
更多的命令行参数,请见上一篇。spa
使用INFILE能够配置一个或多个数据文件,其语法以下:操作系统
若是数据包含在控制文件自己,则用*表示,如:.net
INFILE *在控制文件的末尾,以BEGINDATA开头,后面接数据:
BEGINDATA data
若是你有多个数据文件怎么办?很简单,只要多个INFILE便可,并且还能够为每一个INFILE指定各自的错误文件和丢弃文件等,以下所示:命令行
INFILE mydat1.dat BADFILE mydat1.bad DISCARDFILE mydat1.dis INFILE mydat2.dat INFILE mydat3.dat DISCARDFILE mydat3.dis INFILE mydat4.dat DISCARDMAX 10 0
CHARACTERSET char_set_name若是没有设置CHARACTERSET参数,数据文件的字符集由操做系统的NLS_LANG设置。
还有一种字符集要特别注意,就是控制文件自己的字符集(只能由NLS_LANG设置),若是控制文件的字符集和数据文件的不同,会先转换成数据文件的字符集,但这样很容易出错(特别是分隔符),所以,实际使用中为了方便,通常把NLS_LANG,CHARACTERSET(若是有的话)设成和数据库字符集同样。code
默认状况下,SQL*Loader是以INSERT方式加载数据,目标表必须是空表,不然会报错;blog
若是目标表为非空表,则必须指定以下的三种方式之一:教程
1. APPEND:添加数据至源数据的后面ip
2. REPLACE:在添加数据以前,先执行DELETE FROM TABLE把表清空,注意:这里的REPLACE是表级别的替代,而不是行级别
3. TRUNCATE:在添加数据以前,先执行TRUNCATE TABLE table_name REUSE STORAGE
从上面咱们能够知道,SQL*Loader不支持对已存在的行更新,若是你想更新已存在的行,则必须先把数据加载至一个空的中间表,而后在原表和中间表进行关联update
若是你想把记录插入到多个表中,可使用多个INTO TABLE,举个例子:
1 50 Manufacturing — DEPT record 2 1119 Smith 50 — EMP record 2 1120 Snyder 50 1 60 Shipping 2 1121 Stevens 60
INTO TABLE dept WHEN recid = 1 (recid FILLER POSITION(1:1) INTEGER EXTERNAL, deptno POSITION(3:4) INTEGER EXTERNAL, dname POSITION(8:21) CHAR) INTO TABLE emp WHEN recid <> 1 (recid FILLER POSITION(1:1) INTEGER EXTERNAL, empno POSITION(3:6) INTEGER EXTERNAL, ename POSITION(8:17) CHAR, deptno POSITION(19:20) INTEGER EXTERNAL)
WHEN (deptno = '10') AND (job = 'SALES')
若是全部的字段分隔符都同样,能够设置一个默认的分隔符,其语法以下:
下面是一个例子:
FIELDS TERMINATED BY WHITESPACE
若是数据文件中记录的列少于目标表的列,最好用NULL代替,不然会报错,以下所示:
INTO TABLE dept TRAILING NULLCOLS ( deptno CHAR TERMINATED BY " ", dname CHAR TERMINATED BY WHITESPACE, loc CHAR TERMINATED BY WHITESPACE )记录格式以下:
10 Accounting对于如上的这条记录,loc列的值为NULL。
下面是一个控制文件的例子:
[Oracle] SQL*Loader 详细使用教程(4)- 字段列表