Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32860
  • 博文数量: 17
  • 博客积分: 696
  • 博客等级: 上士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 16:59
文章分类

全部博文(17)

文章存档

2010年(4)

2009年(13)

我的朋友

分类: Oracle

2009-03-27 22:42:01

这个两天客户老是要求往临时表中导入一些文本数据,sql*loader也不太熟悉了
今天有空就总结一下。
一般要建立两个文件:控制文件和数据文件  ,如果数据少的话也可以合二为一
在导入完成之后会生成两个文件
*.bad 导入失败的数据
*.log 导入的日志信息

一 加载固定分割符隔开的数据

使用filed terminated by ',' optionally enclosed by '"'
例如:
create table t(oid int,desc1 varchar(10),create_time date);

建立 data.cvs 内容如下:
1,测试数据,2009-02-21 09:09:21
2,"测试数据,含有标点",2009-03-03 21:50:21
建立控制文件data.ctl如下:
load data
infile 'data.cvs'

into table t
fields terminated by ',' optionally enclosed by '"'
(oid,
 desc1,
create_time date 'yyyy-mm-dd hh24:mi:ss'
)
调用sqlldr userid=dg@billy/chenli control=data.ctl
导入后查询的数据格式如下:
select * from t;
 OID DESC1            CREATE_TIME
 1    测试数据          2009-02-21 09:09:21
 2    测试数据,含有标点 2009-03-03 21:50:21
2 rows selected

以上涉及到时间格式的导入 需要定义一下时间转换的格式
另外还有如果字段内容中含有与分割符相同的字符,需要使用optionally enclosed by来处理

二 加载字段固定长度的数据
比如
10whereareyou20090908
20iambillyfff20090807

在控制文件中使用
load data
infile 'data.cvs'
into table t
replace
(oid position(1:2),
 desc1 position(*:13),
 create_time postion(*:21) date 'yyyy-mm-dd hh24:mi:ss'
)

*指的是上一个字段的结束位置 desc1 position(*:13) 相当于desc1 position(3:13)
当然也可以不指定结束位置,这样来写
desc1 position(*) char(10) 等同于 desc1 position(*:13) 等同于 desc1 position(3:13)

另外还有如何在sqlldr中使用函数等功能下次再介绍。


阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~