SQL*Loader使用指南)

來源:互聯網
上載者:User
Oracle 的SQL*LOADER可以將外部資料載入到資料庫表中。下面是SQL*LOADER的基本特點:1)能裝入不同資料類型檔案及多個資料檔案的資料2)可裝入固定格式,自由定界以及可度長格式的資料3)可以裝入二進位,壓縮十進位資料4)一次可對多個表裝入資料5)串連多個物理記錄裝到一個記錄中6)對一單記錄分解再裝入到表中7)可以用 數對制定列產生唯一的KEY8)可對磁碟或 磁帶資料檔案裝入製表中9)提供裝入錯誤報表10)可以將檔案中的整型字串,自動轉成壓縮十進位並裝入列表中。1.2控制檔案控制檔案是用一種語言寫的文字檔,這個文字檔能被SQL*LOADER識別。SQL*LOADER根據控制檔案可以找到需要載入的資料。並且分析和解釋這些資料。控制檔案由三個部分組成:l 全域選件,行,跳過的記錄數等;l INFILE子句指定的輸入資料;l 資料特性說明。1.3輸入檔案對於 SQL*Loader, 除控制檔案外就是輸入資料。SQL*Loader可從一個或多個指定的檔案中讀出資料。如果資料是在控制檔案中指定,就要在控制檔案中寫成 INFILE * 格式。當資料固定的格式(長度一樣)時且是在檔案中得到時,要用INFILE "fix n"load datainfile 'example.dat' "fix 11"into table examplefields 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 datainfile 'example.dat' "var 3"into table examplefields 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 參數來給定。1.5記錄檔及日誌資訊當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]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)載入的方法:1.APPEND 給表添加行。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'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' ]TERMINATED 讀完前一個欄位即開始讀下一個欄位直到介紹。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 開始位置* 表示前欄位之後立刻開始。+ 從前列開始向後條的位置數。8)定義資料類型:可以定義14種資料類型:CHARDATEDECIMAL EXTERNALDECIMALDOUBLEFLOATFLOAT EXTERNALGRAPHIC EXTERNALINTEGERINTEGER EXTERNALSMALLINTVARCHARVARGRAPHIC1.字元類型資料CHAR[ (length)] [delimiter]length預設為 1.2.日期類型資料DATE [ ( length)]['date_format' [delimiter]使用to_date函數來限制。3.字元格式設定中的十進位DECIMAL EXTERNAL [(length)] [delimiter]用於常規格式的十進位數(不是二進位=> 一個位等於一個bit)。4.壓縮十進位格式資料DECIMAL (digtial [,divcision])5.雙精確度符點二進位DOUBLE6.普通符點二進位FLOAT7.字元格式設定符點數FLOAT EXTERNAL [ (length) ] [delimiter]8.雙位元組字元串資料GRAPHIC [ (legth)]9.雙位元組字元串資料GRAPHIC EXTERNAL[ (legth)]10.常規全字二進位整數INTEGER11.字元格式設定整數INTEGER EXTERNAL12.常規全字位元據SMALLINT13.可變長度字串VARCHAR14.可變雙位元組字元串資料VARGRAPHIC2.2寫控制檔案CTL1.各資料檔案的檔案名稱;2.各資料檔案格式;3.各資料檔案裡各資料記錄欄位的屬性;4.接受資料的ORACLE表列的屬性;5.資料定義;6.其它資料檔案的要求:資料類型的指定CHAR 字元型INTEGER EXTERNAL 整型DECIMAL EXTERNAL 浮點型3.1資料檔案的內容可以在OS下的一個檔案;或跟在控制檔案下的具體資料。資料檔案可以是:1、 二進位與字元格式設定:LOADER可以把二進位檔案讀(當成字元讀)列表中2、 固定格式:記錄中的資料、資料類型、 資料長度固定。3、 可變格式:每個記錄至少有一個可變長資料欄位,一個記錄可以是一個連續的字串。資料區段的分界(如姓名、年齡)如用“,”作欄位的 分 ;用,"’作資料括弧等4、 LOADER可以使用多個連續欄位的物理記錄組成一個邏輯記錄,記錄檔案運行情況檔案:包括以下內容:1、 運行日期:軟體版本號碼2、 全部輸入,輸出檔案名;對命令列的展示資訊,補充資訊,3、 對每個裝入資訊報告:如表名,裝入情況;對初始裝入, 加截入或更新裝入的選擇情況,欄資訊4、 資料錯誤報表:錯誤碼;放棄記錄報告5、 每個裝X報告:裝入行;裝入行數,可能跳過行數;可能拒絕行數;可能放棄行數等6、 統計概要:使用空間(包大小,長度);讀入記錄數,裝入記錄數,跳過記錄數;拒絕記錄數,放棄記錄數;已耗用時間等。==========================================================================================================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/20018 ***** 載入每行的行號 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-200009945Sdivad 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 ------------------------------------------------------------ 如果是英文的日誌 格式,可能需要修改環境變數 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 datainfile 'c:/data/mydata.csv'into table empfields terminated by "," optionally enclosed by '"'( empno, empname, sal, deptno )mydata.csv 如下:10001,"Scott Tiger", 1000, 4010002,"Frank Naude", 500, 20下面是一個指定記錄長度的樣本控制檔案。"*" 代表資料檔案與此檔案同名,即在後面使用BEGINDATA段來標識資料。load datainfile *replaceinto table departments( dept position (02:05) char(4),deptname position (08:27) char(20))begindataCOSC COMPUTER SCIENCEENGL ENGLISH LITERATUREMATH MATHEMATICSPOLY POLITICAL SCIENCEUnloader這樣的工具Oracle 沒有提供將資料匯出到一個檔案的工具。但是,我們可以用SQL*Plus的select 及 format 資料來輸出到一個檔案:set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool onspool oradata.txtselect col1 || ',' || col2 || ',' || col3from tab1where col2 = 'XYZ';spool off另外,也可以使用使用 UTL_FILE PL/SQL 包處理:rem Remember to update initSID.ora, utl_file_dir='c:/oradata' parameterdeclarefp utl_file.file_type;beginfp := utl_file.fopen('c:/oradata','tab1.txt','w');utl_file.putf(fp, '%s, %s/n', 'TextField', 55);utl_file.fclose(fp);end;/當然你也可以使用第三方工具,如SQLWays ,TOAD for Quest等。載入可變長度或指定長度的記錄如:LOAD DATAINFILE *INTO TABLE load_delimited_dataFIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'TRAILING NULLCOLS( data1,data2)BEGINDATA11111,AAAAAAAAAA22222,"A,B,C,D,"下面是匯入固定位置(固定長度)資料樣本:LOAD DATAINFILE *INTO TABLE load_positional_data( data1 POSITION(1:5),data2 POSITION(6:15))BEGINDATA11111AAAAAAAAAA22222BBBBBBBBBB跳過資料行:可以用 "SKIP n" 關鍵字來指定匯入時可以跳過多少行資料。如:LOAD DATAINFILE *INTO TABLE load_positional_dataSKIP 5( data1 POSITION(1:5),data2 POSITION(6:15))BEGINDATA11111AAAAAAAAAA22222BBBBBBBBBB匯入資料時修改資料:在匯入資料到資料庫時,可以修改資料。注意,這僅適合於常規匯入,並不適合 direct匯入方式.如:LOAD DATAINFILE *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')")BEGINDATA11111AAAAAAAAAA99120122222BBBBBBBBBB990112LOAD DATAINFILE 'mail_orders.txt'BADFILE 'bad_orders.txt'APPENDINTO TABLE mailing_listFIELDS 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 DATAINFILE *REPLACEINTO TABLE empWHEN 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 projWHEN projno != ' '( projno POSITION(25:27) INTEGER EXTERNAL,empno POSITION(1:4) INTEGER EXTERNAL)匯入選定的記錄:如下例: (01) 代表第一個字元, (30:37) 代表30到37之間的字元:LOAD DATAINFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'APPENDINTO TABLE my_selective_tableWHEN (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 DATATRUNCATE INTO TABLE T1FIELDS 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= 參數來指定每次提交記錄數。提高 SQL*Loader 的效能:1) 一個簡單而容易忽略的問題是,沒有對匯入的表使用任何索引和/或約束(主鍵)。如果這樣做,甚至在使用ROWS=參數時,會很明顯降低資料庫匯入效能。2) 可以添加 DIRECT=TRUE來提高匯入資料的效能。當然,在很多情況下,不能使用此參數。3) 通過指定 UNRECOVERABLE選項,可以關閉資料庫的日誌。這個選項只能和 direct 一起使用。4) 可以同時運行多個匯入任務.常規匯入與direct匯入方式的區別:常規匯入可以通過使用 INSERT語句來匯入資料。Direct匯入可以跳過資料庫的相關邏輯(DIRECT=TRUE),而直接將資料匯入到資料檔案中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.