SQL*Loader使用介紹
?
?
??? 今天學(xué)習(xí)一下使用SQL*Loader導(dǎo)入數(shù)據(jù)的方法。首先看一下對(duì)于SQLLDR命令的介紹:
?
?
?
1、SQL*Loader的基本特點(diǎn):
?
??? 01. 能裝入不同數(shù)據(jù)類型文件及多個(gè)數(shù)據(jù)文件的數(shù)據(jù)
??? 02. 可裝入固定格式、自由定界以及可度長格式的數(shù)據(jù)
??? 03. 可以裝入二進(jìn)制,壓縮十進(jìn)制數(shù)據(jù)
??? 04. 一次可對(duì)多個(gè)表裝入數(shù)據(jù)
??? 05. 連接多個(gè)物理記錄裝到一個(gè)記錄中
??? 06. 對(duì)一單記錄分解再裝入到表中
??? 07. 可以用?數(shù)對(duì)制定列生成唯一的Key
??? 08. 可對(duì)磁盤或磁帶數(shù)據(jù)文件裝入制表中
??? 09. 提供裝入錯(cuò)誤報(bào)告
??? 10. 可以將文件中的整型字符串,自動(dòng)轉(zhuǎn)成壓縮十進(jìn)制并裝入列表中。
??? 02. 可裝入固定格式、自由定界以及可度長格式的數(shù)據(jù)
??? 03. 可以裝入二進(jìn)制,壓縮十進(jìn)制數(shù)據(jù)
??? 04. 一次可對(duì)多個(gè)表裝入數(shù)據(jù)
??? 05. 連接多個(gè)物理記錄裝到一個(gè)記錄中
??? 06. 對(duì)一單記錄分解再裝入到表中
??? 07. 可以用?數(shù)對(duì)制定列生成唯一的Key
??? 08. 可對(duì)磁盤或磁帶數(shù)據(jù)文件裝入制表中
??? 09. 提供裝入錯(cuò)誤報(bào)告
??? 10. 可以將文件中的整型字符串,自動(dòng)轉(zhuǎn)成壓縮十進(jìn)制并裝入列表中。
?
2、SQL*Loader各類文件說明:
?
??? ① 控制文件
??????? SQL*Loader根據(jù)控制文件找到需要加載的數(shù)據(jù),并且分析和解釋這些數(shù)據(jù)。控制文件由三個(gè)部分組成:
??????? 01.
全局選件、行、跳過的記錄數(shù)等;
??????? 02. INFILE子句指定的輸入數(shù)據(jù);
??????? 03. 數(shù)據(jù)特性的說明;
??????? 02. INFILE子句指定的輸入數(shù)據(jù);
??????? 03. 數(shù)據(jù)特性的說明;
?
??? ② 輸入文件
??????? 需要在控制文件中指定輸入文件(INFILE)的格式,具體性質(zhì)如下:
??????? 01. 正常指定文件格式 INFILE 'example.dat'
??????? 02. 若導(dǎo)入的數(shù)據(jù)直接在控制文件中,則用 INFILE * ... BEGINDATA ...
??????? 03. 若導(dǎo)入數(shù)據(jù)在其他文件中,且每條記錄定長,則使用 INFILE 'example.dat' "FIX 11"
??????? 04. 若導(dǎo)入數(shù)據(jù)在其他文件中,且每條記錄不定長,則使用 INFILE 'example.dat' "VAR 3"
???????? 注:長度包括分隔符,具體使用案例見下文
?
??? ③ 壞文件
??????? 壞文件包含那些被SQL*Loader拒絕的記錄,被拒絕的記錄可能是不符合要求的記錄。
??????? 壞文件的名字由SQL*Loader命令的BADFILE參數(shù)來給定。
??????? 壞文件的名字由SQL*Loader命令的BADFILE參數(shù)來給定。
??? ④ 日志文件及日志信息
??????? 當(dāng)SQL*Loader開始執(zhí)行后,它就自動(dòng)建立日志文件。
??????? 日志文件包含有加載的總結(jié),加載中的錯(cuò)誤信息等。
?
3、編寫控制文件
?
控制文件的格式如下:
?
OPTIONS
({[SKIP=integer] [LOAD = integer][ERRORS = integer] [ROWS=integer]
? [BINDSIZE=integer][SILENT=(ALL|FEEDBACK|ERROR|DISCARD)]})
LOAD[DATA]
[ { INFILE | INDDN } {file | * } ]
[STREAM | RECORD | FIXED length [BLOCKSIZE size]|VARIABLE [length] ]
[ {BADFILE | BADDN } file ]
[ {DISCARDS | DISCARDMAX} integr ]
[ {INDDN | INFILE} . . . ]
[ APPEND | REPLACE | INSERT ]
[RECLENT integer]
[ { CONCATENATE integer |
CONTINUEIF { [THIS | NEXT] (start[: end])LAST }
Operator { 'string' | X 'hex' } } ]
INTO TABLE [user.]table
[APPEND | REPLACE|INSERT]
[WHEN condition [AND condition]...]
[FIELDS [delimiter] ]
(
column {
RECNUM | CONSTANT value |
SEQUENCE ( { integer | MAX |COUNT} [, increment] ) |
[POSITION ( { start [end] | * [ + integer] }
) ]
datatype
[TERMINATED [ BY ] {WHITESPACE| [X] 'character' } ]
[ [OPTIONALLY] ENCLOSE[BY] [X]'charcter']
[NULLIF condition ]
[DEFAULTIF condotion]
}
[ ,...]
)
[INTO TABLE...]
[BEGINDATA]
LOAD[DATA]
[ { INFILE | INDDN } {file | * } ]
[STREAM | RECORD | FIXED length [BLOCKSIZE size]|VARIABLE [length] ]
[ {BADFILE | BADDN } file ]
[ {DISCARDS | DISCARDMAX} integr ]
[ {INDDN | INFILE} . . . ]
[ APPEND | REPLACE | INSERT ]
[RECLENT integer]
[ { CONCATENATE integer |
CONTINUEIF { [THIS | NEXT] (start[: end])LAST }
Operator { 'string' | X 'hex' } } ]
INTO TABLE [user.]table
[APPEND | REPLACE|INSERT]
[WHEN condition [AND condition]...]
[FIELDS [delimiter] ]
(
column {
RECNUM | CONSTANT value |
SEQUENCE ( { integer | MAX |COUNT} [, increment] ) |
[POSITION ( { start [end] | * [ + integer] }
) ]
datatype
[TERMINATED [ BY ] {WHITESPACE| [X] 'character' } ]
[ [OPTIONALLY] ENCLOSE[BY] [X]'charcter']
[NULLIF condition ]
[DEFAULTIF condotion]
}
[ ,...]
)
[INTO TABLE...]
[BEGINDATA]
?
?
說明:
?
①要加載的數(shù)據(jù)文件:
?
??? 01.INFILE和INDDN是同義詞,它們后面都是要加載的數(shù)據(jù)文件;如果用 * 則表示數(shù)據(jù)就在控制文件內(nèi);在INFILE后可以跟幾個(gè)文件;
??? 02.STRAM表示一次讀一個(gè)字節(jié)的數(shù)據(jù)。新行代表新物理記錄(邏輯記錄可由幾個(gè)物理記錄組成);
??? 03.RECORD使用宿主操作系統(tǒng)文件及記錄管理系統(tǒng)。如果數(shù)據(jù)在控制文件中則使用這種方法;
??? 02.STRAM表示一次讀一個(gè)字節(jié)的數(shù)據(jù)。新行代表新物理記錄(邏輯記錄可由幾個(gè)物理記錄組成);
??? 03.RECORD使用宿主操作系統(tǒng)文件及記錄管理系統(tǒng)。如果數(shù)據(jù)在控制文件中則使用這種方法;
??? 0
4.FIXED length要讀的記錄長度為length字節(jié);
??? 05.VARIABLE 被讀的記錄中前兩個(gè)字節(jié)包含的長度,length記錄可能的長度。缺省為8k字節(jié);
??? 06.BADFILE和BADDN同義,存放Oracle不能加載數(shù)據(jù)到數(shù)據(jù)庫的那些記錄;
??? 07.DISCARDFILE和DISCARDDN是同義詞,記錄沒有通過的數(shù)據(jù);
??? 05.VARIABLE 被讀的記錄中前兩個(gè)字節(jié)包含的長度,length記錄可能的長度。缺省為8k字節(jié);
??? 06.BADFILE和BADDN同義,存放Oracle不能加載數(shù)據(jù)到數(shù)據(jù)庫的那些記錄;
??? 07.DISCARDFILE和DISCARDDN是同義詞,記錄沒有通過的數(shù)據(jù);
??? 0
8.DISCARDS和DISCARDMAX是同義詞,Integer為最大放棄的文件個(gè)數(shù)。
?
② 加載的方法:
?
??? 01.APPEND 給表添加行
??? 02.INSERT 給空表增加行(如果表中有記錄則退出)
??? 03.REPLACE 先清空表在加載數(shù)據(jù)
??? 04.RECLEN 用于兩種情況:
??? 02.INSERT 給空表增加行(如果表中有記錄則退出)
??? 03.REPLACE 先清空表在加載數(shù)據(jù)
??? 04.RECLEN 用于兩種情況:
??????? 1> SQLLDR不能自動(dòng)計(jì)算記錄長度
??????? 2> 或用戶想看壞文件的完整記錄時(shí)(Oracle只能按常規(guī)把壞記錄部分寫到錯(cuò)誤的地方,如果看整條記錄,則可以將整條記錄寫到壞文件中)
?
③ 指定最大的記錄長度:
?
??? CONCATENATE允許用戶設(shè)定一個(gè)整數(shù),表示要組合邏輯記錄的數(shù)目。
?
④建立邏輯記錄:
?
??? 01. THIS 檢查當(dāng)前記錄條件,如果為真則連接下一個(gè)記錄。
??? 02. NEXT 檢查下一個(gè)記錄條件。如果為真,則連接下一個(gè)記錄到當(dāng)前記錄來。
??? 03. start:end 表示要檢查在THIS或NEXT字串是否存在繼續(xù)串的列,以確定是否進(jìn)行連接。
??? 02. NEXT 檢查下一個(gè)記錄條件。如果為真,則連接下一個(gè)記錄到當(dāng)前記錄來。
??? 03. start:end 表示要檢查在THIS或NEXT字串是否存在繼續(xù)串的列,以確定是否進(jìn)行連接。
??????? 如:continueif next(1-3)='WAG' 或continueif next(1-3)=X'0d03if'
?
⑤指定要加載的表:
?
??? 01. INTO TABLE 要加的表名。
??? 02. WHEN 和select WHERE類似。用來檢查記錄的情況,如:when(3-5)='SSM' and (22)='*'
??? 02. WHEN 和select WHERE類似。用來檢查記錄的情況,如:when(3-5)='SSM' and (22)='*'
?
⑥介紹并括起記錄中的字段:
?
??? FIELDS給出記錄中字段的分隔符,F(xiàn)IELDS格式為:
?
??? FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
??? [[OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
??? [[OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
?
??? 01. TERMINATED:讀完前一個(gè)字段即開始讀下一個(gè)字段直到結(jié)束。
??? 02. WHITESPACE:是指結(jié)束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。如果是要判斷結(jié)束字符,可以用單引號(hào)括起,如X'1B'等。
??? 03. OPTIONALLY ENCLOSED:表示數(shù)據(jù)應(yīng)由特殊字符括起來,也可以括在TERMINATED字符內(nèi),使用OPTIONALLY要同時(shí)用TERMINLATED。
??? 04. ENCLOSED:指兩個(gè)分界符內(nèi)的數(shù)據(jù)。如果同時(shí)用 ENCLOSED和TERMINAED ,則它們的順序決定計(jì)算的順序。
??? 02. WHITESPACE:是指結(jié)束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。如果是要判斷結(jié)束字符,可以用單引號(hào)括起,如X'1B'等。
??? 03. OPTIONALLY ENCLOSED:表示數(shù)據(jù)應(yīng)由特殊字符括起來,也可以括在TERMINATED字符內(nèi),使用OPTIONALLY要同時(shí)用TERMINLATED。
??? 04. ENCLOSED:指兩個(gè)分界符內(nèi)的數(shù)據(jù)。如果同時(shí)用 ENCLOSED和TERMINAED ,則它們的順序決定計(jì)算的順序。
?
??? [X]算法 select utl_raw.cast_to_raw('gdj3') from dual;
?
⑦定義列:
?
??? column是表列名,列的取值可以是:
??? 01. BECHUM 表示邏輯記錄數(shù)。第一個(gè)記錄為1,第2個(gè)記錄為2。
??? 02. CONSTANT 表示賦予常數(shù)。
??? 03. SEQUENCE 表示序列可以從任意序號(hào)開始,格式為:
????????? SEQUENCE ( { integer | MAX |COUNT} [,increment]
??? 04. POSITION 給出列在邏輯記錄中的位置。可以是絕對(duì)的,或相對(duì)前一列的值。格式為:
????????? POSITION ( {start[end] | * [+integer] } )
??? 05. Start 開始位置
????????? * 表示前字段之后立刻開始。
????????? + 從前列開始向后條的位置數(shù)。
?
⑧定義數(shù)據(jù)類型:
??? 可以定義14種數(shù)據(jù)類型:
???
CHAR:字符類型數(shù)據(jù),length缺省為1
??????? 格式:CHAR[(length)] [delimiter]
??? DATE:日期類型數(shù)據(jù),使用to_date函數(shù)來限制
???????
格式:DATE [(length)]['date_format'] [delimiter]
??? DECIMAL EXTERNAL:字符格式中的十進(jìn)制,用于常規(guī)格式的十進(jìn)制數(shù)
??????? 格式:DECIMAL EXTERNAL [(length)] [delimiter]
???
DECIMAL:壓縮十進(jìn)制格式數(shù)據(jù)
??????? 格式:DECIMAL (digtial [,divcision])
??????? 格式:DECIMAL (digtial [,divcision])
??? DOUBLE:雙精度符點(diǎn)二進(jìn)制
??????? 格式:DOUBLE
??? FLOAT:普通浮點(diǎn)二進(jìn)制
??????? 格式:FLOAT
??? FLOAT EXTERNAL:字符格式浮點(diǎn)數(shù)
??????? 格式:FLOAT EXTERNAL [(length)] [delimiter]
?
???
GRAPHIC:雙字節(jié)字符串?dāng)?shù)據(jù)
??????? 格式:GRAPHIC [(legth)]
??????? 格式:GRAPHIC [(legth)]
??? GRAPHIC EXTERNAL:雙字節(jié)字符串?dāng)?shù)據(jù)
??????? 格式:GRAPHIC EXTERNAL[(legth)]
??? INTEGER:常規(guī)全字二進(jìn)制整數(shù)
??? INTEGER EXTERNAL:字符格式整數(shù)
??? SMALLINT:常規(guī)全字二進(jìn)制數(shù)據(jù)
??? VARCHAR:可變長度字符串
??? VARGRAPHIC:可變雙字節(jié)字符串?dāng)?shù)據(jù)
?
?
4、
數(shù)據(jù)文件的內(nèi)容
?
??? 數(shù)據(jù)文件可以是在OS下的一個(gè)文件;或跟在控制文件下的具體數(shù)據(jù)。數(shù)據(jù)文件可以是:
???
01. 二進(jìn)制與字符格式:SQL*Loader可以把二進(jìn)制文件讀(當(dāng)成字符讀)到列表中;
??? 02. 固定格式:記錄中的數(shù)據(jù)、數(shù)據(jù)類型、數(shù)據(jù)長度固定;
??? 03. 可變格式:每個(gè)記錄至少有一個(gè)可變長數(shù)據(jù)字段,一個(gè)記錄可以是一個(gè)連續(xù)的字符串;
??? 02. 固定格式:記錄中的數(shù)據(jù)、數(shù)據(jù)類型、數(shù)據(jù)長度固定;
??? 03. 可變格式:每個(gè)記錄至少有一個(gè)可變長數(shù)據(jù)字段,一個(gè)記錄可以是一個(gè)連續(xù)的字符串;
??? 04. 數(shù)據(jù)段的分界(如姓名、年齡)如用','作字段的劃分;用'"'作數(shù)據(jù)括號(hào)等;
??? 05. SQL*Loader可以使用多個(gè)連續(xù)字段的物理記錄組成一個(gè)邏輯記錄,記錄文件運(yùn)行情況文件,包括以下內(nèi)容:
??????? 1、運(yùn)行日期、軟件版本號(hào)
??????? 2、全部輸入、輸出文件名;對(duì)命令行的展示信息、補(bǔ)充信息,
??????? 3、對(duì)每個(gè)裝入信息報(bào)告:如表名,裝入情況;對(duì)初始裝入、加截或更新裝入的選擇情況
??????? 4、數(shù)據(jù)錯(cuò)誤報(bào)告:錯(cuò)誤碼;放棄記錄報(bào)告
??????? 5、每個(gè)裝X報(bào)告:裝入行、裝入行數(shù)、可能跳過行數(shù)、可能拒絕行數(shù)、可能放棄行數(shù)等
??????? 6、統(tǒng)計(jì)概要:使用空間(包大小、長度)、讀入記錄數(shù)、裝入記錄數(shù)、跳過記錄數(shù);拒絕記錄數(shù)、放棄記錄數(shù);運(yùn)行時(shí)間等。
??? 05. SQL*Loader可以使用多個(gè)連續(xù)字段的物理記錄組成一個(gè)邏輯記錄,記錄文件運(yùn)行情況文件,包括以下內(nèi)容:
??????? 1、運(yùn)行日期、軟件版本號(hào)
??????? 2、全部輸入、輸出文件名;對(duì)命令行的展示信息、補(bǔ)充信息,
??????? 3、對(duì)每個(gè)裝入信息報(bào)告:如表名,裝入情況;對(duì)初始裝入、加截或更新裝入的選擇情況
??????? 4、數(shù)據(jù)錯(cuò)誤報(bào)告:錯(cuò)誤碼;放棄記錄報(bào)告
??????? 5、每個(gè)裝X報(bào)告:裝入行、裝入行數(shù)、可能跳過行數(shù)、可能拒絕行數(shù)、可能放棄行數(shù)等
??????? 6、統(tǒng)計(jì)概要:使用空間(包大小、長度)、讀入記錄數(shù)、裝入記錄數(shù)、跳過記錄數(shù);拒絕記錄數(shù)、放棄記錄數(shù);運(yùn)行時(shí)間等。
?
?
5、SQLLDR的命令:
?
??? 基本看最最上面的那個(gè)圖就OK了,隨便舉個(gè)例子:
??? D:\Test>sqlldr
userid=wangxiaoqi/wangxiaoqi@dodo
control=sqlldr.ctl
?
??? 需要注意的是:最好先轉(zhuǎn)到相應(yīng)目錄下面在執(zhí)行操作,另外可以對(duì)遠(yuǎn)程數(shù)據(jù)庫進(jìn)行操作!
?
??? 再具體一點(diǎn)的操作說明可以上該網(wǎng)站:
http://www.psoug.org/reference/sqlloader.html
?
?
?
??? 總結(jié):實(shí)在沒有太多的時(shí)間去仔細(xì)研究文檔,所以直接找了網(wǎng)上一篇記載得比較詳細(xì)的文章,粗略的看了一遍,修改了一下格式,文章錯(cuò)誤的地方有很多,沒有看明白的地方也有很多,不過總得來說,SQL*Loader的實(shí)際應(yīng)用還是相對(duì)比較簡單的,下一篇打算找一些實(shí)例加深一下了解,具體的參數(shù)可參見Oracle的官方文檔 《Utilities》
?
??? 說完!
?
?