2010-02-08 149 views
1

我書面方式代碼上傳文件的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

您使用的是什麼版本的Oracle JDBC驅動程序? – skaffman 2010-02-08 08:40:46

+0

和什麼版本的Oracle? – Thilo 2010-02-08 08:42:27

+0

我正在使用oracle 10G並使用ojdbc14.jar – Vipul 2010-02-08 11:18:08

回答

0

在早期版本的Oracle中使用BLOBs的怪癖之一是我們無法在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的行。