Oracle
 sql >> база данни >  >> RDS >> Oracle

JdbcTemplate - Вмъкнете или актуализирайте Oracle BLOB с помощта на SQL MERGE

Реших проблема благодарение на отговора на @gvenzi, но реших да публикувам собствен отговор, тъй като имам някои допълнителни коментари.

Така че, да, OracleLobHandler решава проблема. Но всъщност не сме принудени да използваме остарял клас. В OracleLobHandler документация Намерих

Тествах го и работи.

Но имах друг проблем при използване на SqlLobValue заедно с OracleTypes.BLOB в PreparedStatementSetter (описано е тук ClassCastException:SqlLobValue не може да бъде прехвърлен към oracle.sql.BLOB с помощта на PreparedStatementSetter )

Окончателният ми работен код е както следва:

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. SQL заявка за получаване на прецизната стойност на колона

  2. Как да инсталирате perl DBD::Oracle на OSX Snow Leopard 10.6

  3. CREATE и DROP TABLESPACE Oracle

  4. Функция TO_CHAR(datetime) в Oracle

  5. Обработка на грешки в Oracle