2

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 を使用した見かけの動作

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.BFILE と同じではありません。これを確認してくださいoracle.sql.BLOBType.BLOB
  2. Type.BLOB をタイプのフィールドに保存しようとしているBFILEため、ドライバーが行おうとしているキャストが失敗しています。( java.lang.ClassCastException: [B は oracle.sql.BFILE にキャストできません]] )
  3. 私見、あなたがとったアプローチは有効なようです。Abyte[]はバイナリ ファイル ( BFILE)で安全にキャストできます
  4. また、代わりにオラクル固有のタイプoracle.jdbc.OracleTypes.BFILEこのクラスはドライバーjarにバンドルされています)を使用してみてくださいjava.sql.BLOB.(Springがこれをどのように処理するかわかりません

さらに、BFILE タイプの処理については、このリンクと (これも) を確認してください。これには、Oracle 固有のクラスの使用が含まれます。

于 2012-09-12T13:18:26.520 に答える