2012-09-12 74 views
2

我必須通過Oracle DB使用存儲過程。將二進制存儲到BLOB中

我用彈簧叫它

public StoreOperation(JdbcTemplate jdbcTemplate) { 
    super(jdbcTemplate, STORE); 
    declareParameter(new SqlParameter("in_binary_data", Types.BINARY)); 
    //declareParameter(new SqlParameter("in_binary_data", OracleTypes.BLOB)); 
    declareParameter(new SqlParameter("in_int_id", Types.INTEGER)); 
    declareParameter(new SqlOutParameter("out_int_id", Types.BIGINT)); 
    declareParameter(new SqlOutParameter("out_checksum", Types.VARCHAR)); 
    compile(); 
} 

public Map execute(byte[] signedPdf, Long intId) { 
    Map inParams = new HashMap(2); 
    inParams.put("in_binary_data", signedPdf); 
    inParams.put("in_int_id", intId); 
    return execute(inParams); 
} 

Apparenlty使用Types.BINARY工作

declareParameter(new SqlParameter("in_binary_data", Types.BINARY)); 

使用BLOB不允許

declareParameter(new SqlParameter("in_binary_data", Types.BLOB)); 

==> java.lang.ClassCastException :[B無法投射到oracle.sql.BFILE]]

這是一個傳統的存儲過程,所以我無法訪問Blob流到它,所以我被迫使用字節[]

這可能是一個問題,如果我使用的sql類型是Types.BINARY和數據庫類型是BLOB?

因此,在不使用java.sql.types.Blob和流的情況下在BLOB中存儲一個字節[]可以嗎?

由於

回答

4
  1. 數據類型oracle.sql.BFILE是不一樣的oracle.sql.BLOB(對於該設定Type.BLOB將工作)。 Check this
  2. 您正在嘗試將Type.BLOB保存到BFILE類型的字段中,因此驅動程序試圖執行的轉換失敗。 (java.lang.ClassCastException:[B不能轉換爲oracle.sql.BFILE]]
  3. 恕我直言,你採取的方法似乎有效。一個byte[]是安全的二進制文件,要投(BFILE
  4. 也請儘量使用Oracle特定類型oracle.jdbc.OracleTypes.BFILE此類捆綁驅動程序jar),而不是java.sql.BLOB我不知道春天將如何處理這

此外,請check this link和(this as well)用於處理BFILE類型。這涉及使用Oracle特定的類。

+0

我得到了byte [],並將其傳遞給使用BLOB作爲類型存儲的存儲過程 – Cris

+0

我編輯了我的答案。 – Santosh

相關問題