sql*loader是oracle數據庫導入外部數據的一個工具.它和db2的load工具相似,但有更多的選擇,它支持變化的加載模式,可選的加載及多表加載. 
如何使用 sql*loader 工具 
我們可以用oracle的sqlldr工具來導入數據。例如: 
sqlldr scott/tiger control=loader.ctl 
控制文件(loader.ctl) 將加載一個外部數據文件(含分隔符). loader.ctl如下: 
load data 
infile 'c:/data/mydata.csv' 
into table emp 
fields terminated by "," optionally enclosed by '"' 
( empno, empname, sal, deptno ) 
mydata.csv 如下: 
10001,"scott tiger", 1000, 40 
10002,"frank naude", 500, 20 
下面是一個指定記錄長度的示例控制文件。"*" 代表數據文件與此文件同名,即在后面使用begindata段來標識數據。 
load data 
infile * 
replace 
into table departments 
( dept position (02:05) char(4), 
deptname position (08:27) char(20) 
) 
begindata 
cosc computer science 
engl english literature 
math mathematics 
poly political science 
unloader這樣的工具 
oracle 沒有提供將數據導出到一個文件的工具。但是,我們可以用sql*plus的select 及 format 數據來輸出到一個文件: 
set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on 
spool oradata.txt 
select col1 || ',' || col2 || ',' || col3 
from tab1 
where col2 = 'xyz'; 
spool off 
另外,也可以使用使用 utl_file pl/sql 包處理: 
rem remember to update initsid.ora, utl_file_dir='c:/oradata' parameter 
declare 
fp utl_file.file_type; 
begin 
fp := utl_file.fopen('c:/oradata','tab1.txt','w'); 
utl_file.putf(fp, '%s, %s/n', 'textfield', 55); 
utl_file.fclose(fp); 
end; 
/ 
當然你也可以使用第三方工具,如sqlways ,toad for quest等。 
加載可變長度或指定長度的記錄 
如: 
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= 參數來指定每次提交記錄數。 
提高 sql*loader  的性能: 
1) 一個簡單而容易忽略的問題是,沒有對導入的表使用任何索引和/或約束(主鍵)。如果這樣做,甚至在使用rows=參數時,會很明顯降低數據庫導入性能。 
2) 可以添加 direct=true來提高導入數據的性能。當然,在很多情況下,不能使用此參數。 
3) 通過指定  unrecoverable選項,可以關閉數據庫的日志。這個選項只能和 direct 一起使用。 
4) 可以同時運行多個導入任務. 
常規導入與direct導入方式的區別: 
常規導入可以通過使用 insert語句來導入數據。direct導入可以跳過數據庫的相關邏輯(direct=true),而直接將數據導入到數據文件中。