Oracle SQL Loader的詳細語法 <轉>
Oracle SQL Loader的詳細語法
SQL*LOADER是ORACLE的資料載入工具,通常用來將作業系統檔案遷移到ORACLE資料庫中。SQL*LOADER是大型資料
倉庫選擇使用的載入方法,因為它提供了最快速的途徑(DIRECT,PARALLEL)。現在,我們拋開其理論不談,用例項來使您快速掌握SQL*LOADER的使用方法。
首先,我們認識一下SQL*LOADER。
在NT下,SQL*LOADER的命令為SQLLDR,在UNIX下一般為sqlldr/sqlload。
如執行:d:\oracle>sqlldr
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
用法: SQLLOAD 關鍵字 = 值 [,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 path data saves
(預設: 常規路徑 64, 所有直接路徑)
bindsize -- Size of conventional path bind array in bytes(預設65536)
silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
direct -- use direct path (預設FALSE)
parfile -- parameter file: name of file that contains parameter specifications
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 unusable(預設FALSE)
commit_discontinued -- commit loaded rows when load is discontinued(預設FALSE)
readsize -- Size of Read buffer (預設1048576)
PLEASE NOTE: 命令列引數可以由位置或關鍵字指定
。前者的例子是 'sqlload scott/tiger foo';後者的例子是 'sqlload control=foo userid=scott/tiger'.位置指定引數的時間必須早於但不可遲於由關鍵字指定的引數。例如,
'SQLLOAD SCott/tiger control=foo logfile=log', 但'不允許
SQL*LOADER是ORACLE的資料載入工具,通常用來將作業系統檔案遷移到ORACLE資料庫中。SQL*LOADER是大型資料
倉庫選擇使用的載入方法,因為它提供了最快速的途徑(DIRECT,PARALLEL)。現在,我們拋開其理論不談,用例項來使您快速掌握SQL*LOADER的使用方法。
首先,我們認識一下SQL*LOADER。
在NT下,SQL*LOADER的命令為SQLLDR,在UNIX下一般為sqlldr/sqlload。
如執行:d:\oracle>sqlldr
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
用法: SQLLOAD 關鍵字 = 值 [,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 path data saves
(預設: 常規路徑 64, 所有直接路徑)
bindsize -- Size of conventional path bind array in bytes(預設65536)
silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
direct -- use direct path (預設FALSE)
parfile -- parameter file: name of file that contains parameter specifications
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 unusable(預設FALSE)
commit_discontinued -- commit loaded rows when load is discontinued(預設FALSE)
readsize -- Size of Read buffer (預設1048576)
PLEASE NOTE: 命令列引數可以由位置或關鍵字指定
。前者的例子是 'sqlload scott/tiger foo';後者的例子是 'sqlload control=foo userid=scott/tiger'.位置指定引數的時間必須早於但不可遲於由關鍵字指定的引數。例如,
'SQLLOAD SCott/tiger control=foo logfile=log', 但'不允許
sqlload scott/tiger control=foo log',即使允許 引數 'log' 的位置正確。
d:\oracle>
我們可以從中看到一些基本的幫助資訊,這裡,我用到的是中文的WIN2000 ADV SERVER。
我們知道,SQL*LOADER只能匯入純文字,所以我們現在開始以例項來講解其用法。
一、已存在資料來源result.csv,欲倒入ORACLE中FANCY使用者下。
result.csv內容:
1,預設 Web 站點,192.168.2.254:80:,RUNNING
2,other,192.168.2.254:80:test.com,STOPPED
3,third,192.168.2.254:81:thirdabc.com,RUNNING
從中,我們看出4列,分別以逗號分隔,為變長字串。
二、制定控制檔案result.ctl
result.ctl內容:
load data
infile 'result.csv'
into table resultxt
(resultid char terminated by ',',
website char terminated by ',',
ipport char terminated by ',',
status char terminated by whitespace)
說明:
infile 指資料來源檔案 這裡我們省略了預設的 discardfile result.dsc badfile result.bad
into table resultxt 預設是INSERT,也可以into table resultxt APPEND為追加方式,或REPLACE
terminated by ',' 指用逗號分隔
terminated by whitespace 結尾以空白分隔
三、此時我們執行載入:
D:\>sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
SQL*Loader-941: 在描述表RESULTXT時出現錯誤
ORA-04043: 物件 RESULTXT 不存在
提示出錯,因為資料庫沒有對應的表。
四、在資料庫建立表
create table resultxt
(resultid varchar2(500),
website varchar2(500),
ipport varchar2(500),
status varchar2(500))
/
五、重新執行載入
D:\>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
達到提交點,邏輯記錄計數2
達到提交點,邏輯記錄計數3
已經成功!我們可以透過日誌檔案來分析其過程:resulthis.out內容如下:
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
控制檔案: result.ctl
資料檔案: result.csv
錯誤檔案: result.bad
廢棄檔案: 未作指定
:
(可廢棄所有記錄)
裝載數: ALL
跳過數: 0
允許的錯誤: 50
繫結陣列: 64 行,最大 65536 位元組
繼續: 未作指定
所用路徑: 常規
表RESULTXT
已載入從每個邏輯記錄
插入選項對此表INSERT生效
列名 位置 長度 中止 包裝資料型別
------------------------------ ---------- ----- ---- ---- ---------------------
RESULTID FIRST * , CHARACTER
WEBSITE NEXT * , CHARACTER
IPPORT NEXT * , CHARACTER
STATUS NEXT * WHT CHARACTER
表RESULTXT:
3 行載入成功
由於資料錯誤, 0 行沒有載入。
由於所有 WHEN 子句失敗, 0 行沒有載入。
由於所有欄位都為空的, 0 行沒有載入。
為結合陣列分配的空間: 65016位元組(63行)
除繫結陣列外的記憶體空間分配: 0位元組
跳過的邏輯記錄總數: 0
讀取的邏輯記錄總數: 3
拒絕的邏輯記錄總數: 0
廢棄的邏輯記錄總數: 0
從星期二 1月 08 10:31:57 2002開始執行
在星期二 1月 08 10:32:00 2002處執行結束
經過時間為: 00: 00: 02.70
CPU 時間為: 00: 00: 00.10(可
六、併發操作
sqlldr userid=/ control=result1.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
當載入大量資料時(大約超過10GB),最好抑制日誌的產生:
SQL>ALTER TABLE RESULTXT nologging;
這樣不產生REDO LOG,可以提高效率。然後在CONTROL檔案中load data上面加一行:unrecoverable 此選項必須要與DIRECT共同應用。
在併發操作時,ORACLE聲稱可以達到每小時處理100GB資料的能力!其實,估計能到1-10G就算不錯了,開始可用結構 相同的檔案,但只有少量資料,成功後開始載入大量資料,這樣可以避免時間的浪費。
有關SQLLDR的問題
控制檔案: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) -----定義列對應順序
其中append為資料裝載方式,還有其他選項:
a、insert,為預設方式,在資料裝載開始時要求表為空
b、append,在表中追加新記錄
c、replace,刪除舊記錄,替換成新裝載的記錄
d、truncate,同上
d:\oracle>
我們可以從中看到一些基本的幫助資訊,這裡,我用到的是中文的WIN2000 ADV SERVER。
我們知道,SQL*LOADER只能匯入純文字,所以我們現在開始以例項來講解其用法。
一、已存在資料來源result.csv,欲倒入ORACLE中FANCY使用者下。
result.csv內容:
1,預設 Web 站點,192.168.2.254:80:,RUNNING
2,other,192.168.2.254:80:test.com,STOPPED
3,third,192.168.2.254:81:thirdabc.com,RUNNING
從中,我們看出4列,分別以逗號分隔,為變長字串。
二、制定控制檔案result.ctl
result.ctl內容:
load data
infile 'result.csv'
into table resultxt
(resultid char terminated by ',',
website char terminated by ',',
ipport char terminated by ',',
status char terminated by whitespace)
說明:
infile 指資料來源檔案 這裡我們省略了預設的 discardfile result.dsc badfile result.bad
into table resultxt 預設是INSERT,也可以into table resultxt APPEND為追加方式,或REPLACE
terminated by ',' 指用逗號分隔
terminated by whitespace 結尾以空白分隔
三、此時我們執行載入:
D:\>sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
SQL*Loader-941: 在描述表RESULTXT時出現錯誤
ORA-04043: 物件 RESULTXT 不存在
提示出錯,因為資料庫沒有對應的表。
四、在資料庫建立表
create table resultxt
(resultid varchar2(500),
website varchar2(500),
ipport varchar2(500),
status varchar2(500))
/
五、重新執行載入
D:\>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
達到提交點,邏輯記錄計數2
達到提交點,邏輯記錄計數3
已經成功!我們可以透過日誌檔案來分析其過程:resulthis.out內容如下:
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
控制檔案: result.ctl
資料檔案: result.csv
錯誤檔案: result.bad
廢棄檔案: 未作指定
:
(可廢棄所有記錄)
裝載數: ALL
跳過數: 0
允許的錯誤: 50
繫結陣列: 64 行,最大 65536 位元組
繼續: 未作指定
所用路徑: 常規
表RESULTXT
已載入從每個邏輯記錄
插入選項對此表INSERT生效
列名 位置 長度 中止 包裝資料型別
------------------------------ ---------- ----- ---- ---- ---------------------
RESULTID FIRST * , CHARACTER
WEBSITE NEXT * , CHARACTER
IPPORT NEXT * , CHARACTER
STATUS NEXT * WHT CHARACTER
表RESULTXT:
3 行載入成功
由於資料錯誤, 0 行沒有載入。
由於所有 WHEN 子句失敗, 0 行沒有載入。
由於所有欄位都為空的, 0 行沒有載入。
為結合陣列分配的空間: 65016位元組(63行)
除繫結陣列外的記憶體空間分配: 0位元組
跳過的邏輯記錄總數: 0
讀取的邏輯記錄總數: 3
拒絕的邏輯記錄總數: 0
廢棄的邏輯記錄總數: 0
從星期二 1月 08 10:31:57 2002開始執行
在星期二 1月 08 10:32:00 2002處執行結束
經過時間為: 00: 00: 02.70
CPU 時間為: 00: 00: 00.10(可
六、併發操作
sqlldr userid=/ control=result1.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
當載入大量資料時(大約超過10GB),最好抑制日誌的產生:
SQL>ALTER TABLE RESULTXT nologging;
這樣不產生REDO LOG,可以提高效率。然後在CONTROL檔案中load data上面加一行:unrecoverable 此選項必須要與DIRECT共同應用。
在併發操作時,ORACLE聲稱可以達到每小時處理100GB資料的能力!其實,估計能到1-10G就算不錯了,開始可用結構 相同的檔案,但只有少量資料,成功後開始載入大量資料,這樣可以避免時間的浪費。
有關SQLLDR的問題
控制檔案: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) -----定義列對應順序
其中append為資料裝載方式,還有其他選項:
a、insert,為預設方式,在資料裝載開始時要求表為空
b、append,在表中追加新記錄
c、replace,刪除舊記錄,替換成新裝載的記錄
d、truncate,同上
==================================================================================
PS: 下面是我用C#寫的呼叫SQL_LOADER的方法
Private Function Exec_SqlLoader(ByVal s_aFilePath As String, ByVal o_afileName As Hashtable, ByRef s_aErrMsg As String) As Boolean
FilePath = s_aFilePath.Trim("\")
Dim ctlPath As String = FilePath + "\control"
s_aErrMsg = ""
Try
For i As Integer = 1 To 4
Dim strmReader As New StreamReader(ctlPath + "\001" + i.ToString() + ".ctl")
Dim ctlContent As String = strmReader.ReadToEnd()
ctlContent = ctlContent.Replace("{{dataFile}}", o_afileName.Item(i.ToString))
strmReader.Close()
strmReader = Nothing
Dim strCtlName As String = ctlPath + "\001" + i.ToString() + "new.ctl"
Dim strLogName As String = ctlPath + "\001" + i.ToString() + "new.log"
Dim strBadName As String = ctlPath + "\001" + i.ToString() + "new.bad"
Dim strDscName As String = ctlPath + "\001" + i.ToString() + "new.dsc"
Dim strmWriter As StreamWriter = File.CreateText(strCtlName)
strmWriter.Write(ctlContent)
strmWriter.Close()
strmWriter = Nothing
FilePath = s_aFilePath.Trim("\")
Dim ctlPath As String = FilePath + "\control"
s_aErrMsg = ""
Try
For i As Integer = 1 To 4
Dim strmReader As New StreamReader(ctlPath + "\001" + i.ToString() + ".ctl")
Dim ctlContent As String = strmReader.ReadToEnd()
ctlContent = ctlContent.Replace("{{dataFile}}", o_afileName.Item(i.ToString))
strmReader.Close()
strmReader = Nothing
Dim strCtlName As String = ctlPath + "\001" + i.ToString() + "new.ctl"
Dim strLogName As String = ctlPath + "\001" + i.ToString() + "new.log"
Dim strBadName As String = ctlPath + "\001" + i.ToString() + "new.bad"
Dim strDscName As String = ctlPath + "\001" + i.ToString() + "new.dsc"
Dim strmWriter As StreamWriter = File.CreateText(strCtlName)
strmWriter.Write(ctlContent)
strmWriter.Close()
strmWriter = Nothing
If (File.Exists(strBadName)) Then
File.Delete(strBadName)
End If
File.Delete(strBadName)
End If
Dim connSetting As String() = thisVersion.MSD_ConnectionStr.Split(";")
Dim serviceName As String = CType(connSetting.GetValue(0), String)
serviceName = serviceName.Substring(serviceName.IndexOf("=") + 1)
Dim userId As String = CType(connSetting.GetValue(1), String)
userId = userId.Substring(userId.IndexOf("=") + 1)
Dim password As String = CType(connSetting.GetValue(2), String)
password = password.Substring(password.IndexOf("=") + 1)
Dim serviceName As String = CType(connSetting.GetValue(0), String)
serviceName = serviceName.Substring(serviceName.IndexOf("=") + 1)
Dim userId As String = CType(connSetting.GetValue(1), String)
userId = userId.Substring(userId.IndexOf("=") + 1)
Dim password As String = CType(connSetting.GetValue(2), String)
password = password.Substring(password.IndexOf("=") + 1)
Dim strPathName As String
strPathName = "sqlldr " + userId + "/" + password + "@" + serviceName + " control='" + strCtlName + "' log='" + strLogName + "' bad='" + strBadName + "' discard='" + strDscName + "' errors=500"
Microsoft.VisualBasic.Shell(strPathName, AppWinStyle.MinimizedFocus, True)
strPathName = "sqlldr " + userId + "/" + password + "@" + serviceName + " control='" + strCtlName + "' log='" + strLogName + "' bad='" + strBadName + "' discard='" + strDscName + "' errors=500"
Microsoft.VisualBasic.Shell(strPathName, AppWinStyle.MinimizedFocus, True)
If (File.Exists(strBadName)) Then
File.Copy(strBadName, FilePath + "\BatchLog\ERROR_001" + i.ToString() + ".txt", True)
a_sErrMsg += "這裡寫丟擲的警告資訊" + vbCrLf + vbTab
End If
Next
Return True
Catch ex As Exception
a_sErrMsg += ex.ToString()
ms_BatchLogMsg = ex.Message
Return False
End Try
End Function
File.Copy(strBadName, FilePath + "\BatchLog\ERROR_001" + i.ToString() + ".txt", True)
a_sErrMsg += "這裡寫丟擲的警告資訊" + vbCrLf + vbTab
End If
Next
Return True
Catch ex As Exception
a_sErrMsg += ex.ToString()
ms_BatchLogMsg = ex.Message
Return False
End Try
End Function
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-763909/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE SQL Loader的詳細語法OracleSQL
- Linq語法詳細
- SQL*Loader 詳解SQL
- oracle sql loader 的使用OracleSQL
- ORACLE常用的SQL語法和資料物件(轉)OracleSQL物件
- Oracle SQL Loader(sqlldr)OracleSQL
- Hive sql語法詳解HiveSQL
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- ORACLE的基本語法(轉)Oracle
- [SQL] Oracle基礎語法SQLOracle
- Oracle常用sql語法集合OracleSQL
- Oracle SQL的一些語法OracleSQL
- SQL之EXPLAIN語法詳解SQLAI
- hive sql 常用語法詳解HiveSQL
- 學習oracle sql loader 的使用OracleSQL
- Oracle sql with 語句語法與例子OracleSQL
- SQL語法參考(轉)SQL
- Oracle SQL語言(轉)OracleSQL
- mysql語法使用詳細程式碼版MySql
- Oracle SQL Loader(sqlldr)+ Externale TablesOracleSQL
- Oracle SQL*Loader使用案例(一)OracleSQL
- Oracle SQL*Loader使用案例(二)OracleSQL
- Oracle SQL*Loader使用案例(三)OracleSQL
- Oracle SQL*Loader使用案例(四)OracleSQL
- Oracle SQL*Loader 使用指南OracleSQL
- 全面接觸SQL語法(轉)SQL
- PL/SQL基本語法要素(轉)SQL
- Oracle 行轉列的sql語句OracleSQL
- JSP 語法詳解(轉)JS
- 【轉載】oracle更新語法Oracle
- ORACLE常用的SQL語法和資料物件OracleSQL物件
- ORACLE 常用的SQL語法和資料物件OracleSQL物件
- Oracle9i的簡化SQL語法OracleSQL
- 建立表空間、回滾段、使用者、表的詳細語法資訊(轉)
- sql語法中的一個重點(轉)SQL
- SQL語法參考手冊(轉)SQL
- Oracle SQL精妙SQL語句講解(轉)OracleSQL
- thinkPHP模板中的語法知識詳細介紹(十二)PHP