Intereting Posts
groovy sql eachRow и метод строк Передача нескольких значений для одного параметра в Reporting Services Почему нет вывода, когда завершается блокировка блока PLSQL? Почему нет отношений «многие-ко-многим»? Запрос не работает нормально во время цикла SQL Statement отступ хорошая практика Как мне сначала возвращать строки с определенным значением? Как эффективно создавать базу данных MySQL для моего конкретного случая SQL Список всех имен столбцов в алфавитном порядке Ошибка SQL с указанием недопустимого имени столбца, если у меня есть проверка, если она существует. Зачем? Скрипт Sql для поиска недопустимых адресов электронной почты Как записывать отметки created_at и updated_at в Hive? MySQL «создает схему» и «создает базу данных» – есть ли разница Разница во времени между конечными датами первых записей на следующую дату записи Сгенерировать сценарий как для схемы, так и для данных

Получение XML-типа oracle, хранящегося в виде двоичного XML-кода из набора результатов в Java

Я изложил решение для записи / чтения в столбец Oracle XMLType для Oracle 11g (в частности, 11.2.0.1), если столбец XMLType хранится как CLOB, который по умолчанию используется для 11.2.0.1.

ОТЧЕТНЫЙ ОТВЕТ: Использование oracle XMLType в сценарии спящего режима Java

В SQLDeveloper, если вы просматриваете вкладку SQL в определении таблицы (таблица DDL), она определяет хранилище столбцов XML в 11.2.0.1 следующим образом:

XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS BASICFILE CLOB 

Проблема. В Oracle 11.2.0.2 по умолчанию для типа XMLType используется двоичный XML-код, который является предпочтительным по соображениям производительности. Это выглядит так:

 XMLTYPE COLUMN "ATTRIBUTE_XML2" STORE AS SECUREFILE BINARY XML 

ОДНАКО, однажды сохраненный таким образом, мое ссылочное решение больше не работает для ЧТЕНИЯ столбца XMLType в виде XML из базы данных. Он возвращает некоторый мусор из xmlType.getStringVal (), который, как я полагаю, представляет собой бинарный XML-код оракула.

Конечная проблема Я не могу преобразовать обратно из формата oracle binxml в действительный XML-документ.

Я пробовал Oracle BinXMLProcessor, BinXMLStream, BinXMLDecoder и InfosetReader в различных конфигурациях, как описано Oracle , но они, похоже, просто читают, а не расшифровывают его, – поэтому он ошибается.

Основной пример в nullSafeGet (см. Связанный ответ для контекста).

 xmlType = (XMLType) rs.getObject(names[0]); BinXMLProcessor xp = BinXMLProcessorFactory.createProcessor(); BinXMLStream bstr = xp.createBinXMLStream(xmlType.getInputStream()); BinXMLDecoder xdecode = bstr.getDecoder(); InfosetReader reader = xdecode.getReader(); while (reader.hasNext() && i < 25) { i++; reader.next(); logger.debug("1 v:" + reader.getValue() + ", s:" + reader.getStandalone() + ", type: " + reader.getEventType() + ", " + reader.getDataLength()); } 

Я попробовал подобные подходы, заменив xmlType.getInputStream () на xmlType.getBlobVal (178), xmlType.getBytesValue (), но все они генерируют исключение или возвращают данные мусора.

Да.

Нашел улов, и это не связано с кодом.

Правильный nullSafeGet в Hipernate UserType, как указано в ответе, на который ссылается:

 public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { if (logger.isTraceEnabled()) { logger.trace(" nullSafeSet: " + value + ", ps: " + st + ", index: " + index); } try { XMLType xmlType = null; if (value != null) { xmlType = XMLType.createXML(getOracleConnection(st.getConnection()), (String)value); } st.setObject(index, xmlType); } catch (Exception e) { throw new SQLException("Could not convert String to XML for storage: " + (String)value); } } 

ПРОБЛЕМА: при использовании столбца XML SECUREFILE BINARY (не CLOB) вы должны использовать последнее (11.2.0.2+) распределение xdb * .jar, которое в этом случае является xdb6.jar (~ 257kb). Раньше xdb * .jar (~ 136kb для 10.x) будет по-прежнему функционировать, не отбрасывая никаких исключений даже при некорректном декодировании BINARY XML.

TL; DR : Загрузите xdb6.jar (~ 257kb) с страницы драйверов JDBC Oracle 11gR2 (11.2.0.3) . Старые банки xdb терпят неудачу и будут вас огорчать.