oracle 使用XMLDOM包,保存XML节点数据到数据库表中,支持多个节点嵌套XML格式。

文章描述了一个涉及处理第三方接口返回的XML数据,将其转换并存储到公司的Oracle数据库(table_test1,table_test2,table_test3)的过程,同时创建了用于记录操作日志的table_test_log表。存储过程中包含针对不同数据源(如身份证查询)的SQL查询和异常处理部分。
摘要由CSDN通过智能技术生成

1.项目上用到了访问第三方接口,接口返回的数据格式是xml,需要保存在公司3个oracle的数据库表中,这里的table_test1,table_test2,table_test3就是要插入的目标表,供业务中读取,就有了本编文章,三个表的建表语句参考附件这里不在贴出。

2.存储过程脚本中下面一段。里面table_test4和table_test5是公司内部业务数据表,建表脚本这里不列出,只是为了获取需插入目标表,却又不在第三方接口返回的XML中的字段。into 后面的参数,可以直接改成v_FPATID:=001 这种直接赋值。

/*根据身份证号码查询库中相关信息,这里是利用了公司已有的业务数据库,通过vs_type获取一些其他要插入表中的基本的信息。这部分的逻辑可以成是获取v_FPATID,v_FPATNO,v_FPATFILENO,v_FVISIT_ID,v_FVISIT_NO,v_XB,v_FFULL_AGE,v_FPAT_ADDRESS,v_FPAT_TELEPHONE,v_FDIAGNOSIS,v_FPATNAME,v_FPATCSRQ 参数*/
      if vs_type = 'IP' then
        begin
          SELECT PAT_ID,ZYH,ZYH,JZH,JZH,XB,NL,LXDZ,LXDH,RYZD,XM,CSRQ into v_FPATID,v_FPATNO,v_FPATFILENO,v_FVISIT_ID,v_FVISIT_NO,
          v_XB,v_FFULL_AGE,v_FPAT_ADDRESS,v_FPAT_TELEPHONE,v_FDIAGNOSIS,v_FPATNAME,v_FPATCSRQ
           FROM (select row_number() over(partition by t.sfzh order by T.RYRQ desc) rowindex,t.*
          from table_test4 T where t.sfzh=v_sfzh) WHERE rowindex=1;
        exception
          when no_data_found then
            v_FPATID := '';
            v_FPATNO := '';
            v_FPATFILENO := '';
            v_XB := '';
            v_FFULL_AGE := '';
            v_FPAT_ADDRESS := '';
            v_FPAT_TELEPHONE := '';
            v_FDIAGNOSIS := '';
            v_FVISIT_ID := '';
            v_FVISIT_NO := '';
            v_FPATNAME := '';
            v_FPATCSRQ := null;
        end ;
      end if;

      if vs_type = 'OP' then
        begin
          SELECT a.PAT_ID,a.OPPAT_NO,a.OPPAT_NO,a.PAT_SEX_ID,b.FULLADDRESS,b.MOBILE,A.PAT_NAME,a.Pat_Bdate
          into v_FPATID,v_FPATNO,v_FPATFILENO,v_XB,v_FPAT_ADDRESS,v_FPAT_TELEPHONE,v_FPATNAME,v_FPATCSRQ
          FROM op.op_patient a,op.op_pat_address b where a.FAMILY_ADDR_ID=b.addressid(+) and a.PAT_IDNO=v_sfzh and rownum =1;

          SELECT LSH,LSHNO,NL,NL_UNIT,NL || NL_UNIT,ZD into v_FVISIT_ID,v_FVISIT_NO,v_FPAT_AGE,v_FAGE_UNIT,v_FFULL_AGE,v_FDIAGNOSIS
           FROM (select row_number() over(partition by t.BLH order by T.JZRQ desc) rowindex,t.*
          from table_test5 T where t.PAT_ID=v_FPATID) WHERE rowindex=1;
        exception
          when no_data_found then
            v_FPATID := '';
            v_FPATNO := '';
            v_FPATFILENO := '';
            v_XB := '';
            v_FFULL_AGE := '';
            v_FPAT_ADDRESS := '';
            v_FPAT_TELEPHONE := '';
            v_FDIAGNOSIS := '';
            v_FVISIT_ID := '';
            v_FVISIT_NO := '';
            v_FPAT_AGE := '';
            v_FAGE_UNIT := '';
            v_FPATNAME := '';
            v_FPATCSRQ := null;
        end ;
      end if;

3.存储过程脚本中“--写日志记录”,建表脚本如下。为了记录XML数据插入情况用。

-- Create table_test_log
create table table_test_log
(
  aguid         VARCHAR2(32) default SYS_GUID() not null,
  fpatno        VARCHAR2(32),
  sessno        VARCHAR2(10),
  interfacename VARCHAR2(200),
  interfaceurl  VARCHAR2(4000),
  inputparm     CLOB,
  outparm       CLOB,
  aresult       VARCHAR2(2),
  ausedate      DATE default sysdate not null
)
tablespace test
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns 
comment on column HT.BL_INTERFACE_LOG.fpatno
  is '编码';
comment on column HT.BL_INTERFACE_LOG.sessno
  is '系统编号';
comment on column HT.BL_INTERFACE_LOG.interfacename
  is '接口名称';
comment on column HT.BL_INTERFACE_LOG.interfaceurl
  is '接口地址';
comment on column HT.BL_INTERFACE_LOG.inputparm
  is '接口入参';
comment on column HT.BL_INTERFACE_LOG.outparm
  is '接口出参';
comment on column HT.BL_INTERFACE_LOG.aresult
  is '调用结果,0-成功';
comment on column test.BL_INTERFACE_LOG.ausedate
  is '调用时间';

4.整个存储过程脚本在附件。

5.xml入参示例也在附件。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值