sql >> データベース >  >> RDS >> Oracle

JdbcTemplate-SQLMERGEを使用してOracleBLOBを挿入または更新します

    @gvenziの回答のおかげで問題を解決しましたが、コメントがいくつかあるので、自分の回答を投稿することにしました。

    そうです、OracleLobHandler 問題を解決します。しかし実際には、非推奨のクラスを使用する必要はありません。 OracleLobHandlerドキュメント 見つけた

    私はそれをテストしました、そしてそれは働きます。

    しかし、SqlLobValueの使用で別の問題が発生しました OracleTypes.BLOBと一緒に PreparedStatementSetter内 (ここで説明されています ClassCastException:PreparedStatementSetterを使用して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. MySQLトリガーを使用して、追加したばかりの行を更新できますか?

    2. Postgresを使用して一度に3つのテーブルにデータを挿入します

    3. Oracleで一意のインデックスを作成し、nullを無視するにはどうすればよいですか?

    4. 異なる形式の文字列を日付に変換する