将table(xmlsequence())的结果作为参数传递给函数

时间:2014-09-19 12:02:37

标签: oracle plsql plsqldeveloper

有没有办法将结果从表(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

有什么想法吗?

1 个答案:

答案 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