error

[error] ORA-01461: LONG ๊ฐ’์€ LONG ์—ด์— ์‚ฝ์ž…ํ•  ๋•Œ๋งŒ ๋ฐ”์ธ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

dddzr 2025. 9. 1. 23:13

๐Ÿšจ์—๋Ÿฌ

ORA-01461: LONG ๊ฐ’์€ LONG ์—ด์— ์‚ฝ์ž…ํ•  ๋•Œ๋งŒ ๋ฐ”์ธ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ  LONG, CLOB ์ปฌ๋Ÿผ์— ์ž˜ ๋ชป๋œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ ค ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‚˜๋Š” ํ…Œ์ด๋ธ”์— LONG, CLOB ์ปฌ๋Ÿผ์ด ์—†๊ณ  BLOB์ด ์žˆ๋Š”๋ฐ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ!!

โญ ์ •ํ™•ํ•œ ๊ธฐ์ค€์€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚˜๋Š” ๊ธฐ์กด ํ…Œ์ŠคํŠธ ํ†ต๊ณผํ•œ ์ฝ”๋“œ์˜€๋Š”๋ฐ ๊ธธ์ด๊ฐ€ ๊ธด ๋ฐ์ดํ„ฐ ๋“ฑ๋กํ•  ๋•Œ์—๋งŒ ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค!!

 

๐Ÿ“–๊ธฐ์กด ์ฝ”๋“œ

MERGE INTO TB_GENR_DOC_MGMT target USING( 
SELECT 
#{boardId} AS boardId,
#{sno} AS sno, #{title} AS title,
#{contBlob, jdbcType=BLOB} AS cont
 FROM DUAL
 )
 source ON (target.BOARD_ID = #{boardId} AND target.SNO = #{sno})
 WHEN MATCHED THEN 
 UPDATE SET 
 TITLE = source.title,
 CONT = source.cont,
UPD_DT = SYSDATE
WHEN NOT MATCHED THEN
INSERT (BOARD_ID, SNO, TITLE, CONT, REG_DT)
VALUES (source.boardId, source.sno, source.title, source.cont, SYSDATE)

 

๐Ÿ”ฅ์›์ธ

  • “MERGE๋ฌธ์—์„œ BLOB ๋ฐ”์ธ๋“œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹” ๋•Œ๋ฌธ!!
  • MERGE์ฒ˜๋Ÿผ “WHEN MATCHED / WHEN NOT MATCHED” ๋‚ด๋ถ€์—์„œ source-select → target-update ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ฐ”๋กœ BLOB ๋ฐ”์ธ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ.

 

๐Ÿ’ก MERGE์—์„œ BLOB ๋ฐ”์ธ๋“œ ๋ฐฉ์‹

โœ… INSERT๋‚˜ UPDATE๋งŒ ํ•  ๋•Œ๋Š” ๊ดœ์ฐฎ์Œ

UPDATE TB_GENR_DOC_MGMT SET CONT = ? WHERE BOARD_ID = ?;

์—ฌ๊ธฐ์„œ ? ์ž๋ฆฌ์— BLOB ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด, JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ "์•„, ์–˜๋Š” BLOB ์ปฌ๋Ÿผ์— ๋„ฃ์„ ๋ฐ์ดํ„ฐ๊ตฌ๋‚˜" ํ•˜๊ณ  ์ž˜ ๋„ฃ์–ด์คŒ.

 

โœ… MERGE๋Š” ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฆ„

MERGE INTO TB_GENR_DOC_MGMT target USING ( SELECT ? AS cont FROM DUAL ) source ON (์กฐ๊ฑด) 
WHEN MATCHED THEN UPDATE SET CONT = source.cont
WHEN NOT MATCHED THEN INSERT (CONT) VALUES (source.cont)

์—ฌ๊ธฐ์„œ ?๋Š” ๊ทธ๋ƒฅ SELECT ์•ˆ์— ์žˆ๋Š” ๊ฐ’.

Oracle์€ "์ด ? ๋ญ˜๋กœ ํ•ด์„ํ•ด์•ผ ํ•˜์ง€?" ํ•˜๊ณ  ํ—ท๊ฐˆ๋ ค๋ฒ„๋ฆผ.

JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๊ทธ๊ฑธ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด/์ˆซ์ž์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๋ ค๋‹ค๊ฐ€ → BLOB์€ LONG์ฒ˜๋Ÿผ๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ์ด๋ผ๋Š” ์ œ์•ฝ ๋•Œ๋ฌธ์— ORA-01461 ์—๋Ÿฌ๋ฅผ ๋ฑ‰์Œ.

 

๐Ÿ›  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. EMPTY_BLOB() + RETURNING INTO ๋ฐฉ์‹ -> MERGE๋ฌธ ์•ˆ์—์„œ BLOB ์ปฌ๋Ÿผ์€ ์ง์ ‘ ๋ฐ”์ธ๋“œํ•˜์ง€ ์•Š๊ณ , EMPTY_BLOB()๋กœ ์ดˆ๊ธฐํ™” ํ›„ RETURNING INTO๋กœ InputStream ์ „์†ก
  2. MERGE ๋Œ€์‹  INSERT/UPDATE ๋ถ„๋ฆฌ
  3. Oracle JDBC ๋“œ๋ผ์ด๋ฒ„ ๋ฒ„์ „ ํ™•์ธ -> ๋“œ๋ผ์ด๋ฒ„๋งˆ๋‹ค MERGE+BLOB ์ง€์› ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ

 

โœ… 1. EMPTY_BLOB() + RETURNING INTO ๋ฐฉ์‹

๐Ÿšจ java.sql.SQLException: ์ผ๋ถ€ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ˆ˜์ • ํ›„์—๋„ ์—๋Ÿฌ ๋ฐœ์ƒํ•จ!! 

 

๐Ÿ”ฅ์›์ธ

WHEN MATCHED / WHEN NOT MATCHED ๋‘ ๊ฐœ์˜ RETURNING์ด ์กด์žฌ →  Oracle์—์„œ๋Š” RETURNING INTO๋Š” ๋‹จ์ผ DML์— ํ•˜๋‚˜๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, JDBC์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ CallableStatement + registerOutParameter ์‚ฌ์šฉ

 

๐Ÿ›  ํ•ด๊ฒฐ๋ฒ•

RETURNING์„ ์—†์• ๊ณ , BLOB์€ Java์—์„œ ๋ณ„๋„๋กœ SELECT ํ›„ UPDATE.

๊ทผ๋ฐ ์ด๋Ÿด ๋ฐ”์— ๊ทธ๋ƒฅ insert, update ๋”ฐ๋กœ ํ•˜๋Š”๊ฒŒ ๋‚˜์•„์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋‹ค..

<update id="updateNotice" parameterType="NoticeVO">
MERGE INTO TB_GENR_DOC_MGMT target
    USING (
        SELECT 
            #{boardId} AS boardId, 
            #{sno} AS sno, 
            #{title} AS title,
            EMPTY_BLOB() AS cont,
            TO_DATE(#{regDt}, 'YYYY-MM-DD hh24:Mi') AS regDt
        FROM DUAL
    ) source
    ON (target.BOARD_ID = #{boardId} AND target.SNO = #{sno})
    WHEN MATCHED THEN
        UPDATE SET
            TITLE = source.title,
            CONT = EMPTY_BLOB(),
            REG_DT = source.regDt
        RETURNING CONT INTO #{contBlob, jdbcType=BLOB}
    WHEN NOT MATCHED THEN
        INSERT (BOARD_ID, SNO, TITLE, CONT, VIEW_CNT, REG_DT, NTCE_END_DT)
        VALUES (source.boardId, source.sno, source.title, EMPTY_BLOB(), SYSDATE)
        RETURNING CONT INTO #{contBlob, jdbcType=BLOB}
</update>

 

 

โœ… 2. MERGE ๋Œ€์‹  INSERT/UPDATE ๋ถ„๋ฆฌ

<insert id="insertNotice" parameterType="NoticeVO">
    INSERT INTO TB_GENR_DOC_MGMT
    (BOARD_ID, SNO, TITLE, CONT, REG_DT)
    VALUES
    (#{boardId}, #{sno}, #{title}, #{contBlob, jdbcType=BLOB}, SYSDATE)
</insert>

<update id="updateNotice" parameterType="NoticeVO">
    UPDATE TB_GENR_DOC_MGMT
    SET
        TITLE = #{title},
        CONT = #{contBlob, jdbcType=BLOB},
        UPD_DT = SYSDATE
    WHERE BOARD_ID = #{boardId} AND SNO = #{sno}
</update>