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;