Oracle Sqlloader

clip_image001

属于Oracle用于数据迁移、将加载非Oracle DB格式的数据导入到数据库中。


基本的组成由:

*.bat (bat是windows;linux系统下,是一个可执行文件,例如sh)

*.par (.par文件可以不要,但需要把里面的内容直接写在.bat)

*.ctl

*.bad (自动生成)

*.log (自动生成)

*.dis

文件组成。


.bad 文件

坏数据文件,导入文件出现错误的记录会存放到这个文件中,执行bat后自动生成。


.log 文件

日志文件,可以查看导入的情况,非常有用,执行bat后自动生成。


.bat 文件

说明:是window批处理文件,里面写着.par文件的指向,linux系统则一般是sh

举例:sqlldr parfile=import.par


.par 文件

说明:里面写着所连接的数据库及各种文件

举例:

userid=用户名/密码@服务器本地命名

control=import.ctl

bad=import.bad

log=import.log

discard=import.dis

rows=1000 --每次提交的记录数

errors=1000 --允许错误的记录数

skip=0

direct=true -多文件插入

parallel=true --并发模式

注意:服务器本地命名,xp下可在,开始菜单->选择本地ORACLE客户段->配置和移植工具->服务命名,里面设置。


.ctl 文件

说明:控制文件,里面写着导进去的文件和导到哪些表及字段

例如:

unrecoverable --作用是不生成归档日志,与par文件的direct=true通用

OPTIONS (skip=1,rows=128) --sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行

LOAD DATA

INFILE 'jine.txt'

infile 'jine2.txt' --可以infile多个文件,同时导入一张表,但后面的表格无法返回预定的bad文件

--这里还可以使用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,

APPEND INTO TABLE tmp_excel --向表中追加数据

FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '"' --数据文件的字段分隔符和字段限定符(如果是'需要转换,应该写成\')

railing nullcols --表中的字段没有对应的值时填充空值

(

id integer external, --integer external 表示插入的数据是string,如果只保留integer,表示插入的数据是二进制

name "upper(:name)", --将插入的值转换为大写

con ":id||:name", --表中CON列的值是ID和NAME的组合值

FILLER_1 FILLER, --filler关键字的意思是不加载的列,附件中的

dt date "yyyy-mm-dd", --插入日期型数据

school_name char(400), --sqlldr对于字符类型默认长度为255,如果超过255需要指定长度

class_name char(4000) "substr(:class_name,1,2000)" --sqlldr可以用Oracle的参数,格式是用"",里面变量前要加:

)


注意:

1. 可以infile多个文件,同时导入一张表,但后面的表格无法返回指定的bad文件

2.模式选择

APPEND 原先的表有数据 就加在后面

INSERT 装载空表 如果原先的表有数据 sqlloader会停止,是默认值

REPLACE 原先的表有数据 原先的数据会全部删除(用 delete from table 语句)

TRUNCATE 指定的内容和replace的相同会用truncate语句删除现存数据

3.分隔符选择

如果是制表符(以tab键结尾),所以是 terminated by x'09'

如果是逗号,可以 terminated by ','

如果是空格,可以 terminated by whitespace


其中:

replace和truncate模式,均不能使用并发(par文件的parallel=true参数)

如果没声明FIELDS TERMINATED BY ',' 时,可以用下面两种方式实现同样功能:

1.为每一列指定分隔符

(

col_1 [interger external] TERMINATED BY ',' ,

col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,

col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'

)

2.用位置告诉字段装载数据

(

col_1 position(1:2),

col_2 position(3:10),

col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置

col_4 position(1:16),

col_5 position(3:10) char(8) // 指定字段的类型

resultid char terminated by ',',

website char terminated by ',',

ipport char terminated by ',',

status char terminated by whitespace)


数据传输过程极大的依靠网络的稳定,假使中途断了零点几秒也会导致记录丢失,丢失的记录会在.bad文件中找到。

并发操作

sqlldr userid=/ control=result1.ctl direct=true parallel=true data=a.txt log=input.log

sqlldr userid=/ control=result2.ctl direct=true parallel=true data=a.txt log=input.log

sqlldr userid=/ control=result2.ctl direct=true parallel=true data=a.txt log=input.log


sql loader属于直接加载,直接加载与常规加载不同的地方有

image


《错误调试篇》

错误信息:Field in data file exceeds maximum length(数据文件的字段超出最大长度)

错误原因:ctl文件导入字段没有指定数据类型

错误解决:在CTL文件指定字段类型,

如时间CREATE_DATE DATE "yyyy-mm-dd hh24:mi:ss",字符char(300)

posted @ 2017-09-05 17:00  最强召唤兽  阅读(1110)  评论(0编辑  收藏  举报