本文针对SQL*Loader控制文件进行说明。
一:SQL*Loader控制文件的内容
SQL*Loader控制文件使用DDL命令来控制SQL*Loader会话的以下项目:
●使用SQL*Loader导入数据的位置
●数据格式设定方法
●导入数据时SQL*Loader的设定。(内存管理、被拒绝记录、导入处理的中断等)
●导入时数据的处理方法
控制文件例:emp.ctl
OPTIONS(LOAD=100,SKIP=1,ERRORS=-1,ROWS=10)
LOAD DATA
INFILE 'data/emp.csv'
BADFILE 'emp.bad'
APPEND
INTO TABLE EMP
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
)
内容说明:
书写命令的顺序基本是固定的,命令说明见下图
KeyWord 说明 备考
------- --------------------------------------- ---------------------------------
OPTION 传递给SQL*Loader的参数可在控制文件中指定
LOAD:导入的记录条数 -1时,全部
SKIP:跳过的记录条数 -1时,4294967295(0xffffffff)
ERRORS:允许错误条数 -1时,全部
ROWS:每几条记录进行一次COMMIT -1时,4294967295(0xffffffff)
------- --------------------------------------- ---------------------------------
LOAD DATA 约定记号(导入数据)
------- --------------------------------------- ---------------------------------
CHARACTERSET 指定文字码
--------------------------------------------------------------------------------------------
INFILE 指定数据文件。如含有导入数据的CSV文件。 执行sql*loader时的在路径的相对路径
多个文件指定可能。 或绝对路径
------- --------------------------------------- ---------------------------------
BADFILE 无法导入的错误数据写到此文件
------- --------------------------------------- ---------------------------------
DISCARDFILE 使用WHEN指定的导入对象外数据写到此文件
--------------------------------------------------------------------------------------------
(导入模式)
INSERT INSERT:向空表中插入新数据 必须使用空表。表中有数据则出错
APPEND APPEND:向表中追加数据 表中已有数据时,不插入重复数据
REPLACE REPLACE: 删除表中数据后导入新数据 删除操作:delete
TRUNCATE TRUNCATE:删除表中数据后导入新数据 删除操作:truncate
-------------------------------------------------------------------------------------------
INTO TABLE 指定要插入数据的表 可指定复数个
------- --------------------------------------- ---------------------------------
WHEN 指定输入数据的条件 1.类似WHERE语句。但只能使用=,<>(!=),and
2.不合条件的数据(废弃)写到指定废弃文件
3.例:[WHEN 列名=值]
[WHEN (列名!=值) AND (列名<>值)]
[WHEN (位数)=值]
如[WHEN (1)='ABC']
→行的第一位开始为"ABC"的数据
------- --------------------------------------- ---------------------------------
FIELDS 可变长时,指定项目的区别方法:
TERMINATED BY:指定数据项的间隔符 逗号间隔→ [TERMINATED BY ","]
TAB符间隔→[TERMINATED BY X'09']
OPTIONALLY ENCLOSED BY:
指定用来封闭数据项的字符 如指定数据项用双引号引起来
→「OPTIONALLY ENCLOSED BY '"'」
------- --------------------------------------- ---------------------------------
TRAILING
NULLCOLS 对应数据项没有值时插入NULL
------- --------------------------------------- ---------------------------------
(项目) 导入数据的表的名项目名
------- --------------------------------------- ---------------------------------
控制文件中的--开始的行是注释。
二:数据文件 (要导入的数据)
数据文件可使用固定长度文件,但CSV形式的文件比较常用。
数据文件名在控件文件中(INFILE)记述。
CSV文件中记录的项目比控制文件中指定的项目多时,多余的将被忽略。
使用windows的text文件时,有时文件最后有EOF字符,
这也会被当成一条记录,会导致出错。
INFILE,BADFILE,DISCARDFILE可指定为复数个文件。
例:
~LOAD DATA
INFILE '文件1' BADFILE '不良文件1.bad' DISCARDFILE '废弃ファイル1.dis'
INFILE '文件2' BADFILE '不良文件2.bad' DISCARDFILE '废弃ファイル2.dis'
INFILE '文件3' BADFILE '不良文件3.bad' DISCARDFILE '废弃ファイル3.dis'
…
APPEND~
上例中,文件1中的错误数据被写到不良文件1.bad,
文件2中的错误数据被写到不良文件2.bad,...
DADFILE不指定时,INFILE名的后缀改为bad作为BADFILE文件名使用。
DISCARDFILE不指定时,不符合WHEN条件的废弃数据不做输出。指定文件没写后缀名时默认使用dsc。