在oracle中格式化xmltype的数据

时间:2013-08-03 19:17:48

标签: oracle oracle11g xmltype

我在oracle中对XML很新,我有一个非常简单的要求。

我有一个返回XMLTYPE数据的函数 e.g。

<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

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

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

1 个答案:

答案 0 :(得分: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