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’,
但
‘
不允许
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
,同上
==================================================================================
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
If (File.Exists(strBadName)) Then
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 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)
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
Oracle SQL Loader的详细语法
原文作者:sql
原文地址: https://www.cnblogs.com/binking/archive/2006/11/21/567587.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://www.cnblogs.com/binking/archive/2006/11/21/567587.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。