2013-08-03 43 views
2

在oracle中,我對XML很新,我有一個非常簡單的要求。在oracle中格式化xmltype的數據

我有一個函數返回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 

我怎麼可以給換行或行間添加空白。

我不想保存任何表中的數據。

回答

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