menu

夏天

天使之所以会飞,是因为把自己看得很轻……

Avatar

excel文件导入oracle数据库&一些方法整理

前两天做了一个批量导入,上传一个excel模版,然后在java里用jxl循环读行,对数据进行校验和转换(生成主键什么的)后,再把这条数据插入到数据库中。

今天做了个测试,导1w条数据花了56s,5w条数据就直接抛出OutOfMemory的异常了。。。

查了一下,发现是jxl的性能问题,每次它都把整个excel读入内存。装载的时候就报错了。jxl的网站说的解决方案是把JVM的内存空间设大一些。可是我的数据文件才7M多啊,又不算多大,不明白。

在网上找了一下excel文件导入到oracle数据库的方法,倒是不少,不过看了一遍下来,发现基本都是不做数据校验的,而且要保证数据本身的完整性。跟我的要求非常不符合。很多时候用户都习惯使用Excel,特别是搞财务的。一般来说,他们不关心系统里的编码什么的,提供的数据也都是业务中使用的语言,而插入到数据库肯定都得把他们转换成对应编码。

不过这些方法说不定哪天用得上,记录一下吧~

想寻找一个更好的方法,以前倒是见过用JBook的,但是用那种方法的话,必须先把excel转换为vts的格式。而且效率也没有测过。

愁死了!
-------------------------------excel导Orcale数据库的方法-----------------------------------

方法一:使用SqlLoader
1、MicroSoft Excel文件(F)→另存为(A)→

保存类型为:制表符分隔,起名为text.txt,保存到C:\

2、连入SQL*Plus
以system/manager用户登录,
SQL> conn system/manager

创建表结构
SQL> create table test
    (
    id       number,        --序号
    username    varchar2(10),    --用户名
    password    varchar2(10),    --密码
    sj       varchar2(20)      --建立日期
    );

3、创建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,同上

4、在DOS窗口下使用SQL*Loader命令实现数据的输入

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

  默认日志文件名为:input.log
  默认坏记录文件为:input.bad

5、连接到SQL*Plus中,查看是否成功输入

方法二:使用PL/Sql
1、打开MicroSoft Excel文件(F);

2、使用PL/Sql连上相应数据库,执行

select * from DESTTABLE for update


取消锁定

3、选中Excel中要导入的数据区域,保证列的顺序和数据库字段顺序一致,ctrl+c;

4、选中PL/Sql中 DESTTABLE的要导入的列,ctrl+v;

5、执行post changes(小绿钩),然后commit。

方法三:使用Toad
没有装工具,还没试。。。

方法四:使用odbc+pb
用不同的odbc驱动程序连接不通的数据库
然后在pb环境中启动数据管道,利用数据管道传输数据
缺点:数据量大的时候,容易发生回滚段的问题,因为其无法指定专用的回滚段
也没试过。。。

方法五:使用sqlserver 的dts
做一个DTS连接把EXCEL与ORACLE 对应 的连接起来就可以直接运行导入数据了
也没试过。。。

方法六:使用excel生成脚本
比如excel文件中有id, name两列(分别为A列和B列), 要导入的表为person(person_id, person_name)

1、在excel 文件的sheet的最右列, 添加一列, 对应第一行数据的单元格写入以下内容:

= "INSERT INTO PERSON(PERSON_ID, PERSON_NAME) VALUES('" & A1 & "', '" & B1 & "');"

2、然后把这一行复制到所有数据行对应的列中.

3、这一列的内容拷贝出去保存, 即成为可以直接在sql*plus下运行的脚本.

方法七:使用Ultra Edit等生成脚本
用列编辑功能加上insert into ....等等

方法八:使用VBA生成脚本
在Excel里加个按钮,编个宏
觉得还不如方法六简便,对用户也不够友好。

java虚拟机jvm关于内存的设置与调优

http://fengyouhua.javaeye.com/blog/58170

感慨一下,以前觉得自己编程序还是挺有悟性的
现在觉得水平停留在肤浅的层面上
会用现成的工具编些处理逻辑不算什么
对工具的实现方式完全不了
遇到问题就崩溃了

方法7是我常用的。。。

方法1~8全是维护用的,客户都不会

迫不及待看了一下
竟然是技术贴

呵呵,我以为我的blog没什么人看呢
Dee竟然用“迫不及待”来形容,好感动啊

djslfasdf

不错

请问如何在Powerbuilder中将excel中的数据导入oracle数据库中

评论已关闭