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




В консоли WebLogic отключите перенос типов данных (в Connection Pool -> Advanced, см. здесь). Перезапустите сервер, и теперь вы получите объект oracle.sql.CLOB вместо объекта weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB.
РЕДАКТИРОВАТЬ: для этого конкретного метода/класса вы можете использовать конкретное соединение поставщика (getVendorConnection()метод), которое должно возвращать развернутые объекты.
Хорошо, я отредактировал свой ответ с возможным обходным путем.
Поскольку я не мог развернуть или преобразовать объект, мне пришлось работать с самой базой данных:
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;
Спасибо за ответ. Я забыл указать, что не могу отключить эту опцию, потому что она уже настроена на рабочем сервере. Код подготовлен для обработки детерминированных приведений, но не для этого.