Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

JdbcTemplate - Masukkan atau perbarui Oracle BLOB menggunakan SQL MERGE

Saya memecahkan masalah berkat jawaban @gvenzi, tetapi memutuskan untuk memposting jawaban saya sendiri karena saya memiliki beberapa komentar tambahan.

Jadi, ya, OracleLobHandler memecahkan masalah. Namun nyatanya kita tidak dipaksa untuk menggunakan kelas yang sudah usang. Dalam OracleLobHandler dokumentasi Saya menemukan

Saya mengujinya dan berhasil.

Tapi saya punya masalah lain menggunakan SqlLobValue bersama dengan OracleTypes.BLOB di PreparedStatementSetter (dijelaskan di sini ClassCastException:SqlLobValue tidak dapat dilemparkan ke Oracle.sql.BLOB menggunakan PreparedStatementSetter )

Kode kerja terakhir saya adalah sebagai berikut:

public void saveThumbnails(List<Thumbnail> fileList) throws SQLException, IOException {

    BatchPreparedStatementSetter b = new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            Thumbnail thumbnail = fileList.get(i);
            byte[] thumbnailBytes = thumbnail.getThumbnail();
            ps.setObject(1, thumbnail.getFileCId(), OracleTypes.NUMBER);
            ps.setObject(2, thumbnail.getType().toString(), OracleTypes.VARCHAR);
            DefaultLobHandler lobHandler = new DefaultLobHandler();
            lobHandler.setCreateTemporaryLob(true);
            lobHandler.getLobCreator().setBlobAsBytes(ps, 3, thumbnailBytes);
        }

        @Override
        public int getBatchSize() {
            return fileList.size();
        }
    };
    jdbcTemplate.batchUpdate(getSaveThumbnailSql(), b);
}

private String getSaveThumbnailSql() {
    // @formatter:off
    String sql = ""
            + "MERGE INTO file_thumbnails "
            + "     USING (SELECT ? as file_c_id, ? as thumbnail_type, ? AS thumbnail_image FROM DUAL) tmp "
            + "        ON (file_thumbnails.file_c_id = tmp.file_c_id AND "
            + "            file_thumbnails.thumbnail_type = tmp.thumbnail_type) "
            + "      WHEN MATCHED THEN "
            + "        UPDATE "
            + "           SET thumbnail_image = tmp.thumbnail_image"
            + "              ,thumbnail_date = SYSDATE "
            + "      WHEN NOT MATCHED THEN "
            + "        INSERT (c_id, file_c_id, thumbnail_type, thumbnail_image, thumbnail_date) "
            + "        VALUES (cedar_c_id_seq.nextval, tmp.file_c_id, tmp.thumbnail_type, tmp.thumbnail_image , SYSDATE)";
    //@formatter:on
    return sql;
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RANK, DENSE_RANK dan ROW_NUMBER berfungsi di Oracle

  2. Alternatif untuk tabel sementara di Oracle

  3. ORACLE Hubungkan dengan klausa yang setara di SQL Server

  4. Peramal. Bagaimana cara menampilkan tanggal dan waktu?

  5. terhubung dengan bulan