Oracle
 sql >> Datenbank >  >> RDS >> Oracle

JdbcTemplate – Einfügen oder Aktualisieren von Oracle BLOB mit SQL MERGE

Ich habe das Problem dank @gvenzi answer gelöst, aber beschlossen, meine eigene Antwort zu posten, da ich einige zusätzliche Kommentare habe.

Also, ja, OracleLobHandler löst das Problem. Tatsächlich sind wir jedoch nicht gezwungen, veraltete Klassen zu verwenden. Im OracleLobHandler Dokumentation Ich habe

gefunden

Ich habe es getestet und es funktioniert.

Aber ich hatte ein anderes Problem mit SqlLobValue zusammen mit OracleTypes.BLOB in PreparedStatementSetter (Es wird hier beschrieben ClassCastException:SqlLobValue kann mit PreparedStatementSetter nicht in oracle.sql.BLOB umgewandelt werden )

Mein endgültiger Arbeitscode lautet wie folgt:

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