如何从 weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 获取字符串?
How to get String from weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB?
环境: 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 开发人员中,我确实可以看到字符串检索正常,但在 Java:
- 如果我使用
getClobVal()
函数 Weblogic returns 类型 weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB
的包装对象,我无法转换或解包。
- 如果我不使用
getClobVal()
returns 和 oracle.sql.Opaque
,我也无法转换为任何东西。
代码:
使用 getClobVal()
:
...
HashMap <String, Object> element = (HashMap) iter.next();
String value = (unwrap & cast in some way ) element.get("VALUE");
...
我找不到从该对象获取字符串的方法,有什么想法吗?
编辑:
我无法禁用 Weblogic 包装。我正在考虑在数据库端做一些解决方法来代替 blob。
在您的 WebLogic 控制台中禁用数据类型的包装(在 Connection Pool
-> Advanced
下,请参阅 here)。重新启动服务器,现在您将得到一个 oracle.sql.CLOB
对象而不是 weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB
对象。
编辑:对于那个特定的method/class,你可以使用特定的供应商连接(getVendorConnection()
method)应该return 展开的对象。
由于无法解包或转换对象,我最终在数据库中工作:
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;
环境: 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 开发人员中,我确实可以看到字符串检索正常,但在 Java:
- 如果我使用
getClobVal()
函数 Weblogic returns 类型weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB
的包装对象,我无法转换或解包。 - 如果我不使用
getClobVal()
returns 和oracle.sql.Opaque
,我也无法转换为任何东西。
代码:
使用 getClobVal()
:
...
HashMap <String, Object> element = (HashMap) iter.next();
String value = (unwrap & cast in some way ) element.get("VALUE");
...
我找不到从该对象获取字符串的方法,有什么想法吗?
编辑: 我无法禁用 Weblogic 包装。我正在考虑在数据库端做一些解决方法来代替 blob。
在您的 WebLogic 控制台中禁用数据类型的包装(在 Connection Pool
-> Advanced
下,请参阅 here)。重新启动服务器,现在您将得到一个 oracle.sql.CLOB
对象而不是 weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB
对象。
编辑:对于那个特定的method/class,你可以使用特定的供应商连接(getVendorConnection()
method)应该return 展开的对象。
由于无法解包或转换对象,我最终在数据库中工作:
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;