sqlldr的用法总结

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),而直接将数据导入到数据文件中。

posted @ 2015-01-27 15:05  晴心  阅读(1182)  评论(0)    收藏  举报