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

Я пытаюсь извлечь данные из XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS SECUREFILE 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, и мы выходим из памяти процесса в базе данных Oracle. В настоящее время у нас есть хранилище типов XML как CLOB, и бизнес заинтересован изменить его на BINARY XML.

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

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

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

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

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

1 Ответ

0 голосов
/ 09 января 2019

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

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

  • Используйте функцию SQL / XML XMLSerialize в SQL и получите результат как oracle.sql.CLOB, java.lang.String или oracle.sql.BLOB в Java. Фрагмент 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) для получения двоичных данных.

Перефразируя Oracle Пример 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
}
...