用于从LOB dataType的Oracle_db检索大字符串的Java类

时间:2013-06-21 15:46:59

标签: java sql jdbc oracle10g

在我的新/第一份工作中我们有一个oracle数据库,其中一个字段设置为LOB(大对象)数据类型。当我运行一个select语句 ,我得到了这个问题,这给我一个错误如下。

ERROR:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 10228,      
maximum: 4000)

每个tuble中的字符串大小(为日志)比缓冲区的Max容量大10228。现在我的老板让我写了一个让我们能够上课的java课程 检索整个字符串。

我需要一些关于如何解决这个问题的指导。    *如果让我们说,我已准备好java类,我如何配置它以与oracle一起工作,旁边(服务器名称,用户.pass)?       是否会与JDBC和其他jar文件放在同一目录中? 。您认为以下链接是否相关。

http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/oraext4.htm#1003223

http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/samapp2.htm

http://www.idevelopment.info/data/Programming/java/jdbc/LOBS/BLOBFileExample.java

顺便说一下,我能够提出如下临时解决方案:

Select  dbms_lob.substr( BLOB_FieldName, 4000, 1 ) 
from Database name Where [Condition];

使用此查询我能够获得字符串的前4000个字节,这很好,但我们需要整个字符串。然后在阅读了关于utl_raw.cast_to_varchar2之后,我尝试了以下

Select utl_raw.cast_to_varchar2( dbms_lob.substr( BLOB_fieldName, 19000, 1 ) ) 
from[dbname];

我使用了utl_raw.cast_to_varchar2,因为我在网上看到[Varchar2]数据类型最多可以容纳32k字节并且想到将[LOB]数据类型转换为Varchar2,但是它没有用。

FYI, 我们被限制使用PL / SQL。 环境是linux,我可以访问包含JDBC和所有其他jar文件的sqldeveloper文件,并可以添加任何新文件。

提前致谢。

1 个答案:

答案 0 :(得分:2)

使用任何最新的驱动程序,您只需选择CLOB列并调用ResultSet.getString()即可获取该值。无需像dbms_lob()这样的特殊待遇。

11.x驱动程序肯定能够做到这一点,但不确定过时的10.x驱动程序。

如果驱动程序太旧而且升级不是一个选项,您仍然不需要在SQL语句中进行任何特殊处理,只需使用CLOB从ResultSet处理getCharacterStream() - 即使适用于9.x驱动程序。

类似的东西:

ResultSet rs = statement.executeQuery("Select clob_column from table_name name ...");
Reader in = rs.getCharacterStream(1);
String clobValue = null;
if (!rs.wasNull())
{
   // process whatever the Reader returns, e.g. using Apache Commons IO
   clobValue = IOUtils.toString(in);
}
in.close();

使用当前驱动程序,您只需:

ResultSet rs = statement.executeQuery("Select clob_column from table_name name ...");
String clobValue = rs.getString(1);
Btw:Oracle 10已经过时了,你应该考虑升级。