小毛头的BLOG

有2个人从铁窗朝外忘去,一个人看到满地的泥泞,另一个人只看到满天的繁星

hh ID:huanghui22
131779次访问,排名555好友0人,关注者0
huanghui22的文章
原创 106 篇
翻译 0 篇
转载 53 篇
评论 51 篇
小毛头的公告


QQ:99575165
MSN:
huanghui24@hotmail.com
来自: 上海市





月 [下月] [上月]
最近评论
vvukqr:wow power leveling
ty119110:对我有一定的帮助,非常感谢。
zhjie2004:强人
liulifang75281899:实用

能报LINUX系统的备份方法,和原理也写一下,更好
jhtchina:学习了你的(5) ,解决了我的问题
谢谢你
文章分类
收藏
相册
ORACLE讨论组
AskTom
CNOUG
ITPUB
ORACLE文章索引
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 ORACLE SQL Loader的详细语法 收藏

新一篇: [Oracle]性能优化调整(三)--调整重做机制

 

Oracle   SQL   Loader的详细语法  
  SQL*LOADER
ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据  
 
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECTPARALLEL)。现在,我们抛开其理论不谈,用实例来使您快速掌握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,欲倒入ORACLEFANCY用户下。  
 
       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数据的能力!其实,估计能到110G就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。   
 
有关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
 

发表于 @ 2006年09月21日 10:45:00|评论(loading...)|编辑

旧一篇: [Oracle]性能优化调整(二)--调整缓冲区高速缓存

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 小毛头