Oracle 使用 Sql Loader加载数据
一、Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1、A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中。
2、建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where …。
3、exp A 表,再 imp 到 B 表,exp 时可加查询条件。
4、程序实现 select from A ..,然后 insert into B ...,也要分批提交。
5、Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显。
二、在命令行下执行 Oracle 的 sqlldr 命令,可以看到它的详细参数说明:
Username -- Oracle数据库名 。
Password -- Oracle数据库密码。
Servicename -- 是Oracle服务实例名 。
Control -- 控制文件,可能包含表的数据。
Log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log。
Bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad。
Data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作。
Errors -- 允许的错误记录数,可以用他来控制一条记录都不能错。
Rows -- 多少条记录提交一次,默认为 64。
Skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述。
Insert -- 为缺省方式,在数据装载开始时要求表为空
Append -- 在表中追加新记录
Replace -- 删除旧记录(用 delete from table 语句),替换成新装载的记录
Truncate -- 删除旧记录(用 truncate table 语句),替换成新装载的记录
OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行,每128行提交一次
Fields terminated by "," -- 字段间隔为“,”
Optionally enclosed by '"' – 行记录间隔
Trailing nullcols -- 表的字段没有对应的值时允许为空
三、sqlldr 的使用,有两种使用方法:
1、只使用一个控制文件,在这个控制文件中包含数据。
2、使用一个控制文件(作为模板) 和一个数据文件。
一般为了利于模板和数据的分离,以及程序的不同分工会使用第二种方式。
四、举例:
此处使用第二种方法
建表file_list:
create table file_list
(
file_id number,
file_name varchar2(250),
created_date date
) ;
创建数据文件file_list.data
15968600^025_value_added_0_201011301014_030937.Tdat^2010-11-30 10:18:20
15968572^025_call_0_201011301012_030907.Tdat^2010-11-30 10:16:16
15968596^025_data_0_201011301015_030964.Tdat^2010-11-30 10:17:53
创建控制文件file_list.ctl
OPTIONS (ROWS=1000)
load data
infile 'E:\ file_list.dat'
BADFILE 'E:\log\error.bad'
replace into table file_list
fields terminated by '^'
trailing nullcols
(
FILE_ID
,FILE_NAME
,CREATED_DATE DATE "YYYY-MM-DD HH24:MI:SS"
)
五、运行:
点击开始->运行 键入cmd
执行以下命令:
E:\>sqlldr username/password@servicename control=file_list.ctl