2

我必须通过 Oracle DB 使用存储过程。

我用spring来称呼它

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 作品

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 和流式传输的情况下将 byte[] 存储在 BLOB 中可以吗?

谢谢

4

1 回答 1

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

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

于 2012-09-12T13:18:26.520 回答