【发布时间】:2013-09-02 08:05:10
【问题描述】:
如果 XMLType 列存储为 CLOB(这是 11.2.0.1 的默认值),我为 Oracle 11g(特别是 11.2.0.1)概述了写入/读取 Oracle XMLType 列的解决方案。
REFERENCE ANSWER: Using oracle XMLType in a java spring hibernate scenario
在 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
但是,一旦以这种方式存储,我引用的解决方案就不再适用于从数据库中将 XMLType 列作为 XML 读取。它从 xmlType.getStringVal() 返回一些垃圾,我假设它是 oracle 二进制编码的 XML。
终极问题 我无法从 oracle binxml 格式转换回有效的 XML 文档。
我在various configurations as outlined by 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(),但它们都抛出异常或返回垃圾数据。
嗯。
【问题讨论】:
标签: java sql oracle hibernate xmltype