0
<ENVVAR CSIM:dt="list">
<item CSIM:dt="struct">
<Category dt:dt="string">ENV</Category>

<Name dt:dt="string">ABC</Name>
<Value dt:dt="string">abc</Value>
</item>
<item CSIM:dt="struct">
<Category dt:dt="string">ENV</Category>
<Name dt:dt="string">XYZ</Name>
<Value dt:dt="string">xyz</Value>
</item>
</ENVVAR CSIM>

我想获取数据为

Name   Value
ABC    abc
XYZ    xyz

我目前正在使用

extractvalue (ABC.IOXML, '/ENVVAR/item[1]/Name') as ParaName
extractvalue (ABC.IOXML, '/ENVVAR/item[1]/Value') as ParaValue 

它只获取item[1]值。但我想获取项目结构中的所有值。任何帮助将不胜感激。谢谢。PS:我什至尝试过Extract代替extractvalue,但它以标签格式提供数据。

4

1 回答 1

1

您可以使用XQuery,特别是这里的 XMLTable:

select x.*
from abc
cross join xmltable (
  '/ENVVAR/item'
  passing xmltype(abc.ioxml)
  columns name varchar2(20) path 'Name',
    value varchar2(20) path 'Value'
) x;

您需要在 XML 文档中正确声明 CSIM 命名空间。添加了 xmlns 的演示:

with abc(ioxml) as (
  select '<ENVVAR CSIM:dt="list" xmlns:CSIM="http://www.example.com" xmlns:dt="http://www.example.com">
<item CSIM:dt="struct">
<Category dt:dt="string">ENV</Category>
<Name dt:dt="string">ABC</Name>
<Value dt:dt="string">abc</Value>
</item>
<item CSIM:dt="struct">
<Category dt:dt="string">ENV</Category>
<Name dt:dt="string">XYZ</Name>
<Value dt:dt="string">xyz</Value>
</item>
</ENVVAR>' from dual
)
select x.*
from abc
cross join xmltable (
  '/ENVVAR/item'
  passing xmltype(abc.ioxml)
  columns name varchar2(20) path 'Name',
    value varchar2(20) path 'Value'
) x;

NAME                 VALUE              
-------------------- --------------------
ABC                  abc                 
XYZ                  xyz                 
于 2016-06-24T07:26:01.680 回答