Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

JdbcTemplate - SQL MERGE का उपयोग करके Oracle BLOB डालें या अपडेट करें

मैंने @gvenzi उत्तर के लिए धन्यवाद समस्या हल की, लेकिन अपना उत्तर पोस्ट करने का निर्णय लिया क्योंकि मेरे पास कुछ अतिरिक्त टिप्पणियां हैं।

तो, हाँ, OracleLobHandler समस्या का समाधान करता है। लेकिन वास्तव में हमें बहिष्कृत वर्ग का उपयोग करने के लिए मजबूर नहीं किया जाता है। OracleLobHandler में दस्तावेज़ीकरण मैंने पाया

मैंने इसका परीक्षण किया और यह काम करता है।

लेकिन मुझे SqlLobValue का उपयोग करने में एक और समस्या थी साथ में OracleTypes.BLOB PreparedStatementSetter . में (यह यहाँ वर्णित है ClassCastException:SqlLobValue को oracle.sql.BLOB पर रेडीस्टेडमेंटसेटर का उपयोग करके नहीं डाला जा सकता है )

मेरा अंतिम कार्य कोड इस प्रकार है:

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. Grafana के लिए Enterprise Manager ऐप का उपयोग करके अपने OEM को Grafana से कनेक्ट करें

  2. मैं listagg . से डुप्लीकेट कैसे हटाऊं?

  3. मैं Oracle में अनुक्रम कैसे रीसेट करूं?

  4. मैं LIKE ऑपरेटर में कई शर्तें कैसे पेश कर सकता हूं?

  5. SQL डेवलपर में एक चर के मान को प्रिंट करना