sqlldr應用簡析

 

在oracle中,使用sqlldr將文件中的數據導入到數據庫

1.創建數據文件:

 如,在D:/創建 zhaozhenlong.txt 文件,文件內容爲:

11,12,13
21,22,23
31,32,33

2、創建控制文件:

如,在D:/創建 zhaozhenlong.ctl 文件,文件內容爲:

load data
infile 'd:/zhaozhenlong.txt'
append into table zhaozhenlong
fields terminated by ','
(c1,c2,c3)

3、在數據庫中創建表:

      create table zhaozhenlong(c1 varchar(20),c2 varchar(20),c3 varchar2(20));

4、在‘開始’/‘運行’中,執行:

     sqlldr userid=cs/cs@orademo control=d:/zhaozhenlong.ctl

5、查詢數據庫:

     select * from zhaozhenlong

     結果爲:

 C1 C2 C3
1 11 12 13
2 21 22 23
3 31 32 33

 

例2:

 

 關於 oracle 中 sqlldr 的用法

2005-12-30 21:13:49
這幾天研究了一下 sqlldr 的用法,今天在這裏寫出來供有需要的同行享用.
現在有一個文件 Output.txt 內容如下:
 
Ivy,Lam,PR02004,2005,09,21,17,32,00,I,D,Main Door,PR,
Carmen,Siu,AC04023,2005,09,21,17,32,01,I,D,Main Door,Account,
Xing,Lee,CM06021,2005,09,21,17,32,02,I,D,Main Door,Communications,
Barry,Yu,MK05006,2005,09,21,17,32,02,I,D,Main Door,Marketing,
Overtime,nil,OV0001,2005,09,21,17,32,07,I,D,Main Door,Product,
Sammy,Mow,SA02322,2005,09,21,17,32,09,I,D,Main Door,Sales,
Emily,Fu,CM06024,2005,09,21,17,32,10,I,D,Main Door,Communications,
Stella,Chow,PT02145,2005,09,21,17,32,11,I,D,Main Door,Product,
 
是有規律的數據,中間都是用","分開的,現在我要將此文件導入到 oracle 中:
 
第一步,當然是建表,上面有一行中有幾個數據就建幾個字段.
 
二,寫一個 *.ctl 的文件,內容如下
 
load data
infile 'D:/owen/work/CardAttendence/Completed/windows/Output.txt'
badfile 'D:/owen/work/CardAttendence/Completed/windows/Output.bad'
append
into table system.card_time_original
fields terminated by ","
(lName,fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
三,在 doc 窗口下輸入如下命令
 
sqlldr userid=system/111111@XE control=D:/owen/work/CardAttendence/Completed/windows/importOne.ctl log=D:/owen/work/CardAttendence/Completed/windows/import.log
 
注意:這裏一定要是當前用戶對此表有所有權限, 還有一定不能用 sys 用戶,要不然會出錯
 
如果要將此數據導入到兩個表中(結構相同),那麼可以把控制文件改爲如下所示:
 
load data
infile 'D:/owen/work/CardAttendence/Completed/windows/Output.txt'
badfile 'D:/owen/work/CardAttendence/Completed/windows/Output.bad'
append
into table system.card_time_original
WHEN lName != ' '
fields terminated by ","
(lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
into table system.card_time_original_bak
WHEN lName != ' '
fields terminated by ","
(lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
 
小結:
 
 

FAQ_SQLLDR用法總結

         在數據倉庫項目實施過程中,ETL是重要的一環,實施的好與壞,關係到項目的成功與否。
在數據抽取領域,相應的工具有IBM DataStage,Informatica PowerCenter,這裏介紹Oracle自帶的SQLLODER,
這是在Oracle數據倉庫實施過程中最容易掌握的工具。在介紹之前,先考慮下面問題:

 一、注意SQLLDR要解決的問題,即實現ETL過程的問題

1、導入表的數據類型爲日期類型

2、導入數據過程中的轉換問題

3、導入數據過程中的過濾問題

4、導入數據過程中的截取問題

5、導入空列在轉換時可能會遇到的問題

6、導入數據的分割符問題,如逗號,製表符,空白符都是常見的

用法:

二、控制文件:一個控制命令的腳本文件,通常以ctl結尾,Test.ctl內容如下:

 

LOAD DATA

INFILE 'F:/SQLLDR/data.txt'

INFILE 'F:/SQLLDR/data2.txt'                                //可以從多個文件導入數據

// INFILE *                  //導入的內容在本文件最後的BEGINDATA後面就是導入的內容 

INTO TABLE sdata.T_TEST

 

//四種裝載方式,四選一

APPEND           // 原先的表有數據 就加在後面 

// INSERT            //裝載空表 如果原先的表有數據 sqlloader會停止 默認值 

// REPLACE       //  原先的表有數據 原先的數據會全部刪除 

// TRUNCATE            //  指定的內容和replace的相同 會用truncate語句刪除現存數據 

 

//過濾裝載的數據

WHEN T_DATE = '<?xml:namespace prefix = st1 />2007-07-02'                            //大於和小於等其它比較還沒解決

 

//指定分割符

FIELDS TERMINATED BY ','                          // x'09' (製表符)

-- FIELDS TERMINATED BY  WHITESPACE        //以空白分割,實際這樣分割危險

OPTIONALLY ENCLOSED BY '"'

TRAILING NULLCOLS  // 表的字段沒有對應的值時允許爲空 ,這句很有用,默認加的好

 

//表的字段,可以在裏面大做文章

(

T_ID FILLER,                                      // FILLER 關鍵字 此列的數值不會被裝載

T_DATE "CASE WHEN :T_DATE is null THEN TO_DATE('2999-12-31','yyyy-mm-dd') ELSE TO_DATE(:T_DATE,'yyyy-mm-dd') END",                          

 //日期類型特別說明,並且要指定其格式      

//更一般的格式是T_DATE date ‘yyyy-mm-dd’

T_NAME POSITION(3:6) "UPPER(:T_NAME)",      //用位置POSITION來告訴裝載的數據

                                                               //"UPPER(:T_NAME)" 轉換爲大寫,注意冒號

T_SEX position(*:8) ,                  // 這個字段的開始位置在前一字段的結束位置

ENTIRE_LINE "UPPER(:T_NAME||:T_SEX)"    //連接並轉換爲大寫

) 

/****可繼續 插入數據到其他表

INTO TABLE sdata.T_TEST

INSERT            

WHEN T_DATE = '2007-07-02'                            //大於和小於等其它比較還沒解決

.//BEGINDATA                                          // 與前面的INFILE *對應,一般不會這樣用吧 

//1,ajsdlkfjsdkl,0 

三、運行方法

命令窗口執行:

sqlldr userid=sdata/sdata@rasdevdb control=F:/SQLLDR/Test.ctl 

爲了方便,一般寫個bat 文件,在bat文件中輸入上述的內容即可,最後在命令窗口中運行這個bat文件,原理是一樣的。

總之,這其實是Oracle中的一個用法而已。

三、

對不規則數據源的處理

 

--TRAILING NULLCOLS                   // 表的字段沒有對應的值時允許爲空,這句很有用

例如:

對於由EXCEL文件導出成CSV文件時,有的行末沒有數據會缺少分割符,這在DS中會報錯的,在SQLLDR中可以通過TRAILING NULLCOLS 來識別。

123

12

123

如果不說明的話,會出現錯誤

 

 

 

sql load的一點小總結  
  
sqlldr userid=lgone/tiger control=a.ctl  
LOAD DATA  
INFILE 't.dat' // 要導入的文件  
// INFILE 'tt.date' // 導入多個文件  
// INFILE * // 要導入的內容就在control文件裏 下面的BEGINDATA後面就是導入的內容  
  
INTO TABLE table_name // 指定裝入的表  
BADFILE 'c:/bad.txt' // 指定壞文件地址  
  
************* 以下是4種裝入表的方式  
APPEND // 原先的表有數據 就加在後面  
// INSERT // 裝載空表 如果原先的表有數據 sqlloader會停止 默認值  
// REPLACE // 原先的表有數據 原先的數據會全部刪除  
// TRUNCATE // 指定的內容和replace的相同 會用truncate語句刪除現存數據  
  
************* 指定的TERMINATED可以在表的開頭 也可在表的內部字段部分  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  
// 裝載這種數據: 10,lg,"""lg""","lg,lg"  
// 在表中結果: 10 lg "lg" lg,lg  
// TERMINATED BY X '09' // 以十六進制格式 '09' 表示的  
// TERMINATED BY WRITESPACE // 裝載這種數據: 10 lg lg  
  
TRAILING NULLCOLS ************* 表的字段沒有對應的值時允許爲空  
  
************* 下面是表的字段  
(  
col_1 , col_2 ,col_filler FILLER // FILLER 關鍵字 此列的數值不會被裝載  
// 如: lg,lg,not 結果 lg lg  
)  
// 當沒聲明FIELDS TERMINATED BY ',' 時  
// (  
// col_1 [interger external] TERMINATED BY ',' ,  
// col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,  
// col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'  
// )  
// 當沒聲明FIELDS TERMINATED BY ','用位置告訴字段裝載數據  
// (  
// col_1 position(1:2),  
// col_2 position(3:10),  
// col_3 position(*:16), // 這個字段的開始位置在前一字段的結束位置  
// col_4 position(1:16),  
// col_5 position(3:10) char(8) // 指定字段的類型  
// )  
  
BEGINDATA // 對應開始的 INFILE * 要導入的內容就在control文件裏  
10,Sql,what  
20,lg,show  
  
=====================================================================================  
//////////// 注意begindata後的數值前面不能有空格  
  
1 ***** 普通裝載  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
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 列將爲空  
  
2 ***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情況  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY WHITESPACE  
-- FIELDS TERMINATED BY x'09'  
(DEPTNO,  
DNAME,  
LOC  
)  
BEGINDATA  
10 Sales Virginia  
  
3 ***** 指定不裝載那一列  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  
( DEPTNO,  
FILLER_1 FILLER, // 下面的 "Something Not To Be Loaded" 將不會被裝載  
DNAME,  
LOC  
)  
BEGINDATA  
20,Something Not To Be Loaded,Accounting,"Virginia,USA"  
  
4 ***** position的列子  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
( DEPTNO position(1:2),  
DNAME position(*:16), // 這個字段的開始位置在前一字段的結束位置  
LOC position(*:29),  
ENTIRE_LINE position(1:29)  
)  
BEGINDATA  
10Accounting Virginia,USA  
  
5 ***** 使用函數 日期的一種表達 TRAILING NULLCOLS的使用  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS // 其實下面的ENTIRE_LINE在BEGINDATA後面的數據中是沒有直接對應  
// 的列的值的 如果第一行改爲 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了  
(DEPTNO,  
DNAME "upper(:dname)", // 使用函數  
LOC "upper(:loc)",  
LAST_UPDATED date 'dd/mm/yyyy', // 日期的一種表達方式 還有'dd-mon-yyyy' 等  
ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"  
)  
BEGINDATA  
10,Sales,Virginia,1/5/2000  
20,Accounting,Virginia,21/6/1999  
30,Consulting,Virginia,5/1/2000  
40,Finance,Virginia,15/3/2001  
  
6 ***** 使用自定義的函數 // 解決的時間問題  
create or replace  
function my_to_date( p_string in varchar2 ) return date  
as  
type fmtArray is table of varchar2(25);  
  
l_fmts fmtArray := fmtArray( 'dd-mon-yyyy', 'dd-month-yyyy',  
'dd/mm/yyyy',  
'dd/mm/yyyy hh24:mi:ss' );  
l_return date;  
begin  
for i in 1 .. l_fmts.count  
loop  
begin  
l_return := to_date( p_string, l_fmts(i) );  
exception  
when others then null;  
end;  
EXIT when l_return is not null;  
end loop;  
  
if ( l_return is null )  
then  
l_return :=  
new_time( to_date('01011970','ddmmyyyy') + 1/24/60/60 *  
p_string, 'GMT', 'EST' );  
end if;  
  
return l_return;  
end;  
/  
  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )" // 使用自定義的函數  
)  
BEGINDATA  
10,Sales,Virginia,01-april-2001  
20,Accounting,Virginia,13/04/2001  
30,Consulting,Virginia,14/04/2001 12:02:02  
40,Finance,Virginia,987268297  
50,Finance,Virginia,02-apr-2001  
60,Finance,Virginia,Not a date  
  
7 ***** 合併多行記錄爲一行記錄  
LOAD DATA  
INFILE *  
concatenate 3 // 通過關鍵字concatenate 把幾行的記錄看成一行記錄  
INTO TABLE DEPT  
replace  
FIELDS TERMINATED BY ','  
(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最理想  
INTO TABLE DEPT  
replace  
FIELDS TERMINATED BY ','  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED date 'dd/mm/yyyy'  
)  
BEGINDATA // 但是好象不能象右面的那樣使用  
-10,Sales,Virginia, -10,Sales,Virginia,  
1/5/2000 1/5/2000  
-40, 40,Finance,Virginia,13/04/2001  
Finance,Virginia,13/04/2001
  
8 ***** 載入每行的行號  
  
load data  
infile *  
into table t  
replace  
( seqno RECNUM //載入每行的行號  
text Position(1:1024))  
BEGINDATA  
fsdfasj //自動分配一行號給載入 表t 的seqno字段 此行爲 1  
fasdjfasdfl // 此行爲 2 ...  
  
9 ***** 載入有換行符的數據  
注意: unix 和 windows 不同 //n & /n  
&lt; 1 > 使用一個非換行符的字符  
LOAD DATA  
INFILE *  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS "replace(:comments,'/n',chr(10))" // replace 的使用幫助轉換換行符  
)  
BEGINDATA  
10,Sales,Virginia,01-april-2001,This is the Sales/nOffice in Virginia  
20,Accounting,Virginia,13/04/2001,This is the Accounting/nOffice in Virginia  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting/nOffice in Virginia  
40,Finance,Virginia,987268297,This is the Finance/nOffice in Virginia  
  
&lt; 2 > 使用fix屬性  
LOAD DATA  
INFILE demo17.dat "fix 101"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo17.dat  
10,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia  
20,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia  
40,Finance,Virginia,987268297,This is the Finance  
Office in Virginia  
  
// 這樣裝載會把換行符裝入數據庫 下面的方法就不會 但要求數據的格式不同  
  
LOAD DATA  
INFILE demo18.dat "fix 101"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo18.dat  
10,Sales,Virginia,01-april-2001,"This is the Sales  
Office in Virginia"  
20,Accounting,Virginia,13/04/2001,"This is the Accounting  
Office in Virginia"  
30,Consulting,Virginia,14/04/2001 12:02:02,"This is the Consulting  
Office in Virginia"  
40,Finance,Virginia,987268297,"This is the Finance  
Office in Virginia"  
  
&lt; 3 > 使用var屬性  
LOAD DATA  
INFILE demo19.dat "var 3"  
// 3 告訴每個記錄的前3個字節表示記錄的長度 如第一個記錄的 071 表示此記錄有 71 個字節  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo19.dat  
07110,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia  
07820,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia  
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia  
07140,Finance,Virginia,987268297,This is the Finance  
Office in Virginia  
  
&lt; 4 > 使用str屬性  
// 最靈活的一中 可定義一個新的行結尾符 win 回車換行 : chr(13)||chr(10)  
  
此列中記錄是以 a|/r/n 結束的  
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;  
結果 7C0D0A  
  
LOAD DATA  
INFILE demo20.dat "str X'7C0D0A'"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo20.dat  
10,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia|  
20,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia|  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia|  
40,Finance,Virginia,987268297,This is the Finance  
Office in Virginia|  
  
==============================================================================  
象這樣的數據 用 nullif 子句  
  
10-jan-200002350Flipper seemed unusually hungry today.  
10510-jan-200009945Spread over three meals.  
  
id position(1:3) nullif id=blanks // 這裏可以是blanks 或者別的表達式  
// 下面是另一個列子 第一行的 1 在數據庫中將成爲 null  
LOAD DATA  
INFILE *  
INTO TABLE T  
REPLACE  
(n position(1:2) integer external nullif n='1',  
v position(3:8)  
)  
BEGINDATA  
1 10  
20lg  

 

羅列了網上常見的三篇Sqlldr的介紹

一:sql loader 的特點

oracle自己帶了很多的工具可以用來進行數據的遷移、備份和恢復等工作。但是每個工具都有自己的特點。

比如說exp和imp可以對數據庫中的數據進行導出和導出的工作,是一種很好的數據庫備份和恢復的工具,因此主要用在數據庫的熱備份和恢復方面。有着速度快,使用簡單,快捷的優點;同時也有一些缺點,比如在不同版本數據庫之間的導出、導入的過程之中,總會出現這樣或者那樣的問題,這個也許是oracle公司自己產品的兼容性的問題吧。

sql loader 工具卻沒有這方面的問題,它可以把一些以文本格式存放的數據順利的導入到oracle數據庫中,是一種在不同數據庫之間進行數據遷移的非常方便而且通用的工具。缺點就速度比較慢,另外對blob等類型的數據就有點麻煩了。

二:sql loader 的幫助

C:/>sqlldr

SQL*Loader: Release 9.2.0.1.0 - Production on 星期六 10月 9 14:48:12 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

用法: SQLLDR keyword=value [,keyword=value,...]

有效的關鍵字:

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 p

ath data saves

(默認: 常規路徑 64, 所有直接路徑)

bindsize -- Size of conventional path bind array in bytes(默認256000)

silent -- Suppress messages during run (header,feedback,errors,discards,part

itions)

direct -- use direct path (默認FALSE)

parfile -- parameter file: name of file that contains parameter specification

s

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 unus

able(默認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: 命令行參數可以由位置或關鍵字指定

。前者的例子是 'sqlload

scott/tiger foo'; 後一種情況的一個示例是 'sqlldr control=foo

userid=scott/tiger'.位置指定參數的時間必須早於

但不可遲於由關鍵字指定的參數。例如,

允許 'sqlldr scott/tiger control=foo logfile=log', 但是

不允許 'sqlldr scott/tiger control=foo log', 即使

參數 'log' 的位置正確。

C:/>

三:sql loader使用例子

a)SQLLoader將 Excel 數據導出到 Oracle

1.創建SQL*Loader輸入數據所需要的文件,均保存到C:/,用記事本編輯:

控制文件:input.ctl,內容如下:

   load data           --1、控制文件標識

   infile 'test.txt'       --2、要輸入的數據文件名爲test.txt

   append into table test    --3、向表test中追加記錄

   fields terminated by X'09'  --4、字段終止於X'09',是一個製表符(TAB)

   (id,username,password,sj)   -----定義列對應順序

a、insert,爲缺省方式,在數據裝載開始時要求表爲空

b、append,在表中追加新記錄

c、replace,刪除舊記錄,替換成新裝載的記錄

d、truncate,同上

在DOS窗口下使用SQL*Loader命令實現數據的輸入

C:/>sqlldr userid=system/manager control=input.ctl

默認日誌文件名爲:input.log

默認壞記錄文件爲:input.bad

2.還有一種方法

可以把EXCEL文件另存爲CSV(逗號分隔)(*.csv),控制文件就改爲用逗號分隔

LOAD DATA

INFILE 'd:/car.csv'

APPEND INTO TABLE t_car_temp

FIELDS TERMINATED BY ","

(phoneno,vip_car)

b)在控制文件中直接導入數據

1、控制文件test.ctl的內容

-- The format for executing this file with SQL Loader is:

-- SQLLDR control=<filename> Be sure to substitute your

-- version of SQL LOADER and the filename for this file.

LOAD DATA

INFILE *

BADFILE 'C:/Documents and Settings/Jackey/桌面/WMCOUNTRY.BAD'

DISCARDFILE 'C:/Documents and Settings/Jackey/桌面/WMCOUNTRY.DSC'

INSERT INTO TABLE EMCCOUNTRY

Fields terminated by ";" Optionally enclosed by '"'

(

COUNTRYID NULLIF (COUNTRYID="NULL"),

COUNTRYCODE,

COUNTRYNAME,

CONTINENTID NULLIF (CONTINENTID="NULL"),

MAPID NULLIF (MAPID="NULL"),

CREATETIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (CREATETIME="NULL"),

LASTMODIFIEDTIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (LASTMODIFIEDTIME="NULL")

)

BEGINDATA

1;"JP";"Japan";1;9;"09/16/2004 16:31:32";NULL

2;"CN";"China";1;10;"09/16/2004 16:31:32";NULL

3;"IN";"India";1;11;"09/16/2004 16:31:32";NULL

4;"AU";"Australia";6;12;"09/16/2004 16:31:32";NULL

5;"CA";"Canada";4;13;"09/16/2004 16:31:32";NULL

6;"US";"United States";4;14;"09/16/2004 16:31:32";NULL

7;"MX";"Mexico";4;15;"09/16/2004 16:31:32";NULL

8;"GB";"United Kingdom";3;16;"09/16/2004 16:31:32";NULL

9;"DE";"Germany";3;17;"09/16/2004 16:31:32";NULL

10;"FR";"France";3;18;"09/16/2004 16:31:32";NULL

11;"IT";"Italy";3;19;"09/16/2004 16:31:32";NULL

12;"ES";"Spain";3;20;"09/16/2004 16:31:32";NULL

13;"FI";"Finland";3;21;"09/16/2004 16:31:32";NULL

14;"SE";"Sweden";3;22;"09/16/2004 16:31:32";NULL

15;"IE";"Ireland";3;23;"09/16/2004 16:31:32";NULL

16;"NL";"Netherlands";3;24;"09/16/2004 16:31:32";NULL

17;"DK";"Denmark";3;25;"09/16/2004 16:31:32";NULL

18;"BR";"Brazil";5;85;"09/30/2004 11:25:43";NULL

19;"KR";"Korea, Republic of";1;88;"09/30/2004 11:25:43";NULL

20;"NZ";"New Zealand";6;89;"09/30/2004 11:25:43";NULL

21;"BE";"Belgium";3;79;"09/30/2004 11:25:43";NULL

22;"AT";"Austria";3;78;"09/30/2004 11:25:43";NULL

23;"NO";"Norway";3;82;"09/30/2004 11:25:43";NULL

24;"LU";"Luxembourg";3;81;"09/30/2004 11:25:43";NULL

25;"PT";"Portugal";3;83;"09/30/2004 11:25:43";NULL

26;"GR";"Greece";3;80;"09/30/2004 11:25:43";NULL

27;"IL";"Israel";1;86;"09/30/2004 11:25:43";NULL

28;"CH";"Switzerland";3;84;"09/30/2004 11:25:43";NULL

29;"A1";"Anonymous Proxy";0;0;"09/30/2004 11:25:43";NULL

30;"A2";"Satellite Provider";0;0;"09/30/2004 11:25:43";NULL

31;"AD";"Andorra";3;0;"09/30/2004 11:25:43";NULL

32;"AE";"United Arab Emirates";1;0;"09/30/2004 11:25:43";NULL

33;"AF";"Afghanistan";1;0;"09/30/2004 11:25:43";NULL

34;"AG";"Antigua and Barbuda";7;0;"09/30/2004 11:25:43";NULL

35;"AI";"Anguilla";7;0;"09/30/2004 11:25:43";NULL

36;"AL";"Albania";3;0;"09/30/2004 11:25:43";NULL

37;"AM";"Armenia";3;0;"09/30/2004 11:25:43";NULL

38;"AN";"Netherlands Antilles";3;0;"09/30/2004 11:25:43";NULL

39;"AO";"Angola";2;0;"09/30/2004 11:25:43";NULL

40;"AP";"Asia/Pacific Region";2;0;"09/30/2004 11:25:43";NULL

41;"AQ";"Antarctica";8;0;"09/30/2004 11:25:43";NULL

42;"AR";"Argentina";5;0;"09/30/2004 11:25:43";NULL

43;"AS";"American Samoa";6;0;"09/30/2004 11:25:43";NULL

44;"AW";"Aruba";5;0;"09/30/2004 11:25:43";NULL

45;"AZ";"Azerbaijan";1;0;"09/30/2004 11:25:43";NULL

46;"BA";"Bosnia and Herzegovina";3;0;"09/30/2004 11:25:43";NULL

47;"BB";"Barbados";5;0;"09/30/2004 11:25:43";NULL

48;"BD";"Bangladesh";1;0;"09/30/2004 11:25:43";NULL

49;"BF";"Burkina Faso";2;0;"09/30/2004 11:25:43";NULL

50;"BG";"Bulgaria";3;0;"09/30/2004 11:25:43";NULL

51;"BH";"Bahrain";1;0;"09/30/2004 11:25:43";NULL

52;"BI";"Burundi";2;0;"09/30/2004 11:25:43";NULL

53;"BJ";"Benin";2;0;"09/30/2004 11:25:43";NULL

54;"BM";"Bermuda";4;0;"09/30/2004 11:25:43";NULL

55;"BN";"Brunei Darussalam";1;0;"09/30/2004 11:25:43";NULL

56;"BO";"Bolivia";5;0;"09/30/2004 11:25:43";NULL

57;"BS";"Bahamas";7;0;"09/30/2004 11:25:43";NULL

58;"BT";"Bhutan";1;0;"09/30/2004 11:25:43";NULL

59;"BV";"Bouvet Island";5;0;"09/30/2004 11:25:43";NULL

60;"BW";"Botswana";2;0;"09/30/2004 11:25:43";NULL

61;"BY";"Belarus";3;0;"09/30/2004 11:25:43";NULL

2、執行導入命令

C:/>sqlldr userid=system/manager control=test.ctl

c)複雜格式的導入

Sqlldr

sql loader可以把一些以文本格式存放的數據順利的導入到oracle數據庫中,

是一種在不同數據庫之間進行數據遷移的非常方便而且通用的工具。

缺點就速度比較慢,另外對blob等類型的數據就有點麻煩了。

用法: SQLLDR keyword=value [,keyword=value,...]

 

有效的關鍵字:

    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

  與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)

 

注意:有兩種方式可以指定命令行參數:通過位置或者通過關鍵字。前者的例子:'sqlldr scott/tiger foo';

後者的例子:'sqlldr control=foo userid=scott/tiger';

不能前面使用關鍵字指定後面通過位置制定的混合方式;

比如:'sqlldr scott/tiger control=foo logfile=log' 是允許的,

但'sqlldr scott/tiger control=foo log'不允許。

爲清楚起見最好所有命令行參數都用關鍵字指定。

控制文件:

一個控制命令的腳本文件,通常以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 以空白分割

 

TRAILING NULLCOLS            表的字段沒有對應的值時允許爲空

 

************* 下面是表的字段

(

col_1 , col_2 ,col_filler FILLER // FILLER 關鍵字 此列的數值不會被裝載

// 如: lg,lg,not 結果 lg lg

)

如果沒聲明FIELDS TERMINATED BY ',' 時,可以用下面兩種方式實現同樣功能:

1.爲每一列指定分隔符

 (

 col_1 [interger external] TERMINATED BY ',' ,

 col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,

 col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'

 )

2.用位置告訴字段裝載數據

 (

col_1 position(1:2),

 col_2 position(3:10),

 col_3 position(*:16), // 這個字段的開始位置在前一字段的結束位置

 col_4 position(1:16),

 col_5 position(3:10) char(8) // 指定字段的類型

 )

 

BEGINDATA         對應開始的 INFILE * 要導入的內容就在control文件裏

10,Sql,what

20,lg,show

asp.net調用bat和ctl文件實現sql*loader的功能

1  後臺調用bat文件

            Dim proc As System.Diagnostics.Process

            proc = System.Diagnostics.Process.Start("cmd.exe", " /c " & "D:\execise\SE004.bat")

            proc.WaitForExit()

  或者

        Shell("cmd.exe /c D:\execise\SE004.bat", AppWinStyle.NormalFocus)

 或者

             Dim p As New System.Diagnostics.Process

            'p.StartInfo.FileName = "cmd.exe"

            'p.StartInfo.Arguments = " /c " & "D:\execise\SE004.bat"

            'p.StartInfo.UseShellExecute = False

            'p.StartInfo.RedirectStandardInput = True

            'p.StartInfo.RedirectStandardOutput = True

            'p.StartInfo.RedirectStandardError = True

            'p.StartInfo.CreateNoWindow = False

            'p.Start()

            'Dim strValue As String = p.StandardOutput.ReadToEnd()

2  然後調用ctl文件,bat文件的

    SQLLDR USERID=spv3/paper@san CONTROL=d:\execise\SE004.CTL log=D:\execise\LOG\SE004.log

3, ctl文件的內容如下

LOAD DATA

INFILE 'D:\execise\SE004.CSV'

TRUNCATE

INTO TABLE TEMP_tableName

FIELDS TERMINATED BY ","

TRAILING NULLCOLS

(

id

,age

,num

,sum

)

4. 數據文件以 逗號分割

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章