Как получить строку из weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB? - PullRequest
1 голос
/ 19 марта 2019

Среда : Oracle 11g, Weblogic 9.2, Java 4, драйвер: oracle.jdbc.OracleDriver

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

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.Я подумываю сделать обходной путь на стороне базы данных, чтобы вместо этого получить блоб.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

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

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;
0 голосов
/ 20 марта 2019

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

EDIT : для этого конкретного метода / класса вы можете использовать соединение определенного поставщика (getVendorConnection() метод ), который должен возвращать развернутые объекты.

...