将二进制文件存储到BLOB中



我必须通过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和流式传输是可以的吗?

感谢

  1. 数据类型oracle.sql.BFILEoracle.sql.BLOB不同(设置Type.BLOB适用于此)。检查一下
  2. 您正试图将Type.BLOB保存到类型为BFILE的字段中,因此驱动程序尝试执行的强制转换失败。(java.lang.ClassCastException:[B不能强制转换为oracle.sql.BFILE]]
  3. IMHO,你所采取的方法似乎是有效的。在二进制文件(BFILE)中强制转换byte[]是安全的
  4. 还请尝试使用oracle特定类型的oracle.jdbc.OracleTypes.BFILE此类与驱动程序jar捆绑在一起)而不是java.sql.BLOB。(我不确定弹簧将如何处理

此外,请检查此链接和(这也是)处理BFILE类型。这涉及到使用Oracle特定的类。

最新更新