ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 把XML数据快速导入Oracle数据库表中

把XML数据快速导入Oracle数据库表中

原创 Linux操作系统 作者:yujj_cn 时间:2012-03-19 22:58:25 0 删除 编辑

一、问题产生

  周五到某项目组,说到我们的系统向某国外开发系统传递XML格式的凭证数据,1W条分录,该国外开发的系统很快就能返回,几乎在1秒之内。回宾馆后,我仔细想了一下这件事,结合我部相关系统的数据导入机制,感觉这个消息似乎很有刺激性,于是乎,就想验证一下,到底能有多快。

 

二、问题分析

  我部相关系统中的导入,大致来讲,需要以下步骤:txt-->xml-->vo-->db。影响性能的因素主要是以下两个:

  1、格式转换多

  2、校验多

  格式转换多,一是为了校验方便,二是为了写入数据库方便(VO)。校验多,主要是保证数据一致性、完整性等,属于业务逻辑,无法省略。

  某国开发的系统接受XML格式的凭证数据时,不会再做格式转换,也应该没有那么多的校验(最多校验科目在不在、借贷是否平衡等,这些校验的成本基本可以忽略),主要成本就在把xml存入数据库表中。

  验证xml文件写入数据库表的速度。

 

三、问题验证

  如果使用xml-->vo-->db的方法,在资源消耗上比较大(需要解析XML文件,并在内存中构造很多VOREFVO等对象),也就快不起来了。所以重点放在XML直接写入到数据库表中(假设XML中的数据是完全符合数据库表要求的)。

  1、建表

-- 目标表,保存最终的凭证数据

create table temp_voucher_detail (

  voucher_number   number,

  orient           integer,

  subject_code     varchar(200),

  debit_cash       number(18,2),

  credit_cash      number(18,2)

) tablespace NNC_DATA01;

-- 临时表,用于把xml存入到clob字段中,与我部系统xxxx_file_up表类似。

create table temp_clob

(

  id      number,

  xmlclob clob

)

tablespace nnc_data01;

 

  2、造数,并把xml数据手工存入上述临时表中,11000条数据,约1.8M。示例如下:

  11100100101200030000

  11100100101200030000

  11100100101200030000

。。。

 

  3、使用pl/sqlclob写入到目标表中,代码如下:

declare

  v_ctx    dbms_xmlsave.ctxType;

  v_rows   number;

  v_clob   temp_clob.xmlclob%type;

begin

  -- 临时表中有且仅有一条记录

  select xmlclob into v_clob from temp_clob where rownum = 1;

  v_ctx := dbms_xmlsave.newContext('TEMP_VOUCHER_DETAIL');

  v_rows := dbms_xmlsave.insertXML(v_ctx, v_clob);

  dbms_xmlsave.closeContext(v_ctx);

  dbms_output.put_line('count = ' || v_rows);

  commit;

end;

/

 

  4、清理:

drop table temp_clob purge;

drop table temp_voucher_detail purge;

在我的笔记本电脑上,载入11000条数据,耗时1.5-2秒之间,与直接insert的速度差不多。CPU有一个50-60%的高点.

无标题.gif

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26802046/viewspace-719066/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-03-19

  • 博文量
    8
  • 访问量
    37790