sqlldr应用简析

 

在oracle中,使用sqlldr将文件中的数据导入到数据库

1.创建数据文件:

 如,在D:/创建 zhaozhenlong.txt 文件,文件内容为:

11,12,13
21,22,23
31,32,33

2、创建控制文件:

如,在D:/创建 zhaozhenlong.ctl 文件,文件内容为:

load data
infile 'd:/zhaozhenlong.txt'
append into table zhaozhenlong
fields terminated by ','
(c1,c2,c3)

3、在数据库中创建表:

      create table zhaozhenlong(c1 varchar(20),c2 varchar(20),c3 varchar2(20));

4、在‘开始’/‘运行’中,执行:

     sqlldr userid=cs/cs@orademo control=d:/zhaozhenlong.ctl

5、查询数据库:

     select * from zhaozhenlong

     结果为:

 C1 C2 C3
1 11 12 13
2 21 22 23
3 31 32 33

 

例2:

 

 关于 oracle 中 sqlldr 的用法

2005-12-30 21:13:49
这几天研究了一下 sqlldr 的用法,今天在这里写出来供有需要的同行享用.
现在有一个文件 Output.txt 内容如下:
 
Ivy,Lam,PR02004,2005,09,21,17,32,00,I,D,Main Door,PR,
Carmen,Siu,AC04023,2005,09,21,17,32,01,I,D,Main Door,Account,
Xing,Lee,CM06021,2005,09,21,17,32,02,I,D,Main Door,Communications,
Barry,Yu,MK05006,2005,09,21,17,32,02,I,D,Main Door,Marketing,
Overtime,nil,OV0001,2005,09,21,17,32,07,I,D,Main Door,Product,
Sammy,Mow,SA02322,2005,09,21,17,32,09,I,D,Main Door,Sales,
Emily,Fu,CM06024,2005,09,21,17,32,10,I,D,Main Door,Communications,
Stella,Chow,PT02145,2005,09,21,17,32,11,I,D,Main Door,Product,
 
是有规律的数据,中间都是用","分开的,现在我要将此文件导入到 oracle 中:
 
第一步,当然是建表,上面有一行中有几个数据就建几个字段.
 
二,写一个 *.ctl 的文件,内容如下
 
load data
infile 'D:/owen/work/CardAttendence/Completed/windows/Output.txt'
badfile 'D:/owen/work/CardAttendence/Completed/windows/Output.bad'
append
into table system.card_time_original
fields terminated by ","
(lName,fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
三,在 doc 窗口下输入如下命令
 
sqlldr userid=system/111111@XE control=D:/owen/work/CardAttendence/Completed/windows/importOne.ctl log=D:/owen/work/CardAttendence/Completed/windows/import.log
 
注意:这里一定要是当前用户对此表有所有权限, 还有一定不能用 sys 用户,要不然会出错
 
如果要将此数据导入到两个表中(结构相同),那么可以把控制文件改为如下所示:
 
load data
infile 'D:/owen/work/CardAttendence/Completed/windows/Output.txt'
badfile 'D:/owen/work/CardAttendence/Completed/windows/Output.bad'
append
into table system.card_time_original
WHEN lName != ' '
fields terminated by ","
(lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
into table system.card_time_original_bak
WHEN lName != ' '
fields terminated by ","
(lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
 
小结:
 
 

FAQ_SQLLDR用法总结

         在数据仓库项目实施过程中,ETL是重要的一环,实施的好与坏,关系到项目的成功与否。
在数据抽取领域,相应的工具有IBM DataStage,Informatica PowerCenter,这里介绍Oracle自带的SQLLODER,
这是在Oracle数据仓库实施过程中最容易掌握的工具。在介绍之前,先考虑下面问题:

 一、注意SQLLDR要解决的问题,即实现ETL过程的问题

1、导入表的数据类型为日期类型

2、导入数据过程中的转换问题

3、导入数据过程中的过滤问题

4、导入数据过程中的截取问题

5、导入空列在转换时可能会遇到的问题

6、导入数据的分割符问题,如逗号,制表符,空白符都是常见的

用法:

二、控制文件:一个控制命令的脚本文件,通常以ctl结尾,Test.ctl内容如下:

 

LOAD DATA

INFILE 'F:/SQLLDR/data.txt'

INFILE 'F:/SQLLDR/data2.txt'                                //可以从多个文件导入数据

// INFILE *                  //导入的内容在本文件最后的BEGINDATA后面就是导入的内容 

INTO TABLE sdata.T_TEST

 

//四种装载方式,四选一

APPEND           // 原先的表有数据 就加在后面 

// INSERT            //装载空表 如果原先的表有数据 sqlloader会停止 默认值 

// REPLACE       //  原先的表有数据 原先的数据会全部删除 

// TRUNCATE            //  指定的内容和replace的相同 会用truncate语句删除现存数据 

 

//过滤装载的数据

WHEN T_DATE = '2007-07-02'                            //大于和小于等其它比较还没解决

 

//指定分割符

FIELDS TERMINATED BY ','                          // x'09' (制表符)

-- FIELDS TERMINATED BY  WHITESPACE        //以空白分割,实际这样分割危险

OPTIONALLY ENCLOSED BY '"'

TRAILING NULLCOLS  // 表的字段没有对应的值时允许为空 ,这句很有用,默认加的好

 

//表的字段,可以在里面大做文章

(

T_ID FILLER,                                      // FILLER 关键字 此列的数值不会被装载

T_DATE "CASE WHEN :T_DATE is null THEN TO_DATE('2999-12-31','yyyy-mm-dd') ELSE TO_DATE(:T_DATE,'yyyy-mm-dd') END",                          

 //日期类型特别说明,并且要指定其格式      

//更一般的格式是T_DATE date ‘yyyy-mm-dd’

T_NAME POSITION(3:6) "UPPER(:T_NAME)",      //用位置POSITION来告诉装载的数据

                                                               //"UPPER(:T_NAME)" 转换为大写,注意冒号

T_SEX position(*:8) ,                  // 这个字段的开始位置在前一字段的结束位置

ENTIRE_LINE "UPPER(:T_NAME||:T_SEX)"    //连接并转换为大写

) 

/****可继续 插入数据到其他表

INTO TABLE sdata.T_TEST

INSERT            

WHEN T_DATE = '2007-07-02'                            //大于和小于等其它比较还没解决

.//BEGINDATA                                          // 与前面的INFILE *对应,一般不会这样用吧 

//1,ajsdlkfjsdkl,0 

三、运行方法

命令窗口执行:

sqlldr userid=sdata/sdata@rasdevdb control=F:/SQLLDR/Test.ctl 

为了方便,一般写个bat 文件,在bat文件中输入上述的内容即可,最后在命令窗口中运行这个bat文件,原理是一样的。

总之,这其实是Oracle中的一个用法而已。

三、

对不规则数据源的处理

 

--TRAILING NULLCOLS                   // 表的字段没有对应的值时允许为空,这句很有用

例如:

对于由EXCEL文件导出成CSV文件时,有的行末没有数据会缺少分割符,这在DS中会报错的,在SQLLDR中可以通过TRAILING NULLCOLS 来识别。

123

12

123

如果不说明的话,会出现错误

 

 

 

sql load的一点小总结  
  
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 the Sales/nOffice in Virginia  
20,Accounting,Virginia,13/04/2001,This is the Accounting/nOffice in Virginia  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting/nOffice in Virginia  
40,Finance,Virginia,987268297,This is the Finance/nOffice in Virginia  
  
< 2 > 使用fix属性  
LOAD DATA  
INFILE demo17.dat "fix 101"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo17.dat  
10,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia  
20,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia  
40,Finance,Virginia,987268297,This is the Finance  
Office in Virginia  
  
// 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同  
  
LOAD DATA  
INFILE demo18.dat "fix 101"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo18.dat  
10,Sales,Virginia,01-april-2001,"This is the Sales  
Office in Virginia"  
20,Accounting,Virginia,13/04/2001,"This is the Accounting  
Office in Virginia"  
30,Consulting,Virginia,14/04/2001 12:02:02,"This is the Consulting  
Office in Virginia"  
40,Finance,Virginia,987268297,"This is the Finance  
Office in Virginia"  
  
< 3 > 使用var属性  
LOAD DATA  
INFILE demo19.dat "var 3"  
// 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 071 表示此记录有 71 个字节  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo19.dat  
07110,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia  
07820,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia  
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia  
07140,Finance,Virginia,987268297,This is the Finance  
Office in Virginia  
  
< 4 > 使用str属性  
// 最灵活的一中 可定义一个新的行结尾符 win 回车换行 : chr(13)||chr(10)  
  
此列中记录是以 a|/r/n 结束的  
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;  
结果 7C0D0A  
  
LOAD DATA  
INFILE demo20.dat "str X'7C0D0A'"  
INTO TABLE DEPT  
REPLACE  
FIELDS TERMINATED BY ','  
TRAILING NULLCOLS  
(DEPTNO,  
DNAME "upper(:dname)",  
LOC "upper(:loc)",  
LAST_UPDATED "my_to_date( :last_updated )",  
COMMENTS  
)  
demo20.dat  
10,Sales,Virginia,01-april-2001,This is the Sales  
Office in Virginia|  
20,Accounting,Virginia,13/04/2001,This is the Accounting  
Office in Virginia|  
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting  
Office in Virginia|  
40,Finance,Virginia,987268297,This is the Finance  
Office in Virginia|  
  
==============================================================================  
象这样的数据 用 nullif 子句  
  
10-jan-200002350Flipper seemed unusually hungry today.  
10510-jan-200009945Spread over three meals.  
  
id position(1:3) nullif id=blanks // 这里可以是blanks 或者别的表达式  
// 下面是另一个列子 第一行的 1 在数据库中将成为 null  
LOAD DATA  
INFILE *  
INTO TABLE T  
REPLACE  
(n position(1:2) integer external nullif n='1',  
v position(3:8)  
)  
BEGINDATA  
1 10  
20lg  

 

罗列了网上常见的三篇Sqlldr的介绍

一:sql loader 的特点

oracle自己带了很多的工具可以用来进行数据的迁移、备份和恢复等工作。但是每个工具都有自己的特点。

比如说exp和imp可以对数据库中的数据进行导出和导出的工作,是一种很好的数据库备份和恢复的工具,因此主要用在数据库的热备份和恢复方面。有着速度快,使用简单,快捷的优点;同时也有一些缺点,比如在不同版本数据库之间的导出、导入的过程之中,总会出现这样或者那样的问题,这个也许是oracle公司自己产品的兼容性的问题吧。

sql loader 工具却没有这方面的问题,它可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。

二:sql loader 的帮助

C:/>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/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 p

ath data saves

(默认: 常规路径 64, 所有直接路径)

bindsize -- Size of conventional path bind array in bytes(默认256000)

silent -- Suppress messages during run (header,feedback,errors,discards,part

itions)

direct -- use direct path (默认FALSE)

parfile -- parameter file: name of file that contains parameter specification

s

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 unus

able(默认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 path

resumable -- enable or disable resumable for current session(默认FALSE)

resumable_name -- text string to help identify resumable statement

resumable_timeout -- wait time (in seconds) for RESUMABLE(默认7200)

date_cache -- size (in entries) of date conversion cache(默认1000)

PLEASE NOTE: 命令行参数可以由位置或关键字指定

。前者的例子是 'sqlload

scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo

userid=scott/tiger'.位置指定参数的时间必须早于

但不可迟于由关键字指定的参数。例如,

允许 'sqlldr scott/tiger control=foo logfile=log', 但是

不允许 'sqlldr scott/tiger control=foo log', 即使

参数 'log' 的位置正确。

C:/>

三:sql loader使用例子

a)SQLLoader将 Excel 数据导出到 Oracle

1.创建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:/>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= Be sure to substitute your

-- version of SQL LOADER and the filename for this file.

LOAD DATA

INFILE *

BADFILE 'C:/Documents and Settings/Jackey/桌面/WMCOUNTRY.BAD'

DISCARDFILE 'C:/Documents and Settings/Jackey/桌面/WMCOUNTRY.DSC'

INSERT INTO TABLE EMCCOUNTRY

Fields 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")

)

BEGINDATA

1;"JP";"Japan";1;9;"09/16/2004 16:31:32";NULL

2;"CN";"China";1;10;"09/16/2004 16:31:32";NULL

3;"IN";"India";1;11;"09/16/2004 16:31:32";NULL

4;"AU";"Australia";6;12;"09/16/2004 16:31:32";NULL

5;"CA";"Canada";4;13;"09/16/2004 16:31:32";NULL

6;"US";"United States";4;14;"09/16/2004 16:31:32";NULL

7;"MX";"Mexico";4;15;"09/16/2004 16:31:32";NULL

8;"GB";"United Kingdom";3;16;"09/16/2004 16:31:32";NULL

9;"DE";"Germany";3;17;"09/16/2004 16:31:32";NULL

10;"FR";"France";3;18;"09/16/2004 16:31:32";NULL

11;"IT";"Italy";3;19;"09/16/2004 16:31:32";NULL

12;"ES";"Spain";3;20;"09/16/2004 16:31:32";NULL

13;"FI";"Finland";3;21;"09/16/2004 16:31:32";NULL

14;"SE";"Sweden";3;22;"09/16/2004 16:31:32";NULL

15;"IE";"Ireland";3;23;"09/16/2004 16:31:32";NULL

16;"NL";"Netherlands";3;24;"09/16/2004 16:31:32";NULL

17;"DK";"Denmark";3;25;"09/16/2004 16:31:32";NULL

18;"BR";"Brazil";5;85;"09/30/2004 11:25:43";NULL

19;"KR";"Korea, Republic of";1;88;"09/30/2004 11:25:43";NULL

20;"NZ";"New Zealand";6;89;"09/30/2004 11:25:43";NULL

21;"BE";"Belgium";3;79;"09/30/2004 11:25:43";NULL

22;"AT";"Austria";3;78;"09/30/2004 11:25:43";NULL

23;"NO";"Norway";3;82;"09/30/2004 11:25:43";NULL

24;"LU";"Luxembourg";3;81;"09/30/2004 11:25:43";NULL

25;"PT";"Portugal";3;83;"09/30/2004 11:25:43";NULL

26;"GR";"Greece";3;80;"09/30/2004 11:25:43";NULL

27;"IL";"Israel";1;86;"09/30/2004 11:25:43";NULL

28;"CH";"Switzerland";3;84;"09/30/2004 11:25:43";NULL

29;"A1";"Anonymous Proxy";0;0;"09/30/2004 11:25:43";NULL

30;"A2";"Satellite Provider";0;0;"09/30/2004 11:25:43";NULL

31;"AD";"Andorra";3;0;"09/30/2004 11:25:43";NULL

32;"AE";"United Arab Emirates";1;0;"09/30/2004 11:25:43";NULL

33;"AF";"Afghanistan";1;0;"09/30/2004 11:25:43";NULL

34;"AG";"Antigua and Barbuda";7;0;"09/30/2004 11:25:43";NULL

35;"AI";"Anguilla";7;0;"09/30/2004 11:25:43";NULL

36;"AL";"Albania";3;0;"09/30/2004 11:25:43";NULL

37;"AM";"Armenia";3;0;"09/30/2004 11:25:43";NULL

38;"AN";"Netherlands Antilles";3;0;"09/30/2004 11:25:43";NULL

39;"AO";"Angola";2;0;"09/30/2004 11:25:43";NULL

40;"AP";"Asia/Pacific Region";2;0;"09/30/2004 11:25:43";NULL

41;"AQ";"Antarctica";8;0;"09/30/2004 11:25:43";NULL

42;"AR";"Argentina";5;0;"09/30/2004 11:25:43";NULL

43;"AS";"American Samoa";6;0;"09/30/2004 11:25:43";NULL

44;"AW";"Aruba";5;0;"09/30/2004 11:25:43";NULL

45;"AZ";"Azerbaijan";1;0;"09/30/2004 11:25:43";NULL

46;"BA";"Bosnia and Herzegovina";3;0;"09/30/2004 11:25:43";NULL

47;"BB";"Barbados";5;0;"09/30/2004 11:25:43";NULL

48;"BD";"Bangladesh";1;0;"09/30/2004 11:25:43";NULL

49;"BF";"Burkina Faso";2;0;"09/30/2004 11:25:43";NULL

50;"BG";"Bulgaria";3;0;"09/30/2004 11:25:43";NULL

51;"BH";"Bahrain";1;0;"09/30/2004 11:25:43";NULL

52;"BI";"Burundi";2;0;"09/30/2004 11:25:43";NULL

53;"BJ";"Benin";2;0;"09/30/2004 11:25:43";NULL

54;"BM";"Bermuda";4;0;"09/30/2004 11:25:43";NULL

55;"BN";"Brunei Darussalam";1;0;"09/30/2004 11:25:43";NULL

56;"BO";"Bolivia";5;0;"09/30/2004 11:25:43";NULL

57;"BS";"Bahamas";7;0;"09/30/2004 11:25:43";NULL

58;"BT";"Bhutan";1;0;"09/30/2004 11:25:43";NULL

59;"BV";"Bouvet Island";5;0;"09/30/2004 11:25:43";NULL

60;"BW";"Botswana";2;0;"09/30/2004 11:25:43";NULL

61;"BY";"Belarus";3;0;"09/30/2004 11:25:43";NULL

2、执行导入命令

C:/>sqlldr userid=system/manager control=test.ctl

c)复杂格式的导入

Sqlldr

sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,

是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。

缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。

用法: SQLLDR keyword=value [,keyword=value,...]

 

有效的关键字:

    userid -- ORACLE username/password

   control – 控制文件

       log – 记录的日志文件

       bad – 坏数据文件

      data – 数据文件

   discard – 丢弃的数据文件

discardmax – 允许丢弃数据的最大值        (全部默认)

      skip -- Number of logical records to skip  (默认0)

      load -- Number of logical records to load  (全部默认)

    errors – 允许的错误记录数          (默认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)

                每次提交记录的缓冲区的大小(字节为单位,默认256000)

    silent --禁止输出信息 (header,feedback,errors,discards,partitions)

    direct – 使用直通路径方式导入                    (默认FALSE)

   parfile -- parameter file: name of file that contains parameter specifications

  parallel -- 并行导入                   (默认FALSE)

       file -- File to allocate extents from

  与bindsize成对使用,其中较小者会自动调整到较大者

sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填充bindsize;如超出,则以bindsize为准。

 

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 path

 resumable -- enable or disable resumable for current session(默认FALSE)

resumable_name

           -- text string to help identify resumable statement

resumable_timeout

           -- wait time (in seconds) for RESUMABLE(默认7200)

date_cache -- size (in entries) of date conversion cache(默认1000)

 

注意:有两种方式可以指定命令行参数:通过位置或者通过关键字。前者的例子:'sqlldr scott/tiger foo';

后者的例子:'sqlldr control=foo userid=scott/tiger';

不能前面使用关键字指定后面通过位置制定的混合方式;

比如:'sqlldr scott/tiger control=foo logfile=log' 是允许的,

但'sqlldr scott/tiger control=foo log'不允许。

为清楚起见最好所有命令行参数都用关键字指定。

控制文件:

一个控制命令的脚本文件,通常以ctl结尾,内容如下:

LOAD DATA

INFILE 't.dat'              要导入的文件

// INFILE 'tt.date' 导入多个文件

// INFILE *               表示要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容

 

INTO TABLE table_name    指定装入的表

BADFILE 'c:/bad.txt'    可选,指定坏文件地址,缺省在当前目录下生成与原文件名一致的.bad文件

 

************* 以下是4种装入表的方式

APPEND             原先的表有数据 就加在后面

INSERT             装载空表 如果原先的表有数据 sqlloader会停止 默认值

REPLACE           原先的表有数据 原先的数据会全部删除

TRUNCATE        指定的内容和replace的相同 会用truncate语句删除现存数据

 

************* 指定分隔符

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

// TERMINATED BY WRITESPACE 以空白分割

 

TRAILING NULLCOLS            表的字段没有对应的值时允许为空

 

************* 下面是表的字段

(

col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载

// 如: lg,lg,not 结果 lg lg

)

如果没声明FIELDS TERMINATED BY ',' 时,可以用下面两种方式实现同样功能:

1.为每一列指定分隔符

 (

 col_1 [interger external] TERMINATED BY ',' ,

 col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,

 col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'

 )

2.用位置告诉字段装载数据

 (

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

asp.net调用bat和ctl文件实现sql*loader的功能

1  后台调用bat文件

            Dim proc As System.Diagnostics.Process

            proc = System.Diagnostics.Process.Start("cmd.exe", " /c " & "D:\execise\SE004.bat")

            proc.WaitForExit()

  或者

        Shell("cmd.exe /c D:\execise\SE004.bat", AppWinStyle.NormalFocus)

 或者

             Dim p As New System.Diagnostics.Process

            'p.StartInfo.FileName = "cmd.exe"

            'p.StartInfo.Arguments = " /c " & "D:\execise\SE004.bat"

            'p.StartInfo.UseShellExecute = False

            'p.StartInfo.RedirectStandardInput = True

            'p.StartInfo.RedirectStandardOutput = True

            'p.StartInfo.RedirectStandardError = True

            'p.StartInfo.CreateNoWindow = False

            'p.Start()

            'Dim strValue As String = p.StandardOutput.ReadToEnd()

2  然后调用ctl文件,bat文件的

    SQLLDR USERID=spv3/paper@san CONTROL=d:\execise\SE004.CTL log=D:\execise\LOG\SE004.log

3, ctl文件的内容如下

LOAD DATA

INFILE 'D:\execise\SE004.CSV'

TRUNCATE

INTO TABLE TEMP_tableName

FIELDS TERMINATED BY ","

TRAILING NULLCOLS

(

id

,age

,num

,sum

)

4. 数据文件以 逗号分割

 

 

你可能感兴趣的:(数据库)