2016-06-24 8 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) выборка данных - все данные из списка и Struct тегов 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