2014-09-19 2 views
0

Есть ли способ передать результат из таблицы (xmlsequence (extract (xmltype (xml), xpath))) в функцию как параметр?Передача результата таблицы (xmlsequence()) в функцию как параметр

У меня есть запрос:

select 
    extractvalue(value(data), '/path/to/element') 
from 
    table(xmlsequence(extract(xmltype(in_xml), in_path))) data; 

То, что я хотел бы сделать, это выделить все операции XML в пару функций и есть что-то вроде этого:

select 
    get_value(data, '/path/to/element') 
from 
    get_table(in_xml, in_path) data; 

или, по крайней мере:

select 
    get_value(data, '/path/to/element') 
from 
    table(xmlsequence(get_table(in_xml, in_path)) data; 

Там нет никаких проблем с перемещением экстракта (XMLType (in_xml), in_path) в функцию get_table, но у меня есть проблема с передачей результата на get_value.

Любые мысли?

ответ

1

table() - выражение для коллекции таблиц, и на самом деле не имеет смысла передавать выражение (или даже таблицу) в качестве параметра.

Ближайший я могу думать от, чтобы пройти промежуточный результат xmlsequence(), полученный от функции, если вы хотите, прямо в get_value():

create or replace function get_xmlseq(in_xml varchar2, in_path varchar2) 
return xmlsequencetype 
as 
    l_xmlseq xmlsequencetype; 
begin 
    select xmlsequence(extract(xmltype(in_xml), in_path)) 
    into l_xmlseq 
    from dual; 

    return l_xmlseq; 
end get_xmlseq; 
/

create or replace function get_value (in_xmlseq xmlsequencetype, in_path varchar2) 
return varchar2 
as 
    l_value varchar2(32767); 
begin 
    select extractvalue(value(data), in_path) 
    into l_value 
    from table(in_xmlseq) data; 

    return l_value; 
end get_value; 
/

А потом называют его:

select get_value(get_xmlseq(:in_xml, :in_path), '/path/to/element') from dual; 

Какой gives the same result as your original query, по крайней мере, для очень простого примера.

Но если вы это делаете, у вас может быть одна функция, которая принимает (in_xml, in_path, '/path/to/element'), а также вызывает вызов xmlsequence. Или, поскольку это устарело, это использует xmltable и/или xquery.