在 PL/SQL 过程中使用名称空间解析 XML 的未知数节点?
Parsing unknown number nodes of a XML with namespace in PL/SQL procedure?
我有一个 xml_data 正在传递给程序-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:a xmlns:ns2="http://www.sbc.com/iag/schemas/adapters" xmlns="http://www.sbc.com/iag/schemas/core">
<ns2:b>
<ns2:OrderNumber>99995</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>99699</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>69999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b
<ns2:b>
<ns2:OrderNumber>67999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
</ns2:a>
节点
ns2:b
可重复任意次数且不固定。
我如何获取这个
ns2:OrderNumber
从这个 xml oracle 中的数据 procedure.I 如果
我能够获取值
ns2:b(ns2:OrderNumber)
通过以下代码只出现一次-
select extractValue(
xml_data,
xmlns="http://www.sbc.com/iag/schemas/core"'
) '/ns2:a/ns2:b/ns2:OrderNumber/text()',
'xmlns:ns2="http://www.sbc.com/iag/schemas/adapters",
into order_number from dual;
dbms_output.put_line('FailedRetry -' ||order_number);
但是我如何继续迭代直到获得该节点的所有值
在 XML.I 中尝试了此站点上发布的不同解决方案,但 none 有效。
使用XMLTABLE.
select y.*
from dual,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
示例查询:
SQL> with x(xml_data) as (
select xmltype('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:a xmlns:ns2="http://www.sbc.com/iag/schemas/adapters" xmlns="http://www.sbc.com/iag/schemas/core">
<ns2:b>
<ns2:OrderNumber>99995</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>99699</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>69999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>67999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
</ns2:a>')
from dual
)
select y.*
from x,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
ORDERNUMBE SERVICEORD
---------- ----------
99995 88888
99699 88888
69999 88888
67999 88888
Elapsed: 00:00:00.03
SQL>
如果要迭代每条记录,请在游标中使用它。
decare
cursor c1 is select y.*
from dual,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
begin
for i in c1
loop
dbms_output.put_line('FailedRetry -' ||i.OrderNumber || ' '|| i.ServiceOrderNumber);
end loop;
end;
我有一个 xml_data 正在传递给程序-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:a xmlns:ns2="http://www.sbc.com/iag/schemas/adapters" xmlns="http://www.sbc.com/iag/schemas/core">
<ns2:b>
<ns2:OrderNumber>99995</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>99699</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>69999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b
<ns2:b>
<ns2:OrderNumber>67999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
</ns2:a>
节点
ns2:b
可重复任意次数且不固定。 我如何获取这个
ns2:OrderNumber
从这个 xml oracle 中的数据 procedure.I 如果
我能够获取值ns2:b(ns2:OrderNumber)
通过以下代码只出现一次-
select extractValue(
xml_data,
xmlns="http://www.sbc.com/iag/schemas/core"'
) '/ns2:a/ns2:b/ns2:OrderNumber/text()',
'xmlns:ns2="http://www.sbc.com/iag/schemas/adapters",
into order_number from dual;
dbms_output.put_line('FailedRetry -' ||order_number);
但是我如何继续迭代直到获得该节点的所有值
在 XML.I 中尝试了此站点上发布的不同解决方案,但 none 有效。
使用XMLTABLE.
select y.*
from dual,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
示例查询:
SQL> with x(xml_data) as (
select xmltype('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:a xmlns:ns2="http://www.sbc.com/iag/schemas/adapters" xmlns="http://www.sbc.com/iag/schemas/core">
<ns2:b>
<ns2:OrderNumber>99995</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>99699</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>69999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
<ns2:b>
<ns2:OrderNumber>67999</ns2:OrderNumber>
<ns2:ServiceOrderNumber>88888</ns2:ServiceOrderNumber>
</ns2:b>
</ns2:a>')
from dual
)
select y.*
from x,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
ORDERNUMBE SERVICEORD
---------- ----------
99995 88888
99699 88888
69999 88888
67999 88888
Elapsed: 00:00:00.03
SQL>
如果要迭代每条记录,请在游标中使用它。
decare
cursor c1 is select y.*
from dual,
xmltable( xmlnamespaces(default 'http://www.sbc.com/iag/schemas/core', 'http://www.sbc.com/iag/schemas/adapters' as "ns2"), 'ns2:a/ns2:b'
passing xml_data
columns OrderNumber varchar2(10) path 'ns2:OrderNumber',
ServiceOrderNumber varchar2(10) path 'ns2:ServiceOrderNumber'
) y;
begin
for i in c1
loop
dbms_output.put_line('FailedRetry -' ||i.OrderNumber || ' '|| i.ServiceOrderNumber);
end loop;
end;