0

selectステートメントを介して Oracle データベースからストアド プロシージャを呼び出すクライアント アプリケーションを作成しています。ストアド プロシージャはカーソルを返します。このカーソルによって返される列のエイリアスを定義する必要があり、selectステートメント内でそれを行う必要があります。

Oracle データベースに変更を加えることができません。PLSQLを書くことができません。このデータベースでできることは、クエリを実行することだけです。

お知らせ下さい。


背景:このストアド プロシージャは、アプリケーション フレームワーク内で呼び出される多くのプロシージャの 1 つです。現在、すべての呼び出しは、次の構文を使用して変換を行い、結果を XML 形式で返します。

select XMLType.createXML(package_name.storedProcName('1', '2', '3')).getClobVal() as sresult  from dual;

ただし、このカーソルには、同じ名前 (具体的には "NAME") を持つ 2 つの列が含まれています。このクエリを TOAD で実行すると、列に自動的に「_1」が追加されますが、XMLType は次のように非論理的な XML になります。

<?xml version="1.0"?>
<ROWSET>
    <ROW>
        <ID>1</ID>
        <NAME>BRUCE WAYNE</NAME>
        <NAME>BATMAN</NAME>
    </ROW>
</ROWSET>

このため、列を XMLType に変換する前に列に別名を付ける必要があります。クエリ出力に重複する列名が含まれないようにして、代わりに XML を次のようにします (タグの重複なし):

<?xml version="1.0"?>
<ROWSET>
    <ROW>
        <ID>1</ID>
        <NAME>BRUCE WAYNE</NAME>
        <OTHER_NAME>BATMAN</OTHER_NAME>
    </ROW>
</ROWSET>
4

1 に答える 1

2

私はこれのためのスタイルシートに行きます。

例えば:

SQL> select XMLType.createXML(foo()).transform(xmltype('<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2  <xsl:template match="/ROWSET/ROW/NAME[2]">
  3     <NAME_1>
  4             <xsl:apply-templates select="@*|node()"/>
  5     </NAME_1>
  6  </xsl:template>
  7  <xsl:template match="@*|node()">
  8     <xsl:copy>
  9             <xsl:apply-templates select="@*|node()"/>
 10     </xsl:copy>
 11  </xsl:template>
 12  </xsl:stylesheet>')) as sresult  from dual
 13  /

SRESULT
--------------------------------------------------------------------------------
<ROWSET>
  <ROW>
    <ID>1</ID>
    <NAME>BRUCE WAYNE</NAME>
    <NAME_1>BATMAN</NAME_1>
  </ROW>
  <ROW>
    <ID>2</ID>
    <NAME>CLARK KENT</NAME>
    <NAME_1>SUPERMAN</NAME_1>
  </ROW>
</ROWSET>

つまり、ROW要素の2番目のNAMEオカレンス(/ROWSET/ROW/NAME[2])をNAME_1に置き換えます。他のすべてはそのままコピーされます。

于 2013-01-23T10:34:01.107 に答える