ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sqlldr的用法总结

sqlldr的用法总结

原创 Linux操作系统 作者:wwd_wang 时间:2012-10-25 10:32:26 0 删除 编辑

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查看帮助。


以下是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/12137615/viewspace-747173/,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux下mount步骤
请登录后发表评论 登录
全部评论

注册时间:2008-05-08

  • 博文量
    236
  • 访问量
    194417