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