有没有办法将结果从表(xmlsequence(extract(xmltype(xml),xpath))传递给函数作为参数?
我有一个问题:
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
有什么想法吗?
答案 0 :(得分: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
。