SQL Loader使用备忘录

 最近需要将大量的文件中的数据导入到数据库,sql loader当然是首选的工具,这两天研究了一下这个工具,从网络上得到了很多资料,自己做了个demo,留下来一些做个备忘。

如果有不对的地方:[email protected]

1. 关键字
userid -- ORACLE username/password
   control -- Control file name
       log -- Log file name
       bad -- Bad file name
      data -- Data file name
   discard -- Discard file name
discardmax -- Number of discards to allow         (全部默认)
      skip -- Number of logical records to skip (默认0)
      load -- Number of logical records to load (全部默认)
    errors -- Number of errors to allow          (默认50)
      rows -- Number of rows in conventional path bind array or between direct path data saves
(默认: 常规路径 64, 所有直接路径)
 bindsize -- Size of conventional path bind array in bytes(默认256000)
    silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
    direct -- use direct path                    (默认FALSE)
   parfile -- parameter file: name of file that contains parameter specifications
 parallel -- do parallel load                    (默认FALSE)
      file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默认FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(默认FALSE)
 readsize -- Size of Read buffer                 (默认1048576)
external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(默认NOT_USED)
columnarrayrows -- Number of rows for direct path column array(默认5000)
streamsize -- Size of direct path stream buffer in bytes(默认256000)
multithreading -- use multithreading in direct path
 resumable -- enable or disable resumable for current session(默认FALSE)
resumable_name -- text string to help identify resumable statement
resumable_timeout -- wait time (in seconds) for RESUMABLE(默认7200)
date_cache -- size (in entries) of date conversion cache(默认1000)
 
PLEASE NOTE: 命令行参数可以由位置或关键字指定。前者的例子是 'sqlloadscott/tiger foo'; 后一种情况的一个示例是 'sqlldr
control=foouserid=scott/tiger'.位置指定参数的时间必须早于但不可迟于由关键字指定的参数。例如,允许 'sqlldr scott/tiger
control=foo logfile=log', 但是不允许 'sqlldr scott/tiger control=foo log', 即使参数 'log' 的位置正确。
2. Sample
test.ctl
LOAD DATA
INFILE './testdata.csv'
TRUNCATE
INTO TABLE SQLLOADERDEMO_USERINFO
WHEN DATATYPE='U'
(
DATATYPE POSITION(01) ,
USERID POSITION(3:12),
USERNAME POSITION(14:25),
PSWD POSITION(27:38)
)
INTO TABLE SQLLOADERDEMO_USERDETALINFO
WHEN DATATYPE='D'
(
DATATYPE POSITION(1:1),
USERID POSITION(3:12),
AGE POSITION(14:15),
SEX POSITION(17:17),
CHARACTERS POSITION(19:24)
)
 
 
testdata.csv
--------------------------------------------------------------------------------------------------------------------
U,userid0001,username0001,password0001
D,userid0001,22,F,STRONG
U,userid0002,username0002,password0002
Y,userid0002,22,M,STRONG
D,userid0002,22,M,STRONG
 
Create table
create table SQLLOADERDEMO_USERDETALINFO
(
 USERID     VARCHAR2(
10 ) not null,
 AGE        NUMBER(
3 ),
 SEX        VARCHAR2(
2 ),
 CHARACTERS VARCHAR2(
200 ),
 DATATYPE   VARCHAR2(
2 )
)
alter table SQLLOADERDEMO_USERDETALINFO
 add constraint SQLLOADERDEMO_USERDETALINFO_PK primary key (USERID)
create table SQLLOADERDEMO_USERINFO
(
 USERID   VARCHAR2(
10 ) not null,
 USERNAME VARCHAR2(
12 ),
 PSWD     VARCHAR2(
20 ),
 DATATYPE VARCHAR2(
2 )
)
alter table SQLLOADERDEMO_USERINFO
 add constraint SQLLOADERDEMO_USERINFO_PK primary key (USERID)
 
 
启动脚本: testsqlldr.sh
#!/bin/bash
echo "Testing sqlloader ............................................."
echo "Created by [email protected] 20070719 PM  "
sqlldr scot/tiger control=./test.ctl
echo " "
echo "Testing has been over ........................................."
 
3.参考网站
http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76955/toc.htm
这里有oracle 8i关于sql loader的全部说明,非常全面
 
4. 常见用法
加载可变长度或指定长度的记录
如:
LOAD DATA
INFILE *
INTO TABLE load_delimited_data
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
( data1,
data2
)
BEGINDATA
11111,AAAAAAAAAA
22222,"A,B,C,D,"
 
下面是导入固定位置(固定长度)数据示例:
LOAD DATA
INFILE *
INTO TABLE load_positional_data
( data1 POSITION(1:5),
data2 POSITION(6:15)
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB
 
跳过数据行:
可以用 "SKIP n" 关键字来指定导入时可以跳过多少行数据。如:
LOAD DATA
INFILE *
INTO TABLE load_positional_data
SKIP 5
( data1 POSITION(1:5),
data2 POSITION(6:15)
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB
 
导入数据时修改数据:
在导入数据到数据库时,可以修改数据。注意,这仅适合于常规导入,并不适合 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
)
 
将数据导入多个表:
如:
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
)
 
导入选定的记录:
如下例: (01) 代表第一个字符, (30:37) 代表30到37之间的字符:
LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '19991217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
 
导入时跳过某些字段:
可用 POSTION(x:y) 来分隔数据. 在Oracle8i中可以通过指定 FILLER 字段实现。FILLER 字段用来跳过、忽略导入数据文件中的字段.如:
LOAD DATA
TRUNCATE INTO TABLE T1
FIELDS TERMINATED BY ','
( field1,
field2 FILLER,
field3
)
 
导入多行记录:
可以使用下面两个选项之一来实现将多行数据导入为一个记录:
 
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.
 
SQL*Loader 数据的提交:
一般情况下是在导入数据文件数据后提交的。
也可以通过指定 ROWS= 参数来指定每次提交记录数。
5. 关于性能
提高 SQL*Loader 的性能:
1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。
2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。
4) 可以同时运行多个导入任务.
常规导入与direct导入方式的区别:
常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。

你可能感兴趣的:(SQL Loader使用备忘录)