现在的位置: 首页 > 综合 > 正文

Oracle SQL Loader的详细语法

2013年03月24日 ⁄ 综合 ⁄ 共 5678字 ⁄ 字号 评论关闭

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',  


'
不允许
                             
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
,同上
     

抱歉!评论已关闭.