前提:安裝了oracle客戶端。
在“開始”->“運行”,輸入“cmd”,回車。在打開的dos窗口裏輸入:sqlldr。看看是否安裝了
下面,我爲了快速學習,先忽略參數的說明。只管用一個簡單的例子。
我在本機上安裝了Linux的oracle數據庫,現在先建立一個測試的表:
create table tdsxhwn.tbtestsqlldr(
id int,
name varchar(10)
)
然後配置一個連接服務,別名爲LOCALHOST_ORCL
打開PL/SQL即可看
如果沒有PL/SQL,也可以在$ORACLE_HOME\client_1\NETWORK\ADMIN\tnsnames.ora文件找到:
LOCALHOST_ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )
現在,我在“D:\sqlldr”文件夾裏創建兩個文件:
control.txt文件
data.txt
然後在剛纔的dos窗口裏輸入:
sqlldr userid=tdsxhwn/td$123@LOCALHOST_ORCL control=d:\sqlldr\control.txt log= d:\sqlldr\out.log
上面sqlldr的格式是:
sqlldr userid=用戶/密碼@服務別名 control= control文件路徑 log=日誌文件路徑
通過例子來學習
例1:用包含數據的文本導入.
1)、現在有一個要導入數據庫的數據的文本1.txt,文件存放路徑d:\1.txt,格式如下:
123,312u
124,dsfsd
5423,rtdf34
2)、在數據庫中創建要導入的表test(數據庫用戶名/密碼:test/test,默認在本機)
create table test
(num number(11),
var varchar2(12)
)
3)、編寫ctl控制文件 test.ctl,文件存放路徑:d:\test.ctl
load data
infile 'd:\1.txt'
append into table test
fields terminated by ','
(num,var)
4)、命令提示符下執行一下命令
sqlldr userid=jscs/jscs@jscs control=d:\test.ctl
注:
infile 'd:\1.txt' //需要裝載的數據文件的路徑,如果數據在本文件中,則用infile *
append into table test //數據載入的表:
(1)append 表示表中有數據,加在後面
(2)INSERT 表示裝入空表,有數據則停止。默認值
(3)REPLACE 原先表中如果有數據,會被刪除
(4)TRUNCATE 如果要載入的數據與現在的數據相同,載入的數據替換現存的數據。
fields terminated by ','
//數據用是','格開的,如上(1)處,用by X'09',即16進制的"09"代表TAB製表符,常用於excel轉換的tab製表符文件的數據的導入
(num,var) //數據表中要載入的字段
例2:要導入的數據在ctl文件中
1)數據庫表同上例1
2)編寫ctl控制文件test2.ctl,文件存放路徑:d:\test2.ctl
load data
CHARACTERSET 'UTF8'-----字符集設定,這樣才能導入中文
infile *
append into table test
fields terminated by ','
trailing nullcols---------表示允許爲空
(num,var,dat DATE "YYYY-MM-DD HH24:MI:SS)
begindata
123,312u,2011-12-11 11:11:11
124,dsfsd,2011-12-11
5423,rtdf34,2011-12-11 12:11:11
............
3)命令提示符下執行一下命令
sqlldr userid=jscs/jscs@jscs control=d:\test2.ctl
例3:創建如下字符串結構表
load data
infile DED201007
append into table ask_tem_ded
(recordtag position (01:02) char(2),
event_type position (03:12) char(10),
dedtype position (13:14) char(2),
serial position (15:34) char(20),
msisdn position (35:49) char(15),
spcode position (50:69) char(20),
opercode position (70:89) char(20),
chrgtype position (90:91) char(2),
lastdate position (92:105) char(14),
dedtime position (106:119) char(14),
dedfee position (120:125) char(6),
preserve position (126:145) char(20)
)
sqlldr userid=jscs/jscs@jscs control=d:\test2.ctl
―――――――――――――――――參數說明――――――――――――――――――
二、有效的關鍵字:
userid -- ORACLE username/password
control – 控制文件
log – 記錄的日誌文件
bad – 壞數據文件
data – 數據文件
discard – 丟棄的數據文件
discardmax – 允許丟棄數據的最大值 (全部默認)
skip -- Number of logical records to skip (默認0)
load -- Number of logical records to load (全部默認)
errors – 允許的錯誤記錄數 (默認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)
每次提交記錄的緩衝區的大小(字節爲單位,默認256000)
silent --禁止輸出信息 (header,feedback,errors,discards,partitions)
direct – 使用直通路徑方式導入 (默認FALSE)
parfile -- parameter file: name of file that contains parameter specifications
parallel -- 並行導入 (默認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)
與bindsize成對使用,其中較小者會自動調整到較大者。sqlldr先計算單條記錄長度,乘以rows,如小於bindsize,不會試圖擴張rows以填充bindsize;如超出,則以bindsize爲準。
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)
注意:有兩種方式可以指定命令行參數:通過位置或者通過關鍵字。
(1)通過位置指定命令行參數的例子:'sqlldr scott/tiger foo';
(2)通過關鍵字指定命令行參數的例子:'sqlldr control=foo userid=scott/tiger';
不能前面使用關鍵字指定後面通過位置指定的混合方式;
比如:'sqlldr scott/tiger control=foo logfile=log' 是允許的;
但'sqlldr scott/tiger control=foo log'不允許。
通過位置指定命令行參數的時候,必須將“位置”放在user/passwd之前。
爲清楚起見最好所有命令行參數都用關鍵字指定。
三、控制文件:一個控制命令的腳本文件,通常以ctl結尾,內容如下:
LOAD DATA
INFILE 't.dat' //要導入的文件
// INFILE 'tt.date' //導入多個文件
// INFILE * //表示要導入的內容就在control文件裏 下面的BEGINDATA後面就是導入的內容
INTO TABLE table_name // 指定裝入的表
BADFILE 'c:\bad.txt' //可選,指定壞文件地址,缺省在當前目錄下生成與原文件名一致的.bad文件
//************* 以下是4種裝入表的方式
APPEND // 原先的表有數據 就加在後面
// INSERT //裝載空表 如果原先的表有數據 sqlloader會停止 默認值
// REPLACE // 原先的表有數據 原先的數據會全部刪除
// TRUNCATE // 指定的內容和replace的相同 會用truncate語句刪除現存數據
//************* 指定分隔符
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
// TERMINATED BY WRITESPACE //以空白分割
用java運行sqlldr:
private void runSqlldr(String path, String logPath) {
// java運行sqlldr
try {
String s = "sqlldr userid=" + info.getGoalUser() + "/"
+ info.getGoalPassword() + "@" + info.getDbAlias()
+ " control=" + path + " log=" + logPath
+ " errors=1000000 rows=10000";
Process process = Runtime.getRuntime().exec(s);
doWaitFor(process);
//這裏就該執行完了
process.destroy();
process = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private int doWaitFor(Process p) {
int exitValue = -1; // returned to caller when p is finished
InputStream in = null;
InputStream err = null;
try {
in = p.getInputStream();
err = p.getErrorStream();
boolean finished = false; // Set to true when p is finished
while (!finished) {
try {
while (in.available() > 0) {
// Print the output of our system call
in.read();
}
while (err.available() > 0) {
// Print the output of our system call
err.read();
}
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
}
}
} catch (Exception e) {
// unexpected exception! print it out for debugging...
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (err != null) {
try {
err.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// return completion status to caller
return exitValue;
}