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

mac2022-06-30  99

CREATE OR REPLACE PROCEDURE BATCHINSERTSK_DEVICE_RECORD1(      xmlstr  IN clob,          v_commits out number,      p_rows   Out Sys_Refcursor)ASiscz 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  );

转载于:https://www.cnblogs.com/iyoume2008/p/4844614.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)