【问题标题】:Is there an function to retrieve the binary XML from oracle result set是否有从 oracle 结果集中检索二进制 XML 的功能
【发布时间】:2019-01-09 07:39:53
【问题描述】:

我正在尝试从 Oracle 12C 数据库的 XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS SECUREFILE BINARY XML 中提取数据。

我在我的代码中使用了这个选择查询:

select xmlserialize(document a.xmlrecord as clob) as xmlrecord from tablename

ResultSet rset = stmt.executeQuery();

OracleResultSet orset = (OracleResultSet) rset;
while (orset.next()) {
oracle.sql.CLOB xmlrecord = (oracle.sql.CLOB) orset.getClob(1);
Reader reader = new BufferedReader(xmlrecord.getCharacterStream()); 
}

这里“orset.getClob”在 oracle DB 中占用了更多内存,而我们在 oracle 数据库中的进程内存不足。目前我们将 XML 类型存储为 CLOB,业务有兴趣将其更改为 BINARY XML。

是否有从 oracle 结果集中检索二进制 XML 的选项?

请注意,我尝试了“orset.getClob”,这会导致内存错误,因为它将二进制 XML 更改为 clob。

还尝试使用“XMLType xml = (XMLType) orset.getObject(1);”,这工作正常,但获取 100 万条 XML 记录需要 27 分钟。

如果表类型存储是 CLOB 而不是 BINARY XML,则同样的 100 万个在 5 分钟内完成。

还有其他检索 BINARY XML 的选项吗?

【问题讨论】:

  • 我已经尝试过 "InputStream is= orset.getBinaryStream("xmlrecord");"但收到错误为“无效的列类型:未为类 oracle.jdbc.driver.T4CNamedTypeAccessor 实现 getBinaryStream”
  • 您是否尝试过使用列索引(int 数据类型)参数而不是列名(string 数据类型)?
  • 尝试使用“orset.getBinaryStream(1);”得到同样的上述错误
  • 您将深入了解详细信息,了解您正在使用的 Oracle 驱动程序会有所帮助。使用 Oracle 的 ojdbc drivers ResultSet#getBinaryStream(int) 方法对我有用,如果您使用的驱动程序不同,那么您的驱动程序中的实现似乎不支持相同的方法。

标签: java oracle12c resultset binary-xml


【解决方案1】:

Using JDBC to Access XML Documents in Oracle XML DB 的 Oracle 文档指出:

您可以通过以下任何一种方式使用 JDBC 选择 XMLType 数据:

  • 在 SQL 中使用 SQL/XML 函数 XMLSerialize,并在 Java 中以 oracle.sql.CLOBjava.lang.Stringoracle.sql.BLOB 形式获取结果。 Example 13-2 中的 Java sn-p 说明了这一点。
  • PreparedStatement中调用方法getObject()获取整个XMLType实例。该方法的返回值是oracle.xdb.XMLType 类型。然后您可以使用类XMLType 上的Java 函数来访问数据。 Example 13-3 展示了如何做到这一点。

所以你应该可以在 SQL 中使用XMLSERIALIZE( DOCUMENT your_binary_xml_column AS BLOB ),然后使用OracleResultSet#getBLOB(int) 来获取二进制数据。

将 Oracle 的 Example 13-2 改写为 BLOB 而不是 CLOB

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@", "QUINE", "CURRY");
OraclePreparedStatement stmt = (OraclePreparedStatement) conn.prepareStatement(
     "SELECT XMLSerialize(DOCUMENT e.poDoc AS BLOB) poDoc FROM po_xml_tab e");
ResultSet rset = stmt.executeQuery();
OracleResultSet orset = (OracleResultSet) rset;
while(orset.next())
{
  // the first argument is a BLOB
  oracle.sql.BLOB clb = orset.getBLOB(1);
  // now use the BLOB inside the program
}

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2017-08-21
    • 2021-12-20
    • 2013-12-12
    • 2021-04-05
    • 1970-01-01
    • 2016-07-29
    • 2011-06-04
    相关资源
    最近更新 更多