在我的新/第一份工作中我们有一个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文件,并可以添加任何新文件。
提前致谢。
答案 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已经过时了,你应该考虑升级。