Oracle
 sql >> Base de données >  >> RDS >> Oracle

JdbcTemplate - Insérer ou mettre à jour Oracle BLOB à l'aide de SQL MERGE

J'ai résolu le problème grâce à la réponse de @gvenzi, mais j'ai décidé de publier ma propre réponse car j'ai quelques commentaires supplémentaires.

Donc, oui, OracleLobHandler résout le problème. Mais en fait, nous ne sommes pas obligés d'utiliser la classe obsolète. Dans OracleLobHandler documents j'ai trouvé

Je l'ai testé et ça marche.

Mais j'ai eu un autre problème en utilisant SqlLobValue avec OracleTypes.BLOB dans PreparedStatementSetter (il est décrit ici ClassCastException :SqlLobValue ne peut pas être converti en oracle.sql.BLOB à l'aide de PreparedStatementSetter )

Mon code de travail final est le suivant :

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;
}