Есть ли функция для извлечения двоичного XML из набора результатов Oracle?

Я пытаюсь извлечь данные из XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS SURUREFILE BINARY XML из базы данных Oracle 12C.

Я использую этот запрос выбора в моем коде:

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.

Есть ли возможность получить двоичный XML из набора результатов оракула?

Обратите внимание, что я пыталсяorset.getClobmsgstr "что приводит к ошибке памяти, так как он меняет двоичный XML на clob.

Также попробовал с " XMLType xml = (XMLType) orset.getObject(1);"это работает нормально, но для получения 1 миллиона записей XML требуется 27 минут.

Тогда как тот же миллион завершился за 5 минут, если хранилище табличного типа - CLOB вместо BINARY XML.

Есть ли какая-либо другая опция для получения BINARY XML?

1 ответ

Решение

Документация Oracle по использованию JDBC для доступа к документам XML в Oracle XML DB гласит, что:

Вы можете выбрать данные XMLType с помощью JDBC любым из следующих способов:

  • Используйте функцию SQL/XML XMLSerialize в SQL, и получить результат в виде oracle.sql.CLOB, java.lang.String или же oracle.sql.BLOB на Яве. Фрагмент Java в Примере 13-2 иллюстрирует это.
  • Метод вызова getObject() в PreparedStatement чтобы получить целое XMLType пример. Возвращаемое значение этого метода имеет тип oracle.xdb.XMLType, Тогда вы можете использовать функции Java на классе XMLType для доступа к данным. Пример 13-3 показывает, как это сделать.

Таким образом, вы должны быть в состоянии использовать XMLSERIALIZE( DOCUMENT your_binary_xml_column AS BLOB ) в SQL, а затем использовать OracleResultSet#getBLOB(int) чтобы получить двоичные данные.

Перефразируя Пример 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
}
Другие вопросы по тегам