我必须通过Oracle数据库使用存储过程。
我用春天来称呼它
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);
}
Apparenty使用类型.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以流式传输到它,所以我被迫使用byte[]
如果我使用的sql类型是Types.BINARY,而数据库类型是BLOB,这可能是个问题?
那么,在BLOB中存储byte[]而不使用java.sql.types.BLOB和流式传输是可以的吗?
感谢
- 数据类型
oracle.sql.BFILE
与oracle.sql.BLOB
不同(设置Type.BLOB
适用于此)。检查一下 - 您正试图将Type.BLOB保存到类型为
BFILE
的字段中,因此驱动程序尝试执行的强制转换失败。(java.lang.ClassCastException:[B不能强制转换为oracle.sql.BFILE]]) - IMHO,你所采取的方法似乎是有效的。在二进制文件(
BFILE
)中强制转换byte[]
是安全的 - 还请尝试使用oracle特定类型的
oracle.jdbc.OracleTypes.BFILE
(此类与驱动程序jar捆绑在一起)而不是java.sql.BLOB
。(我不确定弹簧将如何处理)
此外,请检查此链接和(这也是)处理BFILE类型。这涉及到使用Oracle特定的类。