Есть ли функция для извлечения двоичного 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.getClob
msgstr "что приводит к ошибке памяти, так как он меняет двоичный 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 }