Oracle 的SQL*LOADER能夠將外部數據加載到數據庫表中。下面是SQL*LOADER的基本特色:
1)能裝入不一樣數據類型文件及多個數據文件的數據
2)可裝入固定格式,自由定界以及可度長格式的數據
3)能夠裝入二進制,壓縮十進制數據
4)一次可對多個表裝入數據
5)鏈接多個物理記錄裝到一個記錄中
6)對一單記錄分解再裝入到表中
7)能夠用 數對制定列生成惟一的KEY
8)可對磁盤或 磁帶數據文件裝入製表中
9)提供裝入錯誤報告
10)能夠將文件中的整型字符串,自動轉成壓縮十進制並裝入列表中。
2)可裝入固定格式,自由定界以及可度長格式的數據
3)能夠裝入二進制,壓縮十進制數據
4)一次可對多個表裝入數據
5)鏈接多個物理記錄裝到一個記錄中
6)對一單記錄分解再裝入到表中
7)能夠用 數對制定列生成惟一的KEY
8)可對磁盤或 磁帶數據文件裝入製表中
9)提供裝入錯誤報告
10)能夠將文件中的整型字符串,自動轉成壓縮十進制並裝入列表中。
1.2控制文件
控制文件是用一種語言寫的文本文件,這個文本文件能被SQL*LOADER識別。SQL*LOADER根據控制文件能夠找到須要加載的數據。而且分析和解釋這些數據。控制文件由三個部分組成:
控制文件是用一種語言寫的文本文件,這個文本文件能被SQL*LOADER識別。SQL*LOADER根據控制文件能夠找到須要加載的數據。而且分析和解釋這些數據。控制文件由三個部分組成:
l 全局選件,行,跳過的記錄數等;
l INFILE子句指定的輸入數據;
l 數據特性說明。
l INFILE子句指定的輸入數據;
l 數據特性說明。
1.3輸入文件
對於 SQL*Loader, 除控制文件外就是輸入數據。SQL*Loader可從一個或多個指定的文件中讀出數據。若是 數據是在控制文件中指定,就要在控制文件中寫成 INFILE * 格式。當數據固定的格式(長度同樣)時且是在文件中獲得時,要用INFILE "fix n"
對於 SQL*Loader, 除控制文件外就是輸入數據。SQL*Loader可從一個或多個指定的文件中讀出數據。若是 數據是在控制文件中指定,就要在控制文件中寫成 INFILE * 格式。當數據固定的格式(長度同樣)時且是在文件中獲得時,要用INFILE "fix n"
load data
infile 'example.dat' "fix 11"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
col2 char(7))
example.dat:
001, cd, 0002,fghi,
00003,lmn,
1, "pqrs",
0005,uvwx,
infile 'example.dat' "fix 11"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
col2 char(7))
example.dat:
001, cd, 0002,fghi,
00003,lmn,
1, "pqrs",
0005,uvwx,
當數據是可變格式(長度不同)時且是在文件中獲得時,要用INFILE "var n"。如:
load data
infile 'example.dat' "var 3"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
col2 char(7))
example.dat:
009hello,cd,010world,im,
012my,name is,
infile 'example.dat' "var 3"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
col2 char(7))
example.dat:
009hello,cd,010world,im,
012my,name is,
1.4壞文件
壞文件包含那些被SQL*Loader拒絕的記錄。被拒絕的記錄多是不符合要求的記錄。
壞文件的名字由 SQL*Loader命令的BADFILE 參數來給定。
壞文件包含那些被SQL*Loader拒絕的記錄。被拒絕的記錄多是不符合要求的記錄。
壞文件的名字由 SQL*Loader命令的BADFILE 參數來給定。
1.5日誌文件及日誌信息
當SQL*Loader 開始執行後,它就自動創建 日誌文件。日誌文件包含有加載的總結,加載中的錯誤信息等。
當SQL*Loader 開始執行後,它就自動創建 日誌文件。日誌文件包含有加載的總結,加載中的錯誤信息等。
控制文件語法
控制文件的格式以下:
控制文件的格式以下:
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]
[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]
1)要加載的數據文件:
1.INFILE 和INDDN是同義詞,它們後面都是要加載的數據文件。若是用 * 則表示數據就在控制文件內。在INFILE 後能夠跟幾個文件。
2.STRAM 表示一次讀一個字節的數據。新行表明新物理記錄(邏輯記錄可由幾個物理記錄組成)。
3.RECORD 使用宿主操做系統文件及記錄管理系統。若是數據在控制文件中則使用這種方法。
3. FIXED length 要讀的記錄長度爲length字節,
4. VARIABLE 被讀的記錄中前兩個字節包含的長度,length 記錄可能的長度。缺傷爲8k字節。
5. BADFILE和BADDN同義。Oracle 不能加載數據到數據庫的那些記錄。
6. DISCARDFILE和DISCARDDN是同義詞。記錄沒有經過的數據。
7. DISCARDS和DISCARDMAX是同義詞。Integer 爲最大放棄的文件個數。
2.STRAM 表示一次讀一個字節的數據。新行表明新物理記錄(邏輯記錄可由幾個物理記錄組成)。
3.RECORD 使用宿主操做系統文件及記錄管理系統。若是數據在控制文件中則使用這種方法。
3. FIXED length 要讀的記錄長度爲length字節,
4. VARIABLE 被讀的記錄中前兩個字節包含的長度,length 記錄可能的長度。缺傷爲8k字節。
5. BADFILE和BADDN同義。Oracle 不能加載數據到數據庫的那些記錄。
6. DISCARDFILE和DISCARDDN是同義詞。記錄沒有經過的數據。
7. DISCARDS和DISCARDMAX是同義詞。Integer 爲最大放棄的文件個數。
2)加載的方法:
1.APPEND 給表添加行。
2.INSERT 給空表增長行(若是表中有記錄則退出)。
3.REPLACE 先清空表在加載數據。
4. RECLEN 用於兩種狀況,1)SQLLDR不能自動計算記錄長度,2)或用戶想看壞文件的完整記錄時。對於後一種,Oracle只能按常規把壞記錄部分寫到錯誤的地方。若是看整條記錄,則能夠將整條記錄寫到壞文件中。
2.INSERT 給空表增長行(若是表中有記錄則退出)。
3.REPLACE 先清空表在加載數據。
4. RECLEN 用於兩種狀況,1)SQLLDR不能自動計算記錄長度,2)或用戶想看壞文件的完整記錄時。對於後一種,Oracle只能按常規把壞記錄部分寫到錯誤的地方。若是看整條記錄,則能夠將整條記錄寫到壞文件中。
3)指定最大的記錄長度:
1. CONCATENATE 容許用戶設定一個整數,表示要組合邏輯記錄的數目。
4)創建邏輯記錄:
1.THIS 檢查當前記錄條件,若是爲真則鏈接下一個記錄。
2.NEXT 檢查下一個記錄條件。若是爲真,則鏈接下一個記錄到當前記錄來。
2. Start: end 表示要檢查在THIS或NEXT字串是否存在繼續串的列,以肯定是否進行鏈接。如:continueif next(1-3)='WAG' 或continueif next(1-3)=X'0d03if'
2.NEXT 檢查下一個記錄條件。若是爲真,則鏈接下一個記錄到當前記錄來。
2. Start: end 表示要檢查在THIS或NEXT字串是否存在繼續串的列,以肯定是否進行鏈接。如:continueif next(1-3)='WAG' 或continueif next(1-3)=X'0d03if'
5)指定要加載的表:
1.INTO TABLE 要加的表名。
2.WHEN 和select WHERE相似。用來檢查記錄的狀況,如:when(3-5)='SSM' and (22)='*"
6)介紹並括起記錄中的字段:
1. FIELDS給出記錄中字段的分隔符,FIELDS格式爲:
FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
[ [ OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
[ [ OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
TERMINATED 讀完前一個字段即開始讀下一個字段直到介紹。
WHITESPACE 是指結束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。若是是要判斷但字符,能夠用單引號括起,如X'1B'等。
OPTIONALLY ENCLOSED 表示數據應由特殊字符括起來。也能夠括在TERMINATED字符內。使用OPTIONALLY要同時用TERMINLATED。
ENCLOSED 指兩個分界符內的數據。若是同時用 ENCLOSED和TERMINAED ,則它們的順序決定計算的順序。
WHITESPACE 是指結束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。若是是要判斷但字符,能夠用單引號括起,如X'1B'等。
OPTIONALLY ENCLOSED 表示數據應由特殊字符括起來。也能夠括在TERMINATED字符內。使用OPTIONALLY要同時用TERMINLATED。
ENCLOSED 指兩個分界符內的數據。若是同時用 ENCLOSED和TERMINAED ,則它們的順序決定計算的順序。
7)定義列:
column 是表列名。列的取值能夠是:
BECHUM 表示邏輯記錄數。第一個記錄爲1,第2個記錄爲2。
CONSTANT 表示賦予常數。
SEQUENCE 表示序列能夠從任意序號開始,格式爲:
SEQUENCE ( { integer | MAX |COUNT} [,increment]
POSITION 給出列在邏輯記錄中的位置。能夠是絕對的,或相對前一列的值。格式爲:
POSITION ( {start[end] | * [+integer] } )
Start 開始位置
* 表示前字段以後馬上開始。
+ 從前列開始向後條的位置數。
BECHUM 表示邏輯記錄數。第一個記錄爲1,第2個記錄爲2。
CONSTANT 表示賦予常數。
SEQUENCE 表示序列能夠從任意序號開始,格式爲:
SEQUENCE ( { integer | MAX |COUNT} [,increment]
POSITION 給出列在邏輯記錄中的位置。能夠是絕對的,或相對前一列的值。格式爲:
POSITION ( {start[end] | * [+integer] } )
Start 開始位置
* 表示前字段以後馬上開始。
+ 從前列開始向後條的位置數。
8)定義數據類型:
能夠定義14種數據類型:
CHAR
DATE
DECIMAL EXTERNAL
DECIMAL
DOUBLE
FLOAT
FLOAT EXTERNAL
GRAPHIC EXTERNAL
INTEGER
INTEGER EXTERNAL
SMALLINT
VARCHAR
VARGRAPHIC
能夠定義14種數據類型:
CHAR
DATE
DECIMAL EXTERNAL
DECIMAL
DOUBLE
FLOAT
FLOAT EXTERNAL
GRAPHIC EXTERNAL
INTEGER
INTEGER EXTERNAL
SMALLINT
VARCHAR
VARGRAPHIC
1.字符類型數據
CHAR[ (length)] [delimiter]
length缺省爲 1.
2.日期類型數據
DATE [ ( length)]['date_format' [delimiter]
使用to_date函數來限制。
CHAR[ (length)] [delimiter]
length缺省爲 1.
2.日期類型數據
DATE [ ( length)]['date_format' [delimiter]
使用to_date函數來限制。
3.字符格式中的十進制
DECIMAL EXTERNAL [(length)] [delimiter]
用於常規格式的十進制數(不是二進制=> 一個位等於一個bit)。
DECIMAL EXTERNAL [(length)] [delimiter]
用於常規格式的十進制數(不是二進制=> 一個位等於一個bit)。
4.壓縮十進制格式數據
DECIMAL (digtial [,precision])
DECIMAL (digtial [,precision])
5.雙精度符點二進制
DOUBLE
DOUBLE
6.普通符點二進制
FLOAT
FLOAT
7.字符格式符點數
FLOAT EXTERNAL [ (length) ] [delimiter]
FLOAT EXTERNAL [ (length) ] [delimiter]
8.雙字節字符串數據
GRAPHIC [ (legth)]
GRAPHIC [ (legth)]
9.雙字節字符串數據
GRAPHIC EXTERNAL[ (legth)]
GRAPHIC EXTERNAL[ (legth)]
10.常規全字二進制整數
INTEGER
INTEGER
11.字符格式整數
INTEGER EXTERNAL
INTEGER EXTERNAL
12.常規全字二進制數據
SMALLINT
SMALLINT
13.可變長度字符串
VARCHAR
VARCHAR
14.可變雙字節字符串數據
VARGRAPHIC
VARGRAPHIC
2.2寫控制文件CTL
1. 各數據文件的文件名;
2.各數據文件格式;
3.各數據文件裏各數據記錄字段的屬性;
4.接受數據的ORACLE表列的屬性;
5.數據定義;
6.其它
2.各數據文件格式;
3.各數據文件裏各數據記錄字段的屬性;
4.接受數據的ORACLE表列的屬性;
5.數據定義;
6.其它
數據文件的要求:
數據類型的指定
CHAR 字符型
INTEGER EXTERNAL 整型
DECIMAL EXTERNAL 浮點型
CHAR 字符型
INTEGER EXTERNAL 整型
DECIMAL EXTERNAL 浮點型
3.1數據文件的內容
能夠在OS下的一個文件;或跟在控制文件下的具體數據。數據文件能夠是:
一、 二進制與字符格式:LOADER能夠把二進制文件讀(當成字符讀)列表中
二、 固定格式:記錄中的數據、數據類型、 數據長度固定。
三、 可變格式:每一個記錄至少有一個可變長數據字段,一個記錄能夠是一個連續的字符串。
數據段的分界(如姓名、年齡)如用「,」做字段的 分 ;用,"’做數據
括號等
四、 LOADER可使用多個連續字段的物理記錄組成一個邏輯記錄,記錄文件運行狀況文件:包括如下內容:
一、 運行日期:軟件版本號
二、 所有輸入,輸出文件名;對命令行的展現信息,補充信息,
三、 對每一個裝入信息報告:如表名,裝入狀況;對初始裝入, 加截入或更新裝
入的選擇狀況,欄信息
四、 數據錯誤報告:錯誤碼;放棄記錄報告
五、 每一個裝X報告:裝入行;裝入行數,可能跳過行數;可能拒絕行數;可能放
棄行數等
六、 統計概要:使用空間(包大小,長度);讀入記錄數,裝入記錄數,跳過記
錄數;拒絕記錄數,放棄記錄數;運行時間等。
一、 二進制與字符格式:LOADER能夠把二進制文件讀(當成字符讀)列表中
二、 固定格式:記錄中的數據、數據類型、 數據長度固定。
三、 可變格式:每一個記錄至少有一個可變長數據字段,一個記錄能夠是一個連續的字符串。
數據段的分界(如姓名、年齡)如用「,」做字段的 分 ;用,"’做數據
括號等
四、 LOADER可使用多個連續字段的物理記錄組成一個邏輯記錄,記錄文件運行狀況文件:包括如下內容:
一、 運行日期:軟件版本號
二、 所有輸入,輸出文件名;對命令行的展現信息,補充信息,
三、 對每一個裝入信息報告:如表名,裝入狀況;對初始裝入, 加截入或更新裝
入的選擇狀況,欄信息
四、 數據錯誤報告:錯誤碼;放棄記錄報告
五、 每一個裝X報告:裝入行;裝入行數,可能跳過行數;可能拒絕行數;可能放
棄行數等
六、 統計概要:使用空間(包大小,長度);讀入記錄數,裝入記錄數,跳過記
錄數;拒絕記錄數,放棄記錄數;運行時間等。
==========================================================================================================
sql load的一點小總結
sqlldr userid=lgone/tiger control=a.ctl
LOAD DATA
INFILE 't.dat' // 要導入的文件
// INFILE 'tt.date' // 導入多個文件
// INFILE * // 要導入的內容就在control文件裏 下面的BEGINDATA後面就是導入的內容
LOAD DATA
INFILE 't.dat' // 要導入的文件
// INFILE 'tt.date' // 導入多個文件
// INFILE * // 要導入的內容就在control文件裏 下面的BEGINDATA後面就是導入的內容
INTO TABLE table_name // 指定裝入的表
BADFILE 'c:bad.txt' // 指定壞文件地址
BADFILE 'c:bad.txt' // 指定壞文件地址
************* 如下是4種裝入表的方式
APPEND // 原先的表有數據 就加在後面
// INSERT // 裝載空表 若是原先的表有數據 sqlloader會中止 默認值
// REPLACE // 原先的表有數據 原先的數據會所有刪除
// TRUNCATE // 指定的內容和replace的相同 會用truncate語句刪除現存數據
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
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) // 指定字段的類型
// )
(
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
10,Sql,what
20,lg,show
=====================================================================================
//////////// 注意begindata後的數值前面不能有空格
//////////// 注意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 列將爲空
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
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"
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
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
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);
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;
'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;
then
l_return :=
new_time( to_date('01011970','ddmmyyyy') + 1/24/60/60 *
p_string, 'GMT', 'EST' );
end if;
return l_return;
end;
/
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
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 *
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
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 ...
infile *
into table t
replace
( seqno RECNUM //載入每行的行號
text Position(1:1024))
BEGINDATA
fsdfasj //自動分配一行號給載入 表t 的seqno字段 此行爲 1
fasdjfasdfl // 此行爲 2 ...
9 ***** 載入有換行符的數據
注意: unix 和 windows 不一樣 n & /n
< 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 SalesnOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the AccountingnOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the ConsultingnOffice in Virginia
40,Finance,Virginia,987268297,This is the FinancenOffice in Virginia
注意: unix 和 windows 不一樣 n & /n
< 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 SalesnOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the AccountingnOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the ConsultingnOffice in Virginia
40,Finance,Virginia,987268297,This is the FinancenOffice in Virginia
< 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 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"
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"
< 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
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
< 4 > 使用str屬性
// 最靈活的一中 可定義一個新的行結尾符 win 回車換行 : chr(13)||chr(10)
// 最靈活的一中 可定義一個新的行結尾符 win 回車換行 : chr(13)||chr(10)
此列中記錄是以 a|rn 結束的
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;
結果 7C0D0A
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|
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 子句
象這樣的數據 用 nullif 子句
10-jan-200002350Flipper seemed unusually hungry today.
10510-jan-200009945Spread over three meals.
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
------------------------------------------------------------
// 下面是另外一個列子 第一行的 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
------------------------------------------------------------
若是是英文的日誌 格式,可能須要修改環境變量 nls_lang or nls_date_format
==========================================================================================================
Oracle SQL*Loader 使用指南(轉載)
SQL*Loader是Oracle數據庫導入外部數據的一個工具.它和DB2的Load工具類似,但有更多的選擇,它支持變化的加載模式,可選的加載及多表加載.
如何使用 SQL*Loader 工具
咱們能夠用Oracle的sqlldr工具來導入數據。例如:
sqlldr scott/tiger control=loader.ctl
控制文件(loader.ctl) 將加載一個外部數據文件(含分隔符). loader.ctl以下:
load data
infile 'c:datamydata.csv'
into table emp
fields terminated by "," optionally enclosed by '"'
( empno, empname, sal, deptno )
如何使用 SQL*Loader 工具
咱們能夠用Oracle的sqlldr工具來導入數據。例如:
sqlldr scott/tiger control=loader.ctl
控制文件(loader.ctl) 將加載一個外部數據文件(含分隔符). loader.ctl以下:
load data
infile 'c:datamydata.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
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
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, %sn', 'TextField', 55);
utl_file.fclose(fp);
end;
/
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, %sn', '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_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
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
能夠用 "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
在導入數據到數據庫時,能夠修改數據。注意,這僅適合於常規導入,並不適合 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
)
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
)
如:
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
)
以下例: (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
)
可用 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= 參數來指定每次提交記錄數。
通常狀況下是在導入數據文件數據後提交的。
也能夠經過指定 ROWS= 參數來指定每次提交記錄數。
提升 SQL*Loader 的性能:
1) 一個簡單而容易忽略的問題是,沒有對導入的表使用任何索引和/或約束(主鍵)。若是這樣作,甚至在使用ROWS=參數時,會很明顯下降數據庫導入性能。
2) 能夠添加 DIRECT=TRUE來提升導入數據的性能。固然,在不少狀況下,不能使用此參數。
3) 經過指定 UNRECOVERABLE選項,能夠關閉數據庫的日誌。這個選項只能和 direct 一塊兒使用。
4) 能夠同時運行多個導入任務.
1) 一個簡單而容易忽略的問題是,沒有對導入的表使用任何索引和/或約束(主鍵)。若是這樣作,甚至在使用ROWS=參數時,會很明顯下降數據庫導入性能。
2) 能夠添加 DIRECT=TRUE來提升導入數據的性能。固然,在不少狀況下,不能使用此參數。
3) 經過指定 UNRECOVERABLE選項,能夠關閉數據庫的日誌。這個選項只能和 direct 一塊兒使用。
4) 能夠同時運行多個導入任務.
常規導入與direct導入方式的區別:
常規導入能夠經過使用 INSERT語句來導入數據。Direct導入能夠跳過數據庫的相關邏輯(DIRECT=TRUE),而直接將數據導入到數據文件中。
常規導入能夠經過使用 INSERT語句來導入數據。Direct導入能夠跳過數據庫的相關邏輯(DIRECT=TRUE),而直接將數據導入到數據文件中。