免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5809 | 回复: 9
打印 上一主题 下一主题

一个sql*loader的问题,请教各位。没有人了解吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-30 13:44 |只看该作者 |倒序浏览
10可用积分
本帖最后由 daix5211 于 2010-07-01 10:17 编辑

题目是这样的
表结构为:
TABLENAME
(
    FIELD1                        VARCHAR2(12),
    FIELD2                         VARCHAR2(1),
    FIELD3                       VARCHAR2(1),
    FIELD4                        VARCHAR2(6)
)
数据文件为:
DATA.dat(|为分隔符):
090612|103101|0|097S 62926|9|1|805080| |0|1|000587274.00
090612|103101|0|100S 63692|9|1|805080| |0|1|007693443.00
090817|114433|0|097S 64207|9|1|805080| |0|1|016379213.00
090817|114433|0|100S 64671|9|1|805080| |0|1|000046937.00
090612|114543|0|003E 51870|X|1|808200| |0|1|000000005.30


现在想把数据文件DATA.dat中的第4、5、6、1列的值导入到表的FIELD1、FIELD2、FIELD3、FIELD4当中。
那么控制文件该怎么写呢?发帖之前查过了sqlloader的使用方法,没能找出解决办法,现在跟大家请教一下。

最佳答案

查看完整内容

这个问题主要是filler关键字的使用问题,控制文件如下:控制文件可以简化:然后运行你的用户名和密码,控制文件和日志文件自己根据自己的情况修改。PS:很久没用了,刚开始char(x)我都写成varchar2(x),出错了。在sqlldr中,类型不支持varchar2型。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-06-30 13:44 |只看该作者
本帖最后由 renxiao2003 于 2010-06-30 20:58 编辑

这个问题主要是filler关键字的使用问题,控制文件如下:
LOAD DATA
INFILE 'DATA.dat'
INTO TABLE TABLENAME
FIELDS TERMINATED BY '|'
(
FIELD4 char(6),
b filler char(6),
c filler char(1),
FIELD1 char(12),
FIELD2 char(1),
FIELD3 char(1),
g filler char(6),
h filler char(1),
j filler char(1),
k filler char(1),
l filler char(12)
)


控制文件可以简化:
LOAD DATA
INFILE 'DATA.dat'
INTO TABLE TABLENAME
FIELDS TERMINATED BY '|'
(
FIELD4 char(6),
b filler char(6),
c filler char(1),
FIELD1 char(12),
FIELD2 char(1),
FIELD3 char(1)
)

然后运行

  1. sqlldr user/pass control=x.ctl log=x.log
复制代码
你的用户名和密码,控制文件和日志文件自己根据自己的情况修改。

PS:很久没用了,刚开始char(x)我都写成varchar2(x),出错了。在sqlldr中,类型不支持varchar2型。

论坛徽章:
0
3 [报告]
发表于 2010-06-30 15:05 |只看该作者
没有人了解吗?难道

论坛徽章:
0
4 [报告]
发表于 2010-06-30 16:39 |只看该作者
楼主你真查过了嘛?

http://www.google.com/search?q=sqlldr&hl=en

google里搜sqlldr,出来第一个link,就是一个很详细的sql loader的使用手册,里面就包括了filler 的用法,还有BOUNDFILLER的介绍...

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
5 [报告]
发表于 2010-06-30 17:23 |只看该作者
本帖最后由 renxiao2003 于 2010-06-30 17:25 编辑

SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 6月 30 17:20:07 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

控制文件:      a.ctl
数据文件:      DATA.dat
  错误文件:    DATA.bad
  废弃文件:    未作指定

(可废弃所有记录)

要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续:    未作指定
所用路径:       常规

表 TABLENAME,已加载从每个逻辑记录
插入选项对此表 INSERT 生效

   列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
FIELD4                              FIRST     6   |       CHARACTER            
B                                    NEXT     6   |       CHARACTER            
  (FILLER FIELD)
C                                    NEXT     1   |       CHARACTER            
  (FILLER FIELD)
FIELD1                               NEXT    12   |       CHARACTER            
FIELD2                               NEXT     1   |       CHARACTER            
FIELD3                               NEXT     1   |       CHARACTER            
G                                    NEXT     6   |       CHARACTER            
  (FILLER FIELD)
H                                    NEXT     1   |       CHARACTER            
  (FILLER FIELD)
J                                    NEXT     1   |       CHARACTER            
  (FILLER FIELD)
K                                    NEXT     1   |       CHARACTER            
  (FILLER FIELD)
L                                    NEXT    12   |       CHARACTER            
  (FILLER FIELD)


表 TABLENAME:
  5 行 加载成功。
  由于数据错误, 0 行 没有加载。
  由于所有 WHEN 子句失败, 0 行 没有加载。
  由于所有字段都为空的, 0 行 没有加载。


为绑定数组分配的空间:                  1920 字节 (64 行)
读取   缓冲区字节数: 1048576

跳过的逻辑记录总数:          0
读取的逻辑记录总数:             5
拒绝的逻辑记录总数:          0
废弃的逻辑记录总数:        0

从 星期三 6月  30 17:20:07 2010 开始运行
在 星期三 6月  30 17:20:07 2010 处运行结束

经过时间为: 00: 00: 00.09
CPU 时间为: 00: 00: 00.06

运行日志如上!

导入后结果如下:

论坛徽章:
0
6 [报告]
发表于 2010-07-01 10:09 |只看该作者
本帖最后由 daix5211 于 2010-07-01 10:14 编辑
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 6月 30 17:20:07 2010

Copyright (c) 1982, 20 ...
renxiao2003 发表于 2010-06-30 17:23

啊 哦 是我对filler的用法 理解错误了
我是这样做的 因为实际当中的数据文件字段有几百列,而表的字段只有10列,
所以将所有字段写出来在用FILLER的话 有点麻烦了,所以我没有用FIELDS TERMINATED BY '|' 直接用POSITION截取了。
LOAD DATA
REPLACE
INTO TABLE TABLENAME
TRAILING NULLCOLS
(
    PART      POSITION(17:26) CHAR(10),
    NOU       POSITION(28:28 ) CHAR(1),
    VEND      POSITION(32:37) CHAR(6),
    CUTIN     POSITION(39:46) "trn_date(:CUTIN)",
    KUBUN     POSITION(50:50) CHAR(1),
    COST      POSITION(52:63 )"TO_NUMBER(:COST)",
    MITU      FILLER,
    HENKO     POSITION(151:153) CHAR(3),
    KOUTE     POSITION(30:30) CHAR(1),
    KYUMITU   POSITION(143:148 ) CHAR(6)
)
上面是我实际当中的例子
多谢renxiao2003

论坛徽章:
0
7 [报告]
发表于 2010-07-01 10:12 |只看该作者
楼主你真查过了嘛?



google里搜sqlldr,出来第一个link,就是一个很详细的sql loader的使用手册,里 ...
bigapple2008 发表于 2010-06-30 16:39



    你说的我看过了,谢谢。由于我在实际当中数据文件的字段有几百列,用FILLER比较麻烦。
还是谢谢你。

论坛徽章:
0
8 [报告]
发表于 2010-07-01 10:29 |只看该作者
Position的话,就是对文件格式要求比较高,因为csv文件不是每个字段都定长的。

如果自动化处理,可以用Bash的cut命令把需要的字段截取出来,然后再做load...

论坛徽章:
0
9 [报告]
发表于 2010-07-01 10:57 |只看该作者
Position的话,就是对文件格式要求比较高,因为csv文件不是每个字段都定长的。

如果自动化处理,可以用B ...
bigapple2008 发表于 2010-07-01 10:29

恩 是的 我现在用的这个数据文件在作成的时候已经格式化好了,都是定长的。

论坛徽章:
0
10 [报告]
发表于 2010-07-01 11:00 |只看该作者
Position的话,就是对文件格式要求比较高,因为csv文件不是每个字段都定长的。

如果自动化处理,可以用B ...
bigapple2008 发表于 2010-07-01 10:29



    对Linux不是很熟悉 刚刚接触 以后多多指教啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP