图片上传问题

时间:2010-02-08 08:35:53

标签: java oracle hibernate

我正在编写代码以在oracle上传文件作为BLOB但是在保存该文件时它给我异常java.sql.SQLException:ORA-01460:未实现或不合理

以下是将我的blob类型转换为byteArray的函数

private byte[] convertToByteArray(Blob fromBlob) {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      try {
       return convertToByteArrayImpl(fromBlob, baos);
      } catch (SQLException e) {
       throw new RuntimeException(e);
      } catch (IOException e) {
       throw new RuntimeException(e);
      } finally {
       if (baos != null) {
        try {
         baos.close();
        } catch (IOException ex) {
        }
       }
      }
     }
private byte[] convertToByteArrayImpl(Blob fromBlob, ByteArrayOutputStream baos)
throws SQLException, IOException {
byte[] buf = new byte[4000];
InputStream is = fromBlob.getBinaryStream();
try {
 for (;;) {
  int dataSize = is.read(buf);

  if (dataSize == -1)
   break;
  baos.write(buf, 0, dataSize);
 }
} finally {
 if (is != null) {
  try {
   is.close();
  } catch (IOException ex) {
  }
 }
}
return baos.toByteArray();

}

我认为是因为我的字节长度超过4000但是,保存超过4000字节的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

在早期版本的Oracle中使用BLOB的一个怪癖是我们无法在insert语句中包含完整的BLOB。它必须是一个两阶段的过程。

4000字节限制是关键,因为该数字是Oracle认为是SQL数据类型的上限。因此,如果我们要求它接受更大的LOB,Oracle可以在没有抓取的情况下处理4000字节或更少的LOB,但会抛出ORA-01460异常。解决方法是插入带有empty_blob()占位符的行,然后更新新行。

insert into t42 (id, blob_col) values (1, empty_blob());

update t42 
set blob_col = some_blob_variable
where id = 1;

这可能是你问题的原因;没有看到你的整个代码就很难说清楚。

注意:据我所知,前面的内容不适用于Oracle 11g:我们现在可以轻松插入包含超大BLOB的行。