4

我正在尝试从 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 还有其他选项吗?

4

1 回答 1

1

使用 JDBC 访问 Oracle XML DB 中的 XML 文档的 Oracle 文档指出:

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

  • 在 SQL 中使用 SQL/XML 函数,并以、或JavaXMLSerialize形式获取结果。示例 13-2中的 Java 代码片段说明了这一点。oracle.sql.CLOBjava.lang.Stringoracle.sql.BLOB
  • 调用getObject()中的方法PreparedStatement获取整个XMLType实例。这个方法的返回值是类型oracle.xdb.XMLType。然后,您可以在类上使用 Java 函数XMLType来访问数据。示例 13-3显示了如何执行此操作。

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

将Oracle 的示例 13-2 解释为强制转换为 aBLOB而不是 a 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
}
于 2019-01-09T11:15:42.713 回答