0

「XmlInfo」がフィールドされたテーブルがあります。このフィールドは varchar2 であり、XML が含まれています。なぜ varchar2 なのかは聞かないでください。これは古いデータベース構造です。

この xml に 1 つのタグを「追加」する必要があります。そこで、xmltype.createXML と APPENDCHILDXML の組み合わせを使用しました。出力に問題があります。

元のフィールドはインデントなしです。最初に、「インデントなし」オプションを指定して xmlserialize を使用します。残念ながら、これは oracle 11 でのみ利用可能であり、このクエリは 10 と 11 oracle の両方で機能する必要があります。

だから私は変換を使用します。しかし、再び私は立ち往生しています。

元の値:

<info><Managed>False</Managed></info>

期待される:

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>


このクエリを使用します

select xmltype.createXML(t1.XmlInfo).APPENDCHILDXML('//info',XMLTYPE.CREATEXML('<ChangedDate>'|| to_char(sysdate, 'yyyy-mm-dd') ||'</ChangedDate>'))
  .transform(xmltype(
    '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output omit-xml-declaration="yes" indent="no"/><xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:template></xsl:stylesheet>'
  )).getStringVal()
from table1 t1

Oracle 11 の結果 (予想どおり):

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>

Oracle 10 の結果 (改行文字があります):

<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>



この変換の何が問題になっていますか、またはこのクエリを記述して両方のバージョンのオラクルで期待どおりに動作する方法はありますか?

備考: 次のステップでは、この値を更新する必要があるため、「updatexml」を使用します。これが、2 つの文字列を連結することができない理由です。

4

3 に答える 3

0

xmlエンジンを完全に削除してプレーンテキストで遊ぶことで問題を解決します... 、およびステートメントを
組み合わせることで、特定の場所に正しい日付を挿入する醜いあいまいなSQLを作成します。このノードのChangedDate文字列と古い値 の存在に応じて。 これは回避策であるため、質問に回答済みのマークを付けました。しかし、誰かがインデントの問題の本当の答えを知っているなら、私に知らせてください. 次の更新は、文字列関数だけでは簡単に処理できない可能性があるため...substrinstrcase


于 2013-10-20T23:07:22.200 に答える
0

使い方は簡単ではありませんが、XML の特定の表現を生成する必要がある場合は、XMLTransformが適切な演算子です。

于 2013-10-21T09:18:27.250 に答える