Как получить строку из weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB?

Окружающая обстановка: Oracle 11g, Weblogic 9.2, Java 4, драйвер: oracle.jdbc.OracleDriver

Контекст: Я хочу извлечь значение xml из базы данных и работать с результатом в Java, используя следующий выбор:

SELECT EXTRACT(XML_TEXT, 'PATH/TO/XML/VALUE/text()').getClobVal() AS VALUE 
FROM MYTBALE WHERE id =xxxx;

Проблема: В SQL Developer я вижу, что строка восстановлена ​​нормально, но в Java:

  • Если я использую функцию getClobVal(), Weblogic возвращает обернутый объект типа weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB, который я не могу преобразовать или развернуть.
  • Если я не использую getClobVal(), возвращается oracle.sql.Opaque, который я также не могу ни к чему привести.

Код: Использование getClobVal():

...
HashMap <String, Object> element = (HashMap) iter.next();
String value = (unwrap & cast in some way ) element.get("VALUE");
...

Я не могу найти способ получить строку из этого объекта, есть идеи?

Обновлено: Я не могу отключить упаковку Weblogic. Я думаю о том, чтобы сделать обходной путь на стороне базы данных, чтобы вместо этого получить большой двоичный объект.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 897
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В консоли WebLogic отключите перенос типов данных (в Connection Pool -> Advanced, см. здесь). Перезапустите сервер, и теперь вы получите объект oracle.sql.CLOB вместо объекта weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB.

РЕДАКТИРОВАТЬ: для этого конкретного метода/класса вы можете использовать конкретное соединение поставщика (getVendorConnection()метод), которое должно возвращать развернутые объекты.

Спасибо за ответ. Я забыл указать, что не могу отключить эту опцию, потому что она уже настроена на рабочем сервере. Код подготовлен для обработки детерминированных приведений, но не для этого.

tec 20.03.2019 09:11

Хорошо, я отредактировал свой ответ с возможным обходным путем.

Matteo Baldi 20.03.2019 09:55
Ответ принят как подходящий

Поскольку я не мог развернуть или преобразовать объект, мне пришлось работать с самой базой данных:

create or replace procedure MANAGE_DOCUMENT(
  pSomeParam IN someTable.someColumn%TYPE,#if we need some param.
  pError OUT VARCHAR2
  )IS
  vResult BLOB;
  vDoc CLOB;

  begin
    pError := '';

    #extract base64 document
    SELECT EXTRACT(myColumn, 'xPath/to/the/element/text()').getClobVal()
    into vDoc
    FROM myTable WHERE someCondition;

    #check if doc exists
    IF vDoc IS NULL THEN
      pError :='Document not found';
    ELSE
      #decode and get blob
      vResult := utl_raw.cast_to_raw(vDoc);
      #do inserts or whatever        
      END IF;
    END IF; 
end MANAGE_DOCUMENT;

Другие вопросы по теме