「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 つの文字列を連結することができない理由です。