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 能做什么?

    SQL 能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可在数据库中插入新的记录 SQL 可更新数据库中的数据 SQL 可从数据库删除记录 SQL 可创建新数据库 SQL ...

  2. request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会

    request.getParameter(). request.getInputStream().request.getReader()这三种方法是有冲突的,因为流只能被读一次.比如:当form表单内 ...

  3. lc面试准备:Implement Stack using Queues

    1 题目 Implement the following operations of a stack using queues. push(x) -- Push element x onto stac ...

  4. c++复习基础要点02 虚函数与模板 与static inline是否共存

    1.      虚函数能否定义为模板函数 当一个类有虚函数时,它一定有一个虚表,用来纪录每个虚函数的实际地址.这也就是说这个虚表的大小是在编译期就确定了的.有多少个虚函数,虚表就纪录几个.       ...

  5. WITH AS and materialize hints

    WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...

  6. java 对list进行排序

    前提: list中的元素是自定义对象,如何根据对象的元素进行排序呢? 比如List<Student>students 是一个list,每个元素都是Student对象,Student对象中有 ...

  7. HDOJ/HDU 2562 奇偶位互换(交换位置~)

    Problem Description 给定一个长度为偶数位的0,1字符串,请编程实现串的奇偶位互换. Input 输入包含多组测试数据: 输入的第一行是一个整数C,表示有C测试数据: 接下来是C组测 ...

  8. 【动态规划】天堂(Heaven) 解题报告

    天堂(heaven) 题目描述 每一个要上天堂的人都要经历一番考验,当然包括小X,小X开始了他进入天堂的奇异之旅.地狱有18层,天堂竟然和地狱一样,也有很多很多层,天堂共有N层.从下到上依次是第1,2 ...

  9. ural 1106. Two Teams 二分图染色

    链接:http://acm.timus.ru/problem.aspx?space=1&num=1106 描述:有n(n<=100)个人,每个人有一个或多个朋友(朋友关系是相互的).将其 ...

  10. ListView 分类: WinForm 2014-07-18 22:03 289人阅读 评论(0) 收藏

    一.ListView类(转载) 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLin ...