在oracle中,使用sqlldr將文件中的數據導入到數據庫
1.創建數據文件: 如,在D:/創建 zhaozhenlong.txt 文件,文件內容爲: 11,12,13 2、創建控制文件: 如,在D:/創建 zhaozhenlong.ctl 文件,文件內容爲: load data 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
例2:
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是重要的一環,實施的好與壞,關係到項目的成功與否。 一、注意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 來識別。 1,2,3 1,2 1,2,3 如果不說明的話,會出現錯誤
sql load的一點小總結
羅列了網上常見的三篇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. 數據文件以 逗號分割
|