我必须通过Oracle DB使用存储过程。
我用春天来称呼它
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);
}
使用Types.BINARY的Apparenlty
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来流式传输它所以我被迫使用byte []
如果我使用的sql类型是Types.BINARY并且数据库类型是BLOB,则可能会出现问题?
因此,在不使用java.sql.types.Blob和流式传输的情况下将字节[]存储在BLOB中可以吗?
由于
答案 0 :(得分:4)
oracle.sql.BFILE
与oracle.sql.BLOB
不同(设置Type.BLOB
将起作用)。 Check this。 BFILE
类型的字段中,因此驱动程序尝试执行的转换失败。 ( java.lang.ClassCastException:[B不能转换为oracle.sql.BFILE]] )byte[]
)BFILE
(此类与驱动程序jar 捆绑在一起)而不是oracle.jdbc.OracleTypes.BFILE
。(我不知道spring会如何处理这个)此外,请check this link和(this as well)处理BFILE类型。这涉及使用Oracle特定类。