2

私はオラクルの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

アプローチの 1 つとして、最上位ノードのコレクションを返す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 に答える