CREATE OR REPLACE PROCEDURE BATCHINSERTSK_DEVICE_RECORD1
(
      xmlstr  IN clob,    
      v_commits out number,
      p_rows   Out Sys_Refcursor
)
AS
iscz number;
zqcomit number;
pchsc varchar2(50);

BEGIN

savepoint sp01;  --设置回退点
v_commits:=0;     --v_counts初始值 0

--生成批次号,用于记录请求的唯一标识
select to_char(systimestamp,'yyyymmddhh24missff3') into pchsc  from dual;

-- 循环解析后的xml数据,逐条验证是否重复
 for xsk in  (select * from  ( SELECT
              EXTRACTVALUE(VALUE(t),'/u/i')    i   --recover_uuid
              ,EXTRACTVALUE(VALUE(t),'/u/t')   t   --register_unit_uuid
              ,EXTRACTVALUE(VALUE(t),'/u/l')   l   --device_type
              ,EXTRACTVALUE(VALUE(t),'/u/b')   b   --device_id
              ,EXTRACTVALUE(VALUE(t),'/u/n')   n   --nsrsbh
              ,EXTRACTVALUE(VALUE(t),'/u/m')   m   --nsrmc
              ,EXTRACTVALUE(VALUE(t),'/u/h')   h   --recover_people
              ,to_date(EXTRACTVALUE(VALUE(t),'/u/r'),'yyyy/MM/dd') r  --recover_date
              ,EXTRACTVALUE(VALUE(t),'/u/y')   y   --recover_reason
              ,EXTRACTVALUE(VALUE(t),'/u/p')   p   --recover_remark
              ,EXTRACTVALUE(VALUE(t),'/u/s')   s   --status
              ,EXTRACTVALUE(VALUE(t),'/u/ot')  ot  --hold_unit
              ,EXTRACTVALUE(VALUE(t),'/u/ht')  ht  --history_hold_unit
              ,EXTRACTVALUE(VALUE(t),'/u/e')   e   -- register_people
    FROM TABLE(XMLSEQUENCE(EXTRACT(
    XMLTYPE(xmlstr), '/d/u')))
    t) xat )
    
    loop
    --从正式表中遍历插入的数据,取出和 解析xml后的结果集的重复数据  。取出符合条件的数据条数 赋值变量 iscz
       select count(1) into iscz from sk_device_recover_tmp sk where sk.device_type=xsk.l and sk.device_id=xsk.b;
       
     
       if iscz=0 then          --如果数据为0,没有重复数据。那么插入正式表      
           insert into
        sk_device_recover_tmp r (
          r.recover_uuid,
          r.register_unit_uuid,
          r.device_type,
          r.device_id,
          r.nsrsbh,
          r.nsrmc,
          r.recover_people,
          r.recover_date,
          r.recover_reason,
          r.recover_remark,
          r.status,
          r.hold_unit,
          r.history_hold_unit,
          r.register_people
        )
        values (xsk.i,xsk.t,xsk.l,xsk.b,xsk.n,xsk.m,xsk.h,xsk.r,xsk.y,xsk.p,xsk.s,xsk.ot,xsk.ht,xsk.e) ;        
        v_commits:=v_commits+1;        --v_commits依次加1
        zqcomit:=zqcomit+1;          --zqcomit依次加1
        dbms_output.put_line(zqcomit);
         
                   if mod(zqcomit,100)=0  then  --分批提交
                      commit;
                   end if;

else
         --把重复的数据先放到表中临时存储,使用批次号标记
           insert into admin_work_area_tmp values(xsk.l,xsk.b,pchsc);
         end if;
               
   end loop;

--返回xml中和数据库中重复的数据,使用批次号查询  
open p_rows for select * from admin_work_area_tmp where pch=pchsc;
--删除当前批次号的数据
delete  admin_work_area_tmp where pch=pchsc;
commit;
v_commits:=v_commits+1;

--异常处理
exception
  when others then
      v_commits:=0;
      dbms_output.put_line(sqlcode||sqlerrm);
    rollback to savepoint sp01;
    
--xml字符串 示例 <d><u><i>123456654321555</i><t>caee3254e0e84384a24067ea510cfa74</t><l>1</l><b>2534556654321</b><n>123456</n><m>纳税人</m><h>回收人</h><r>2015/09/28</r><y>1</y><p>wqerqwr</p><s>1</s><ot>57106214a6f048989aa38a5fd80c7ba3</ot><ht>57106214a6f048989aa38a5fd80c7ba3</ht><e>1130000001</e></u></d>

end;
/

创建 中转表 正式表
create table  SK_DEVICE_RECOVER_tmp
(
  recover_uuid       VARCHAR2(32) not null,
  register_unit_uuid VARCHAR2(32),
  device_type        CHAR(1),
  device_id          VARCHAR2(20),
  nsrsbh             VARCHAR2(40),
  nsrmc              VARCHAR2(200),
  recover_people     VARCHAR2(200),
  recover_date       DATE,
  recover_reason     CHAR(1),
  recover_remark     VARCHAR2(200),
  status             CHAR(1),
  hold_unit          VARCHAR2(32),
  history_hold_unit  VARCHAR2(300),
  register_date      DATE default sysdate,
  is_error           CHAR(1) default 0,
  stock_label        CHAR(1) default 'N',
  pre_status         CHAR(1),
  register_people    VARCHAR2(100)
)

create table ADMIN_WORK_AREA_tmp
(
  l   NUMBER,
  b   VARCHAR2(50),
  pch VARCHAR2(50)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    next 1
    minextents 1
    maxextents unlimited
  );

分享最近和同事处理的 解析XML的相关问题的更多相关文章

  1. 分享一个解析XML成为php数组的方法

    原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open th ...

  2. POPTEST老李分享DOM解析XML之java

    POPTEST老李分享DOM解析XML之java   Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...

  3. 关于dom4j解析XML的问题分享

    最近在在做个程序需要将C#小工具转成java,因为需要涉及到操作xml文件所以需要引用dom4j: 使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速 ...

  4. 解析xml并且导入mysql

    https://www.zhihu.com/question/28139319 解析超过500G的xml 写入mysql,如何尽快写入? 解析超过500G的xml 写入mysql,如何尽快写入? 现在 ...

  5. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  6. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  7. 【Android学习笔记】XmlResourceParser解析xml文件

    最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...

  8. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  9. 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...

随机推荐

  1. SQL server 连接查询

    1.join on     左右拼接查询 2.union 上下拼接    注意:所拼接的列的数据类型要一致

  2. Android SwitchCompat 自定义颜色及使用

    在Android 5.0 中 Switch 更新了样式 变得 比较好用了 但是在5.0 以下的版本 还是老样子 不实用 因此 就有了 SwitchCompat 来兼容 它是v7 包中的 因此可兼容到 ...

  3. poj2886

    反素数范围不大,可以直接打表得然后就是模拟移动的过程我们可以用线段树优化,具体明天再说吧 ..] ,,,,,,,,,,,,,,                                  ,,, ...

  4. 【转】VMware Workstation 11 永久激活码key 非注册机

    原文网址:http://www.landiannews.com/archives/12565.html 昨天我们发布了<跨越式提升:VMware Workstation 11 发布 附下载地址& ...

  5. web页面布局思想

    一.盒子模型 网页可以看成由一个个"盒子"组成,如图: 由上图可以看出,页面分为上(网站导航).中.下(版权声明)三个部分,中间部分又分为左(商品分类).中(主要部分).右,这些版 ...

  6. HDU-4925 Apple Tree

    http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others)     ...

  7. robotium源码方法备注---clicker.java

    1.clickOnScreen(float x,float y) 在屏幕上点击一个指定的区域(x,y)横纵坐标 2.clickLongOnScreen(float x,float y, int tim ...

  8. 出现 HTTP Error 503. The service is unavailable 错误

    今天修改一些配置后重启了IIS,兴高采烈的按下了回车.duang一下,HTTP Error 503. The service is unavailable,蹦出这行字,网站挂了. 没动别的竟然这样了. ...

  9. cas 单点登录配置

    服务端配置 cas是个好东西,很灵活很好用,但是配置起来很麻烦 cas官方网站 http://downloads.jasig.org/ 下载服务端 CAS Server 3.3.3 Final 1.将 ...

  10. vijos1055 奶牛浴场

    挺好的一道题呢 O(n^2)或者O(wh) #include<cstdio> #include<cstring> #include<cstdlib> #includ ...