壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11959|回复: 6

SQLLOADER(SQLLDR)用法

[复制链接]
发表于 2005/11/30 10:59:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
sqlldr userid=lgone/tiger control=a.ctl
  LOAD DATA
  INFILE 't.dat' // 要导入的文件
  // INFILE 'tt.date' // 导入多个文件
  // INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容
  
  INTO TABLE table_name // 指定装入的表
  BADFILE 'c:\bad.txt' // 指定坏文件地址
  
  ************* 以下是4种装入表的方式
  APPEND // 原先的表有数据 就加在后面
  // INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值
  // REPLACE // 原先的表有数据 原先的数据会全部删除
  // TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据
  
  ************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  // 装载这种数据: 10,lg,"""lg""","lg,lg"
  // 在表中结果: 10 lg "lg" lg,lg
  // TERMINATED BY X '09' // 以十六进制格式 '09' 表示的
  // TERMINATED BY WRITESPACE // 装载这种数据: 10 lg lg
  
  TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空
  
  ************* 下面是表的字段
  (
  col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
  // 如: lg,lg,not 结果 lg lg
  )
  // 当没声明FIELDS TERMINATED BY ',' 时
  // (
  // col_1 [interger external] TERMINATED BY ',' ,
  // col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
  // col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
  // )
  // 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据
  // (
  // col_1 position(1:2),
  // col_2 position(3:10),
  // col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
  // col_4 position(1:16),
  // col_5 position(3:10) char(8) // 指定字段的类型
  // )
  
  BEGINDATA // 对应开始的 INFILE * 要导入的内容就在control文件里
  10,Sql,what
  20,lg,show
  
  =====================================================================================
  //////////// 注意begindata后的数值前面不能有空格
  
  1 ***** 普通装载
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  (DEPTNO,
  DNAME,
  LOC
  )
  BEGINDATA
  10,Sales,"""USA"""
  20,Accounting,"Virginia,USA"
  30,Consulting,Virginia
  40,Finance,Virginia
  50,"Finance","",Virginia // loc 列将为空
  60,"Finance",,Virginia // loc 列将为空
  
  2 ***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情况
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY WHITESPACE
  -- FIELDS TERMINATED BY x'09'
  (DEPTNO,
  DNAME,
  LOC
  )
  BEGINDATA
  10 Sales Virginia
  
  3 ***** 指定不装载那一列
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  ( DEPTNO,
  FILLER_1 FILLER, // 下面的 "Something Not To Be Loaded" 将不会被装载
  DNAME,
  LOC
  )
  BEGINDATA
  20,Something Not To Be Loaded,Accounting,"Virginia,USA"
  
  4 ***** position的列子
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  ( DEPTNO position(1:2),
  DNAME position(*:16), // 这个字段的开始位置在前一字段的结束位置
  LOC position(*:29),
  ENTIRE_LINE position(1:29)
  )
  BEGINDATA
  10Accounting Virginia,USA
  
  5 ***** 使用函数 日期的一种表达 TRAILING NULLCOLS的使用
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY ','
  TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应
  // 的列的值的 如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了
  (DEPTNO,
  DNAME "upper(:dname)", // 使用函数
  LOC "upper(:loc)",
  LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等
  ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"
  )
  BEGINDATA
  10,Sales,Virginia,1/5/2000
  20,Accounting,Virginia,21/6/1999
  30,Consulting,Virginia,5/1/2000
  40,Finance,Virginia,15/3/2001
  
  6 ***** 使用自定义的函数 // 解决的时间问题
  create or replace
  function my_to_date( p_string in varchar2 ) return date
  as
  type fmtArray is table of varchar2(25);
  
  l_fmts fmtArray := fmtArray( 'dd-mon-yyyy', 'dd-month-yyyy',
  'dd/mm/yyyy',
  'dd/mm/yyyy hh24:mi:ss' );
  l_return date;
  begin
  for i in 1 .. l_fmts.count
  loop
  begin
  l_return := to_date( p_string, l_fmts(i) );
  exception
  when others then null;
  end;
  EXIT when l_return is not null;
  end loop;
  
  if ( l_return is null )
  then
  l_return :=
  new_time( to_date('01011970','ddmmyyyy') + 1/24/60/60 *
  p_string, 'GMT', 'EST' );
  end if;
  
  return l_return;
  end;
  /
  
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY ','
  TRAILING NULLCOLS
  (DEPTNO,
  DNAME "upper(:dname)",
  LOC "upper(:loc)",
  LAST_UPDATED "my_to_date( :last_updated )" // 使用自定义的函数
  )
  BEGINDATA
  10,Sales,Virginia,01-april-2001
  20,Accounting,Virginia,13/04/2001
  30,Consulting,Virginia,14/04/2001 12:02:02
  40,Finance,Virginia,987268297
  50,Finance,Virginia,02-apr-2001
  60,Finance,Virginia,Not a date
  
  7 ***** 合并多行记录为一行记录
  LOAD DATA
  INFILE *
  concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录
  INTO TABLE DEPT
  replace
  FIELDS TERMINATED BY ','
  (DEPTNO,
  DNAME "upper(:dname)",
  LOC "upper(:loc)",
  LAST_UPDATED date 'dd/mm/yyyy'
  )
  BEGINDATA
  10,Sales, // 其实这3行看成一行 10,Sales,Virginia,1/5/2000
  Virginia,
  1/5/2000
  // 这列子用 continueif list="," 也可以
  告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行
  
  LOAD DATA
  INFILE *
  continueif this(1:1) = '-' // 找每行的开始是否有连接字符 - 有就把下一行连接为一行
  // 如 -10,Sales,Virginia,
  // 1/5/2000 就是一行 10,Sales,Virginia,1/5/2000
  // 其中1:1 表示从第一行开始 并在第一行结束 还有continueif next 但continueif list最理想
  INTO TABLE DEPT
  replace
  FIELDS TERMINATED BY ','
  (DEPTNO,
  DNAME "upper(:dname)",
  LOC "upper(:loc)",
  LAST_UPDATED date 'dd/mm/yyyy'
  )
  BEGINDATA // 但是好象不能象右面的那样使用
  -10,Sales,Virginia, -10,Sales,Virginia,
  1/5/2000 1/5/2000
  -40, 40,Finance,Virginia,13/04/2001
  Finance,Virginia,13/04/2001
  
  8 ***** 载入每行的行号
  
  load data
  infile *
  into table t
  replace
  ( seqno RECNUM //载入每行的行号
  text Position(1:1024))
  BEGINDATA
  fsdfasj //自动分配一行号给载入 表t 的seqno字段 此行为 1
  fasdjfasdfl // 此行为 2 ...
  
  9 ***** 载入有换行符的数据
  注意: unix 和 windows 不同 \\n & /n
  < 1 > 使用一个非换行符的字符
  LOAD DATA
  INFILE *
  INTO TABLE DEPT
  REPLACE
  FIELDS TERMINATED BY ','
  TRAILING NULLCOLS
  (DEPTNO,
  DNAME "upper(:dname)",
  LOC "upper(:loc)",
  LAST_UPDATED "my_to_date( :last_updated )",
  COMMENTS "replace(:comments,'\n',chr(10))" // replace 的使用帮助转换换行符
  )
  BEGINDATA
  10,Sales,Virginia,01-april-2001,This is
 楼主| 发表于 2005/11/30 11:01:43 | 显示全部楼层
一:sql loader 的特点oracle自己带了很多的工具可以用来进行数据的迁移、备份和恢复等工作。但是每个工具都有自己的特点。比如说exp和imp可以对数据库中的数据进行导出和导出的工作,是一种很好的数据库备份和恢复的工具,因此主要用在数据库的热备份和恢复方面。有着速度快,使用简单,快捷的优点;同时也有一些缺点,比如在不同版本数据库之间的导出、导入的过程之中,总会出现这样或者那样的问题,这个也许是oracle公司自己产品的兼容性的问题吧。sql loader 工具却没有这方面的问题,它可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。二:sql loader 的帮助
C:\&gt;sqlldr
SQL*Loader: Release 9.2.0.1.0 - Production on 星期六 10月 9 14:48:12 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE username/passwordcontrol -- Control file namelog -- Log file namebad -- Bad file namedata -- Data file namediscard -- Discard file namediscardmax -- 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(默认256000)silent -- Suppress messages during run (header,feedback,errors,discards,partitions)direct -- use direct path (默认FALSE)parfile -- parameter file: name of file that contains parameter specificationsparallel -- do parallel load (默认FALSE)file -- File to allocate extents fromskip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默认FALSE)skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(默认FALSE)readsize -- Size of Read buffer (默认1048576)external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(默认NOT_USED)columnarrayrows -- Number of rows for direct path column array(默认5000)streamsize -- Size of direct path stream buffer in bytes(默认256000)multithreading -- use multithreading in direct pathresumable -- enable or disable resumable for current session(默认FALSE)resumable_name -- text string to help identify resumable statementresumable_timeout -- wait time (in seconds) for RESUMABLE(默认7200)date_cache -- size (in entries) of date conversion cache(默认1000)
PLEASE NOTE: 命令行参数可以由位置或关键字指定。前者的例子是 'sqlloadscott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foouserid=scott/tiger'.位置指定参数的时间必须早于但不可迟于由关键字指定的参数。例如,允许 'sqlldr scott/tiger control=foo logfile=log', 但是不允许 'sqlldr scott/tiger control=foo log', 即使参数 'log' 的位置正确。
C:\&gt;
三:sql loader使用例子a)SQLLoader将 Excel 数据导出到 Oracle1.创建SQL*Loader输入数据所需要的文件,均保存到C:\,用记事本编辑: 控制文件: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)   -----定义列对应顺序 a、insert,为缺省方式,在数据装载开始时要求表为空 b、append,在表中追加新记录 c、replace,删除旧记录,替换成新装载的记录 d、truncate,同上 在DOS窗口下使用SQL*Loader命令实现数据的输入 C:\&gt;sqlldr userid=system/manager control=input.ctl 默认日志文件名为:input.log 默认坏记录文件为:input.bad 2.还有一种方法可以把EXCEL文件另存为CSV(逗号分隔)(*.csv),控制文件就改为用逗号分隔 LOAD DATA INFILE 'd:\car.csv' APPEND INTO TABLE t_car_temp FIELDS TERMINATED BY "," (phoneno,vip_car)
b)在控制文件中直接导入数据
1、控制文件test.ctl的内容-- The format for executing this file with SQL Loader is:-- SQLLDR control=&lt;filename&gt; Be sure to substitute your-- version of SQL LOADER and the filename for this file.LOAD DATAINFILE *BADFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.BAD'DISCARDFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.DSC'INSERT INTO TABLE EMCCOUNTRYFields terminated by ";" Optionally enclosed by '"'(COUNTRYID NULLIF (COUNTRYID="NULL"),COUNTRYCODE,COUNTRYNAME,CONTINENTID NULLIF (CONTINENTID="NULL"),MAPID NULLIF (MAPID="NULL"),CREATETIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (CREATETIME="NULL"),LASTMODIFIEDTIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (LASTMODIFIEDTIME="NULL"))BEGINDATA1;"JP";"Japan";1;9;"09/16/2004 16:31:32";NULL2;"CN";"China";1;10;"09/16/2004 16:31:32";NULL3;"IN";"India";1;11;"09/16/2004 16:31:32";NULL4;"AU";"Australia";6;12;"09/16/2004 16:31:32";NULL5;"CA";"Canada";4;13;"09/16/2004 16:31:32";NULL6;"US";"United States";4;14;"09/16/2004 16:31:32";NULL7;"MX";"Mexico";4;15;"09/16/2004 16:31:32";NULL8;"GB";"United Kingdom";3;16;"09/16/2004 16:31:32";NULL9;"DE";"Germany";3;17;"09/16/2004 16:31:32";NULL10;"FR";"France";3;18;"09/16/2004 16:31:32";NULL11;"IT";"Italy";3;19;"09/16/2004 16:31:32";NULL12;"ES";"Spain";3;20;"09/16/2004 16:31:32";NULL13;"FI";"Finland";3;21;"09/16/2004 16:31:32";NULL14;"SE";"Sweden";3;22;"09/16/2004 16:31:32";NULL15;"IE";"Ireland";3;23;"09/16/2004 16:31:32";NULL16;"NL";"Netherlands";3;24;"09/16/2004 16:31:32";NULL17;"DK";"Denmark";3;25;"09/16/2004 16:31:32";NULL18;"BR";"Brazil";5;85;"09/30/2004 11:25:43";NULL19;"KR";"Korea, Republic of";1;88;"09/30/2004 11:25:43";NULL20;"NZ";"New Zealand";6;89;"09/30/2004 11:25:43";NULL21;"BE";"Belgium";3;79;"09/30/2004 11:25:43";NULL22;"AT";"Austria";3;78;"09/30/2004 11:25:43";NULL23;"NO";"Norway";3;82;"09/30/2004 11:25:43";NULL24;"LU";"Luxembourg";3;81;"09/30/2004 11:25:43";NULL25;"T";"Portugal";3;83;"09/30/2004 11:25:43";NULL26;"GR";"Greece";3;80;"09/30/2004 11:25:43";NULL27;"IL";"Israel";1;86;"09/30/2004 11:25:43";NULL28;"CH";"Switzerland";3;84;"09/30/2004 11:25:43";NULL29;"A1";"Anonymous Proxy";0;0;"09/30/2004 11:25:43";NULL30;"A2";"Satellite Provider";0;0;"09/30/2004 11:25:43";NULL31;"AD";"Andorra";3;0;"09/30/2004 11:25:43";NULL32;"AE";"United Arab Emirates";1;0;"09/30/2004 11:25:43";NULL33;"AF";"Afghanistan";1;0;"09/30/2004 11:25:43";NULL34;"AG";"Antigua and Barbuda";7;0;"09/30/2004 11:25:43";NULL35;"AI";"Anguilla";7;0;"09/30/2004 11:25:43";NULL36;"AL";"Albania";3;0;"09/30/2004 11:25:43";NULL37;"AM";"Armenia";3;0;"09/30/2004 11:25:43";NULL38;"AN";"Netherlands Antilles";3;0;"09/30/2004 11:25:43";NULL39;"AO";"Angola";2;0;"09/30/2004 11:25:43";NULL40;"AP";"Asia/Pacific Region";2;0;"09/30/2004 11:25:43";NULL41;"AQ";"Antarctica";8;0;"09/30/2004 11:25:43";NULL42;"AR";"Argentina";5;0;"09/30/2004 11:25:43";NULL43;"AS";"American Samoa";6;0;"09/30/2004 11:25:43";NULL44;"AW";"Aruba";5;0;"09/30/2004 11:25:43";NULL45;"AZ";"Azerbaijan";1;0;"09/30/2004 11:25:43";NULL46;"BA";"Bosnia and Herzegovina";3;0;"09/30/2004 11:25:43";NULL47;"BB";"Barbados";5;0;"09/30/2004 11:25:43";NULL48;"BD";"Bangladesh";1;0;"09/30/2004 11:25:43";NULL49;"BF";"Burkina Faso";2;0;"09/30/2004 11:25:43";NULL50;"BG";"Bulgaria";3;0;"09/30/2004 11:25:43";NULL51;"BH";"Bahrain";1;0;"09/30/2004 11:25:43";NULL52;"BI";"Burundi";2;0;"09/30/2004 11:25:43";NULL53;"BJ";"Benin";2;0;"09/30/2004 11:25:43";NULL54;"BM";"Bermuda";4;0;"09/30/2004 11:25:43";NULL55;"BN";"Brunei Darussalam";1;0;"09/30/2004 11:25:43";NULL56;"BO";"Bolivia";5;0;"09/30/2004 11:25:43";NULL57;"BS";"Bahamas";7;0;"09/30/2004 11:25:43";NULL58;"BT";"Bhutan";1;0;"09/30/2004 11:25:43";NULL59;"BV";"Bouvet Island";5;0;"09/30/2004 11:25:43";NULL60;"BW";"Botswana";2;0;"09/30/2004 11:25:43";NULL61;"BY";"Belarus";3;0;"09/30/2004 11:25:43";NULL2、执行导入命令C:\&gt;sqlldr userid=system/manager control=test.ctl
c)复杂格式的导入
 楼主| 发表于 2005/11/30 15:15:55 | 显示全部楼层
Hi everyoneThis is a bit urgentwhen i am writing skip in my control fileas skip 1it gives me the following errorSQL*Loader-410: Number to skip must be load-level and not table levelWhile if i give skip from prompt i.e skip=1 then it works fine.Can someone solve my problem

not very sure about your exact requirement.try something like this.
options (skip = 1)
load data
into table mytable
...
fields terminated by X'9'
or
INTO TABLE emp
SKIP 2345
....
INTO TABLE dept
SKIP 514
 楼主| 发表于 2006/11/15 11:23:27 | 显示全部楼层
一个带条件控制的控制文件例子:
注意其中的:when org_id ='85'

options ( errors=1000)
--(skip=1)
load data
replace
into table CUX_AR_INVOICE_TEMP
when org_id ='85'
fields terminated by "," optionally enclosed by '"'
(
  business_sys_id          ,
  record_type              ,
  org_id                   ,
  line_number              ,
  cust_code                ,
  cust_site_code           ,
  cux_trx_type_name        ,
  company_code             ,
  category_code            ,
  product_code             ,
  dept_code                ,
  intercompany             ,
  project_code             ,
  bd_spare1                ,
  bd_spare2                ,
  accounted_amount         ,
  entered_amount           ,
  currency_code            ,
  exchange_rate            ,
  exchange_rate_type       ,
  revenue_inv_date date 'rrrrmmdd',
  gl_date          date 'rrrrmmdd',
  term_id                  ,
  revenue_inv_number       ,
  sales_rep                ,
  shuoming
  )
发表于 2006/12/4 10:42:48 | 显示全部楼层
没用过,学习ing........................
发表于 2007/7/30 22:19:43 | 显示全部楼层
好!好像重复了。
发表于 2007/7/30 23:55:19 | 显示全部楼层
实际用起来,看几个例子就应该能用了,但是要用的好,还 需要仔细的看研究一下。呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 16:57 , Processed in 0.016393 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表