sqlldr userid=lgone/tiger control=a.ctl
其中,a.ctl为控制文件,内容:
LOAD DATA --控制文件标识
INFILE 't.dat' -- 要导入的文件
INFILE 'tt.dat' -- 导入多个文件
INFILE * -- "*" 代表要导入的内容就在control文件里,下面的BEGINDATA后面就是导入的内容
INSERT --数据载入方式,有四种
INTO TABLE table_name -- 指定装入的表
BADFILE 'c:bad.txt' --指定坏文件地址
LOGFILE 'c:log.txt' --log文件
DISCARD 'c:discard.txt' --包含丢弃数据的文件
ERRORS=1000 --指定错误的数目
可以使用sqlldr查看帮助。
[@more@]以下是4种装入表的方式:
APPEND 原先的表有数据,就加在后面
INSERT 装载空表 如果原先的表有数据 sqlloader会停止,默认值
REPLACE 原先的表有数据,原先的数据会全部删除
TRUNCATE 指定的内容和replace的相同 会用truncate语句删除现存数据
指定的TERMINATED可以在表的开头,也可在表的内部字段部分:
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' --OPTIONALLY ENCLOSED BY是指字段值用什么括起来,平时我们都是用单引号,如'value'
装载这种数据: 10,lg,"""lg""","lg,lg"
在表中结果: 10 lg "lg" lg,lg
TERMINATED BY X'09' -- 表示字段之间通过制表符tab键(以十六进制格式 '09' 表示 )分割,也可以把FIELDS TERMINATED BY ';'分号表示成ascii编码
TERMINATED BY WRITESPACE -- 以空白分割,装载这种数据: 10 lg lg
(col_1 [interger external] TERMINATED BY ',' ,
col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg' )
当某列为空,不存在对应值:
TRAILING NULLCOLS --如果某个字段没有对应的值时(空格、空白、或null),被当作null列,向表中插入null
不导入某列:
( col_1 , col_2 ,col_filler FILLER --FILLER 关键字(不是filter)指定此列(第三列)的数值不会被装载,如: lg,lg,not,结果 lg lg)
也可以写成这样:( col_1 , col_2 ) --数据文件中存在超过两列数据,但是只导入前两列
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO, DNAME, LOC )
BEGINDATA
10,Sales,"""USA"""
20,Accounting,"Virginia,USA"
30,Consulting,Virginia
40,Finance,Virginia
50,"Finance","",Virginia --loc 列将为空
60,"Finance",,Virginia --loc 列将为空
跳过数据行,可以用 "SKIP n" 关键字来指定导入时可以跳过多少行数据。如:
INTO TABLE load_positional_data
SKIP 5
当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据:
(
col_1 position(1:2), --1到2,(01) 代表第一个字符
col_2 position(3:10), --3到10
col_3 position(*:16), -- 这个字段的开始位置在前一字段的结束位置
col_4 position(1:16),
col_5 position(3:10) char(8) -- 指定字段的类型
)
BEGINDATA -- 对应开始的 INFILE * 要导入的内容就在control文件里,注意begindata后的数值前面不能有空格
10,Sql,what
20,lg,show
使用函数(包括自定义函数)、日期的某种表达方式:
FIELDS TERMINATED BY ','
(DEPTNO,
DNAME "upper(:dname)", -- 使用函数
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy', --或'dd-month-yyyy'等,也可以使用自定义函数LAST_UPDATED "my_to_date( :last_updated )" , my_to_date()为自定义函数
ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"
)
载入有换行符的数据:
注意: unix 和 windows换行符不同 n & /n
(......
COMMENTS "replace(:comments,'n',chr(10))" --replace 的使用帮助转换换行符
......
)
载入每行的行号:
......
( seqno RECNUM --载入每行的行号
text Position(1:20))
BEGINDATA
fsdfasj --自动分配一行号给载入 表t 的seqno字段, 此行行号为1
fasdjfasdfl --此行行号为2
合并多行记录为一行记录:
CONCATENATE: - use when SQL*Loader should combine the same number of physical records together to form one logical record.
CONTINUEIF - use if a condition indicates that multiple records should be treated as one. Eg. by having a '#' character in column 1.
LOAD DATA
INFILE *
concatenate 3 --通过关键字concatenate 把几行的记录看成一行记录
INTO TABLE DEPT
......
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy'
)
BEGINDATA
10,Sales, --其实这3行看成一行 10,Sales,Virginia,1/5/2000
Virginia,
1/5/2000
这列子用 continueif list="," 也可以,告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行.
LOAD DATA
INFILE *
continueif this(1:1) = '-' -- 找每行的开始是否有连接字符'-',有就把下一行连接为一行:
如 -10,Sales,Virginia,
1/5/2000 就是一行 10,Sales,Virginia,1/5/2000
其中1:1 表示从第一行开始 并在第一行结束 还有continueif next, 但continueif list最理想
将数据导入多个表:
LOAD DATA
INFILE *
REPLACE
INTO TABLE emp
WHEN empno != ' '
( empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER EXTERNAL
)
INTO TABLE proj
WHEN projno != ' '
( projno POSITION(25:27) INTEGER EXTERNAL,
empno POSITION(1:4) INTEGER EXTERNAL
)
导入数据时修改数据:
在导入数据到数据库时,可以修改数据。注意,这仅适合于常规导入,并不适合 direct导入方式.
LOAD DATA
INFILE *
INTO TABLE modified_data
( rec_no "my_db_sequence.nextval",
region CONSTANT '31',
time_loaded "to_char(SYSDATE, 'HH24:MI')",
data1 POSITION(1:5) ":data1/100",
data2 POSITION(6:15) "upper(:data2)",
data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')"
)
BEGINDATA
11111AAAAAAAAAA991201
22222BBBBBBBBBB990112
LOAD DATA
INFILE 'mail_orders.txt'
BADFILE 'bad_orders.txt'
APPEND
INTO TABLE mailing_list
FIELDS TERMINATED BY ","
( addr,
city,
state,
zipcode,
mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)",
mailing_city "decode(:mailing_city, null, :city, :mailing_city)",
mailing_state
)
SQL*Loader 数据的提交:
一般情况下是在导入数据文件数据后提交的。也可以通过指定 ROWS= 参数来指定每次提交记录数。
提高 SQL*Loader 的性能:
1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。
2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。
4) 可以同时运行多个导入任务.
常规导入与direct导入方式的区别:
常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/670493/viewspace-1029598/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/670493/viewspace-1029598/