继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

ORACLE导入TXT文件数据的解决思路

PIPIONE
关注TA
已关注
手记 1071
粉丝 147
获赞 702


需求场景:

data.txt源数据: 

[INFO] 2012-12-01 00:01:17 1610 FHR "行号=24. 查看指定计划的钢卷数据. 计划号=121200102."

[INFO] 2012-12-01 00:03:13 1610 FHR "行号=24. 查看指定计划的钢卷数据. 计划号=121200103."

[INFO] 2012-12-01 00:20:21 7362 RICC "IntervalTime=0,RollingTime=0"

[INFO] 2012-12-01 00:20:21 7363 RICC "WRTFMOff:   24.5,   24.8,   24.9,   25.1,   25.3,   25.3,   25.4,   26.5[C]."

[INFO] 2012-12-01 00:20:21 7362 RICC "IntervalTime=0, RollingTime=0, WRTFMOff:fT=24.632685"

 拿到这一份源数据后,第一眼我们看到像这种类型的数据就是应该使用sql*loader工具。把该源文件的数据导入到oracle数据库。

那么,我们先来熟悉一下这个工具:

一、sql*loader的概述

    很多情况之下,我们的数据需要批量处理传输到库,或者在库之间批量传输数据。其中,常见

的情形是用从事务处理系统提取的数据填充数据仓库,或将数据从实时系统复制到测试开发环境。对

大规模操作而言,使用标准的INSERT语句插入数据并不总是最佳方式,而oracle本身附带了SQL*Loader和Data Pump功能来支持批量操作。通过使用外部表,还可以在不将数据插入数据库的情况下读取数据。

    从体系结构上讲,SQL*Loader进程与其他用户进程类似:它通过服务器进程连接到数据库。

要插入行,可以采用两种技术:常规方式或直接路径读取。常规方式是使用INSERT。SQL*Loader用户进程构造values子句中包含绑定变量的insert语句,然后读取源数据文件,为每一个要插入的行执行

一次insert。此方法使用数据库缓冲区缓存,并生成撤销(undo)和重做数据(redo log),这些insert

语句与其他同类语句相似,通过普通的提交处理实现数据永久化。

    直接路径是避开了database buffer,sql*loader读取源数据文件,并将内容发送到服务器进程。

此后,服务器进程在其PGA中组装表数据中的块,并将它们直接写入数据文件。写操作在表的高水位

线上完成,称为数据保存(data save)。高水位线是表段中的一个标记,其上未写入任何数据:高水

位线上的空间是分配给尚未使用的表的空间。加载完成后,sql*loader移动高水位线,从而包含最新

写入的数据块,并且其他用户都可以立即看见这些数据块内的行。上述操作相当于一个commit命令。

此时不会生成撤销,也可以主动的取消重做日志的生成。所以说,直接路径加载是很快捷的。

二、SQL*Loader直接路径缺点

直接路径也存在以下缺点:

1、执行操作期间,必须删除或禁用引用完整性约束(只能实施unique、primary key、not null约束)。

2、会将针对其他会话的DML锁定表

3、不会激活insert触发器

4、无法为群集表使用

 

sql*loader体系结构:

3.jpg

三、实际操作演示

好了,这里没办法说得太细节化,相关的知识大家自己补充。

新建一个测试表TEST(我们要把源数据导入这个表):

SQL>conn hr/oracle@testdb

SQL> create table test(

  2  name varchar2(10),

  3  indate varchar2(20),

  4  intime varchar2(20),

  5  num int,

  6  source varchar2(10),

  7  description varchar2(128)

  8  );

准备好data.txt、data_test.ctl(加载所要使用的控制文件,定义数据规则的)

data_test.ctl: 

LOAD DATA

INFILE "E:\oracle\exercises\data.txt"

TRUNCATE INTO TABLE TEST

FIELDS TERMINATED BY " " optionally enclosed by '"'

(NAME,INDATE,INTIME,NUM,SOURCE,DESCRIPTION)

 

sqlldr这个命令就是sql*loader工具,是在$ORACLE_HOME/bin目录下

C:\Documents and Settings\Administrator>sqlldr hr/oracle@testdb  control=E:\oracle\exercises\data_test.ctl  log=E:\oracle\exercises\data_test.log

1.jpg

查询下结果:

2.jpg

到此为止,提出的需求已经完成。关于控制文件里面的命令是什么意思,有时间的话下次解释一下或者留点给大家自己去学习吧。希望大家可以相互参与到讨论当中,相互提高自己!

 

©著作权归作者所有:来自51CTO博客作者kasonbin的原创作品,如需转载,请与作者联系,否则将追究法律责任

oracle导入数据Oracle


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP