Oracle SQL Loader的详细语法

来源:互联网 发布:ubuntu rar命令 编辑:程序博客网 时间:2024/05/16 10:34
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   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=foouserid=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   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   10:31:57  2002  
  (c)  Copyright  1999  Oracle  Corporation.  All  rights  reserved.  
 
达到提交点,逻辑记录计数 
 
达到提交点,逻辑记录计数 
 
    已经成功!我们可以通过日志文件来分析其过程:resulthis.out内容如下:  
  SQL*Loader:  Release  8.1.6.0.0   Production  on  
星期二  1   10:31:57  2002  
  (c)  Copyright  1999  Oracle  Corporation.  All  rights  reserved.  
 
控制文件 result.ctl  
 
数据文件 result.csv  
 
错误文件 result.bad  
 
废弃文件 未作指定  
    
  (
可废弃所有记录 
 
装载数 ALL  
 
跳过数  
 
允许的错误 50  
 
绑定数组 64   行,最大  65536   字节  
 
继续 未作指定  
 
所用路径 常规  
 
RESULTXT  
 
已载入从每个逻辑记录  
 
插入选项对此表INSERT生效  
 
列名  位置  长度  中止  包装数据类型  
 ------------------------------  ----------  -----  ----  ----  ---------------------  
  RESULTID  FIRST    CHARACTER    
  WEBSITE  NEXT    CHARACTER    
  IPPORT  NEXT    CHARACTER    
  STATUS  NEXT   WHT  CHARACTER    
 
RESULTXT:    
  
行载入成功  
 
由于数据错误   行没有载入。  
 
由于所有  WHEN   子句失败   行没有载入。  
 
由于所有字段都为空的   行没有载入。  
 
为结合数组分配的空间 65016字节(63行)  
 
除绑定数组外的内存空间分配 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,同上
0 0