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

来源:互联网 发布:淘宝供货是什么意思 编辑:程序博客网 时间:2024/05/16 13:59

有一个文件,名称是export.txt,该文件前面几行如下所示:

000000000800,SEP000000000800,800

000000000810,SEP000000000810,810

000000000813,000000000813,813

000000000820,SEP000000000820,820

其中第一列和第二列是VARCHAR2,第三列是INTEGER

我在scott下建立了一个表是phone,三个字段的名称分别是MAC, DESCRIPTIONS, EXTENTION

前两个字段类型为VARCHAR2(20), 第三个字段类型为INTEGER

我现在希望将txt文件导入到scott.phone表里 

任意文本编辑器创建.ctl文件,内容如下:

INTO TABLE phone

FIELDS TERMINATED BY ","TRAILING NULLCOLSITPUB(MAC,DESCRIPTIONS,EXTENTION) 

SQLLDR   username/password@tns_name   CONTROL=c:\temp\discount.ctl   LOG=c:\temp\discount.log  DATA=c:\temp\discount.txt   BAD=c:\temp\discount.bad   ERRORS=100000 

如果没有使用 trailing nullcols,则当导入的数据中有字段为空值的情况下,会报如下错误: 

export.log的内容如下所示,193条记录中有11条没有导入。

SQL*Loader: Release 10.2.0.1.0 - Production on Sat Jun 20 23:34:27 Copyright (c) 1982,2005, Oracle.  All rights reserved.

Control File:   Export.

Data File:      export.txt

 Bad File:     export.bad

Discard File:  none specified

 (Allow all discards)

Number to load: ALL

Number to skip: 0

Errors allowed: 50

Continuation:    none specified

Path used:      Conventional

==========================================================================================

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 = '< xmlnamespace prefix ="st1" />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 来识别。

1,2,3

1,2

1,2,3

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