将二进制存储到BLOB中

时间:2012-09-12 11:40:31

标签: java oracle spring stored-procedures oracle10g

我必须通过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中可以吗?

由于

1 个答案:

答案 0 :(得分:4)

  1. 数据类型oracle.sql.BFILEoracle.sql.BLOB不同(设置Type.BLOB将起作用)。 Check this
  2. 您正在尝试将Type.BLOB保存到BFILE类型的字段中,因此驱动程序尝试执行的转换失败。 ( java.lang.ClassCastException:[B不能转换为oracle.sql.BFILE]]
  3. 恕我直言,您采取的方法似乎有效。 {(1}}可以安全地投射到二进制文件(byte[]
  4. 请尝试使用oracle特定类型BFILE此类与驱动程序jar 捆绑在一起)而不是oracle.jdbc.OracleTypes.BFILE。(我不知道spring会如何处理这个
  5. 此外,请check this link和(this as well)处理BFILE类型。这涉及使用Oracle特定类。