XMLType列が11.2.0.1のデフォルトであるCLOBとして格納されている場合、Oracle 11g(特に11.2.0.1)のOracle XMLType列への書き込み/読み取りの解決策を概説しました。
参照回答: java spring hibernate シナリオでの oracle XMLType の使用
SQLDeveloper で、テーブル定義 (テーブル DDL) 内の [SQL] タブを表示すると、11.2.0.1 の XML 列ストレージが次のように定義されます。
XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS BASICFILE CLOB
問題: Oracle 11.2.0.2 では、XMLType のデフォルトのストレージ タイプは Binary XML であり、パフォーマンス上の理由から推奨されます。次のようになります。
XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS SECUREFILE BINARY XML
ただし、この方法で保存すると、参照されているソリューションは、データベースから XML として XMLType 列を読み取るために機能しなくなります。xmlType.getStringVal() からガベージを返します。これは、オラクルのバイナリでエンコードされた XML であると想定しています。
究極 の問題 Oracle binxml 形式から有効な XML ドキュメントに戻すことができません。
Oracle で概説されているように、さまざまな構成で Oracle BinXMLProcessor、BinXMLStream、BinXMLDecoder、および InfosetReader を試しましたが、デコードするのではなく、読み取るだけのように見えるため、エラーが発生します。
nullSafeGet 内の基本的な例 (コンテキストについては、リンクされた回答を参照してください)。
xmlType = (XMLType) rs.getObject(names[0]);
BinXMLProcessor xp = BinXMLProcessorFactory.createProcessor();
BinXMLStream bstr = xp.createBinXMLStream(xmlType.getInputStream());
BinXMLDecoder xdecode = bstr.getDecoder();
InfosetReader reader = xdecode.getReader();
while (reader.hasNext() && i < 25) {
i++;
reader.next();
logger.debug("1 v:" + reader.getValue() + ", s:" + reader.getStandalone() + ", type: " + reader.getEventType() + ", " + reader.getDataLength());
}
xmlType.getInputStream() を xmlType.getBlobVal(178)、xmlType.getBytesValue() に置き換えて同様のアプローチを試みましたが、それらはすべて例外をスローするか、ガベージ データを返します。
は。