2

我对 Oracle 中的 XML 很陌生,我有一个非常简单的要求。

我有一个返回 XMLTYPE 数据的函数,例如

<ROWSET>
 <ROW>
  <RCODE>FIRST CHECK DATA</RCODE>
 </ROW>
 <ROW>
  <RCODE>SECOND CHECK DATA</RCODE>
 </ROW>
 <ROW>
  <RCODE>THIRD CHECK DATA</RCODE>
 </ROW>
</ROWSET>

我想避免所有标签并以正常方式显示数据。我试过了

DECLARE
l_xmltype XMLTYPE;
l_var VARCHAR2(1000);

BEGIN
l_xmltype := getdata(849,20130804);                   

l_var := l_xmltype.extract('*/ROW/RCODE/text()').getstringval();   
END;

OUTPUT:

FIRST CHECK DATASECOND CHECK DATAJOHNSON KOUL

我想显示相同的

FIRST CHECK DATA

SECOND CHECK DATA

THIRD CHECK DATA

如何在行之间提供换行符或添加空格。

我不想将数据保存在任何表中。

4

1 回答 1

3

作为其中一种方法,您可以使用XMLSequence()函数,该函数返回顶级节点的集合,然后应用extractvalue()来获取实际的节点值。作为另一种方法,以及更可取的方法(从 oracle 11gr2 开始,XMLSequence()已被弃用),您可以使用XMLTable()函数:

这是一个返回XMLType数据类型数据的简单函数:

SQL> create or replace function GetXML return xmltype
  2  is
  3  begin
  4    return xmltype('<ROWSET>
  5                      <ROW>
  6                        <RCODE>FIRST CHECK DATA</RCODE>
  7                      </ROW>
  8                      <ROW>
  9                        <RCODE>SECOND CHECK DATA</RCODE>
 10                      </ROW>
 11                      <ROW>
 12                        <RCODE>THIRD CHECK DATA</RCODE>
 13                      </ROW>
 14                    </ROWSET>');
 15  end;
 16  /

Function created  
  1. 使用XMLSequence()

    select extractvalue(column_value, '/RCODE') as rcode
      from table(
                 xmlsequence(
                             extract(getxml, '/ROWSET/ROW/RCODE')
                            )
                 )
    

    结果:

    RCODE
    --------------------
    FIRST CHECK DATA
    SECOND CHECK DATA
    THIRD CHECK DATA
    
  2. 使用XMLTable()

    select Rcode
      from xmltable('/ROWSET/ROW/RCODE'
                      passing getxml columns Rcode varchar2(21) path '/RCODE')
    

    结果:

     RCODE
     ---------------------
     FIRST CHECK DATA
     SECOND CHECK DATA
     THIRD CHECK DATA
    
于 2013-08-03T20:54:09.847 回答