【问题标题】:Pass the result of table(xmlsequence()) to a function as a parameter将 table(xmlsequence()) 的结果作为参数传递给函数
【发布时间】:2014-09-19 23:30:07
【问题描述】:

有没有办法将 table(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;

extract(xmltype(in_xml), in_path) 移动到 get_table 函数中没有问题,但我无法将结果传递给 get_value

有什么想法吗?

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多