订单问题处理模式

本文介绍了一种利用PL/SQL函数自动化处理XML中大字段内容的技术,包括获取节点位置、解析节点内容以及判断节点长度是否超过解析范围的方法。通过实现两个辅助函数,可以简化脚本编写,提高效率并减少错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    4月份,我要完成根据订单号去处理订单问题的脚步,但是总是不能很好的实现自动化处理,其中一个比较显著的问题是:ESS、IOM和资源 信息的交互,主要是通过大字段的xm。如果由于业务,或是营业操作不当,导致必须修改大字段才能过去的订单,我只能手动去修改大字段。于是,我一直在想,怎样去实现大字段的自动化处理,首先是要去获取大字段对应的节点,但是获取节点势必要频繁的使用截取和获取位置的函数,这样我的脚本会繁琐到我自己都看不懂。获取节点的脚本都是通用的,那么是不是可以存在这样的一个脚本呢。通过大字段、大字段的上级节点以及该节点出现的次数,去获取这个大字段内容的位置呢。系统中经常存在,节点中信息过长,导致无法解析到so系列表的数据,我是否可以通过获取两个节点的长度和所要解析到的列的容量去判断,是否该大字段已经超过我们能解析的范围了呢。是的,答案是可以的。

create or replace function rms_work.subXml(xml      in clob, --要解析的xml
                                            subStr   in varchar2, --节点名称
                                            position in number) --出现次数
  --根据xml和节点,获取节点的内容
  --add by rwx 20151009
 return clob is
  temp_position            number;
  targetStr                clob;
  end_substr               varchar2(300);
  temp_subStr_position     number;
  temp_end_substr_position number;
begin
  if position is null or position = '' then
    temp_position := 1;
  else
    temp_position := position;
  end if;
  select substr(subStr, 1, 1) || '/' || substr(subStr, 2)
    into end_substr
    from dual;
  select instr(xml, subStr, 1, temp_position) + length(subStr) --第n个<subStr>中<的位置 + <subStr> 的长度,即第n个<subStr>的后一位 
    into temp_subStr_position
    from dual;
  select instr(xml, end_substr, 1, temp_position) - 1 --第n个</subStr>的位置-1, 即:第n个</subStr>的前一位 
    into temp_end_substr_position
    from dual;
  select substr(xml,
                temp_subStr_position,
               -- instr(xml, subStr, temp_position) + length(subStr), --第n个<subStr>中<的位置 + <subStr> 的长度,即第n个<subStr>的后一位 
               temp_end_substr_position 
               -- (instr(xml, end_substr, temp_position) - 1) --第n个</subStr>的位置-1, 即:第n个</subStr>的前一位
               - temp_subStr_position)
               -- - (instr(xml, subStr, temp_position) + length(subStr))) --第n个<subStr>中<的位置 - 1 + <subStr> 的长度,即第n个<subStr>的后一位 
    into targetStr
    from dual;
  return targetStr;
end subXml;




create or replace function rms_work.subXml2(xml      in clob, --要解析的xml
                                            subStr   in varchar2, --节点名称
                                            position in number) --出现次数
  --根据xml和节点,获取节点的内容  返回带节点的内容信息
  --add by renweixin 20151009
 return clob is
  temp_position            number;
  targetStr                clob;
  end_substr               varchar2(300);
  temp_subStr_position     number;
  temp_end_substr_position number;
begin
  if position is null or position = '' then
    temp_position := 1;
  else
    temp_position := position;
  end if;
  select substr(subStr, 1, 1) || '/' || substr(subStr, 2)
    into end_substr
    from dual;
  select instr(xml, subStr, 1, temp_position) - 1 --第n个<subStr>中<的位置 ,即第n个<subStr>的首位
    into temp_subStr_position
    from dual;
  select instr(xml, end_substr, 1, temp_position) - 1 + length(end_substr) --第n个</subStr>的位置, 即:第n个</subStr>的末尾
    into temp_end_substr_position
    from dual;
  select substr(xml,
                temp_subStr_position,
                temp_end_substr_position - temp_subStr_position + 1)
    into targetStr
    from dual;
  return targetStr;
end subXml2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值