2

拥有一个 oracle 数据库,其中一个字段设置为 LOB(大对象)数据类型。当我运行 select 语句时,会引发此错误:

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

每个 tuble 内的字符串(即日志)的大小比缓冲区的最大容量多 10228。我需要获取整个字符串。

我能够想出这个临时解决方案:

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 ,但它没有用。

仅供参考,我们被限制使用 PL/SQL。环境是linux,rhel。

我需要一些有关如何执行此操作的指导。

4

1 回答 1

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);

顺便说一句:Oracle 10 已经过时了,你真的应该考虑升级。

于 2013-06-21T18:29:52.547 回答