2016-06-24 34 views
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> 

我想我目前使用PL SQL - CLOB(XML)的数据抓取 - 所有的XML标签的列表和结构中的数据是要获取

作为

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,但它给出了标签格式的数据。

+0

请向我们展示您的完整存储过程 –

回答

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; 

您需要正确地宣布你CSIM命名空间的XML文件内。添加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