sql*loader用法小结
最近在项目中遇到将clob类型的大对象导入到数据库中(oracle),平时只是拷贝一下就行了。可是遇到clob就行了,问了几个同事都没有办法,最后问了组长和后台比较牛的人她们分别告诉我用pl/sql和toad导入的方法,可是导入时还有问题,后来向华为研发要了一个sql*loader脚本,看了一下挺简单的,结果研发给的可以导进去,本地布署的却不行,最后确定是版本有问题,然后下载了一个最新版本问题搞定了。可是在这个过程中觉得应该知道sql*loader用法,查看一些资料,并把简单的操作记录给大家,希望能给新手一些帮助。
1.首先我是以大家都有的数据对象和实例进行展示,所以我选择了scott用户的emp为源表数据,先导出为emp.csv文件
导出的方法有多种其中pl/sql和toad比较好,我是以前者进行导出的。(这些方法我也是最近才学会的,哈哈)
由于现在不能进行上传图片,所以我也只能进行说明了。(在pl/sql的查询结果栏上边,有一个export query results,在这个下拉框中选择csv file 就可以把文件保存为csv格式的了)
2.有了导入文件,我们现在需要做的就是写一个配置文件,我在网上找一很多这方面的例子,都大同小异,我找一个我认为比较好的给大家一个参考,希望给大家起到指导作用。(在文章的后面给大家贴出来)
a.我先在scott用户下建一个emp_bak表。
create table scott.emp_bak as
select * from scott.emp t
where 1=2
;
b.查看表结构
create table EMP_BAK
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
c.写控制文件
load data
infile "emp.csv"
badfile 'emp.bad'
discardfile 'emp.dsc'
discardmax 10
append into table "EMP_BAK"
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
(
EMPNO ,
ENAME ,
JOB ,
MGR ,
HIREDATE date'yyyy-mm-dd' ,
SAL ,
COMM ,
DEPTNO
)
将以上内容改成一个emp.ctl文件保存。(date'yyyy-mm-dd' 这个地方要因数据情况而定,我的数据是1980-12-17,所以我用这个,对于不能直接导入的,我们首先在考虑用函数实现)
d.我是把csv文件和ctl文件都在d:/initdata目录下了,于是我在dos分别进行操作
1.C:/Documents and Settings/jcttest>d:
2.D:/> cd initdata
3.D:/initdata>dir
4.sqlldr scott/scott@suse emp.ctl
e.其实我们要养成一下查看日志的好习惯,我们要查看日志(这个日志一般是以导入文件名称是一样的,但扩展名不一样,扩展名一般为.log,所以我的就为emp.log)内容如下(当是成功的,对于不同错误,当然也不一样了,哈哈)
SQL*Loader: Release 10.1.0.2.0 - Production on Sat Jan 23 09:21:28 2010
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Control File: emp.ctl
Data File: emp.csv
Bad File: emp.bad
Discard File: emp.dsc
(Allow 10 discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array: 64 rows, maximum of 256000 bytes
Continuation: none specified
Path used: Conventional
Table "EMP_BAK", loaded from every logical record.
Insert option in effect for this table: APPEND
TRAILING NULLCOLS option in effect
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
EMPNO FIRST * , O(") CHARACTER
ENAME NEXT * , O(") CHARACTER
JOB NEXT * , O(") CHARACTER
MGR NEXT * , O(") CHARACTER
HIREDATE NEXT * , O(") DATE yyyy-mm-dd
SAL NEXT * , O(") CHARACTER
COMM NEXT * , O(") CHARACTER
DEPTNO NEXT * , O(") CHARACTER
Record 1: Rejected - Error on table "EMP_BAK", column EMPNO.
ORA-01722: invalid number
Table "EMP_BAK":
14 Rows successfully loaded.
1 Row not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array: 132096 bytes(64 rows)
Read buffer bytes: 1048576
Total logical records skipped: 0
Total logical records read: 15
Total logical records rejected: 1
Total logical records discarded: 0
Run began on Sat Jan 23 09:21:28 2010
Run ended on Sat Jan 23 09:21:31 2010
Elapsed time was: 00:00:02.51
CPU time was: 00:00:00.04