[MyBatis/Oracle] Sequence๋ฅผ ํฌํ•จํ•œ Bulk Insert(๋‹ค์ค‘ ํ–‰ ์‚ฝ์ž…)

2025. 2. 7. 15:12ยท๐Ÿ’พ DataBase
728x90
728x90

์ฒ˜์Œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์ค‘ ํ–‰ ์‚ฝ์ž…์„ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค.

์˜ค๋ผํด์˜ INSERT ALL๊ณผ MyBatis์˜ foreach๋ฅผ ํ˜ผํ•ฉ ์‚ฌ์šฉํ•˜์—ฌ INSERT ALL ์ดํ›„์˜ INTO ~ VALUES๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ํ…Œ์ด๋ธ”์€ REPORT_MEMBER ์‹œํ€€์Šค ๊ฐ’์„ ๊ฐ€์ ธ์™€ PK๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

์ด์ฒ˜๋Ÿผ INSERT ์‹œ ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์ ์ธ BULK INSERT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

(ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ์‹œํ€€์Šค๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•จ. ๋ฌด๊ฒฐ์„ฑ ์˜ค๋ฅ˜ ๋ฐœ์ƒ)

### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด(INTERN_TASK.PK_REPORT_MEMBER)์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค

 

 

INSERT ALL ์ดํ›„์— INTO VALUES๋งŒ ๋ฐ˜๋ณต์‹œ์ผœ์„œ ๊ทธ๋Ÿฐ๊ฐ€ ํ•˜๊ณ 

INSERT INTO VALUES๋กœ ๋‹จ์ผํ–‰์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ

 

### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL ๋ช…๋ น์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค

 

์˜ค๋ผํด์—์„œ๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ INSERT ์‹คํ–‰์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค๊ณ  ํ•จ ...

์—ฌ๋Ÿฌ ๊ฐœ์˜ INSERT INTO VALUES๋ฅผ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ์ธ์‹ํ•ด์„œ ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ

 

์ฒ˜์Œ์—” ๊ตฌ๋ถ„์ž ์˜ค๋ฅ˜์ธ์ค„ ์•Œ๊ณ  ์ฝค๋งˆ๋„ ๋ถ™์—ฌ๋ณด๊ณ  ๊ณต๋ฐฑ๋„ ๋„์›Œ๋ณด๊ณ  ์„ธ๋ฏธ์ฝœ๋ก ๋„ ๋ถ™์—ฌ๋ณด๊ณ  ์œ„์น˜๋„ ์˜ฎ๊ฒจ๋ณด๊ณ  ๋‚œ๋ฆฌ๋ฅผ ์ณค๋Š”๋ฐ ์•„๋‹ˆ๋”๋ผ

 

๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด UNION ALL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ฟผ๋ฆฌ ๋™์ž‘๊นŒ์ง€ ํ™•์ธํ•˜์˜€๋‹ค.

 

<!-- ๋‚ด๋ถ€ SELECT์—์„œ foreach ์‚ฌ์šฉ → ๊ฐ memberId๋ฅผ UNION ALL๋กœ ๋ณ‘ํ•ฉ
         ๊ฐ UNION ALL ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ REPORT_MEMBER_SEQ.NEXTVAL ํ˜ธ์ถœ (Sequence๊ฐ’ PK) -->

    <insert id="saveReportMember">
        INSERT INTO INTERN_TASK.REPORT_MEMBER (ID, REPORT_ID, MEMBER_ID, CREATED_AT, CREATED_BY)
        SELECT REPORT_MEMBER_SEQ.NEXTVAL, reportId, memberId, SYSDATE, createdBy
        FROM (
        <foreach collection="reportMembers" item="member" open="(" separator=" UNION ALL " close=")">
            SELECT #{member.reportId} AS reportId, #{member.memberId} AS memberId, #{member.createdBy}
            AS createdBy FROM DUAL
        </foreach>
        )
    </insert>

 

INSERT ALL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์†๋„ ์ธก๋ฉด์—์„œ๋„ ๋น ๋ฅด๋‹ค๋Š” ๋ฒค์น˜๋งˆํ‚น ์ž๋ฃŒ๋ฅผ ๋ดค๋Š”๋ฐ, ํšŒ์‚ฌ ์—…๋ฌด์—์„œ ํ•˜๋‚˜์˜ SQL ์ฟผ๋ฆฌ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์šด์˜ ํ™˜๊ฒฝ์—์„œ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํž˜๋“ค๋‹ค๊ณ  ... ๋‹จ์ผ ํ–‰์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ์ง€์‹œ ๋ฐ›์Œ

 

๋‚˜ ์ €๊ฑฐ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ฐพ๋А๋ผ ๊ฑฐ์˜ ์ดํ‹€ ์‚ฝ์งˆํ–ˆ๋Š”๋ฐ ๋˜ ์‚ฝ์งˆ์„ ํ•ด

 

๊ฒฐ๊ตญ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋‹จ์ผ INSERT๋ฌธ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๊ธฐ๋กœ ํ•จ

 

// 2. REPORT_MEMBER
if (reportMemberReqDTO.getMemberIds() != null && !reportMemberReqDTO.getMemberIds().isEmpty()) {
    List<ReportMember> reportMemberList = reportMemberReqDTO.toDomains(reportId, createMemberId);

    for (ReportMember reportMember : reportMemberList) {
        reportCommandOutPort.saveReportMember(reportMember); // ๊ฐœ๋ณ„ Insert ์‹คํ–‰
    }
}
<insert id="saveReportMember">
    INSERT INTO INTERN_TASK.REPORT_MEMBER (ID, REPORT_ID, MEMBER_ID, CREATED_AT, CREATED_BY)
    VALUES (REPORT_MEMBER_SEQ.NEXTVAL, #{reportId}, #{memberId}, SYSDATE, #{createdBy})
</insert>
728x90
320x100
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ’พ DataBase' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Redis] ๋ ˆ๋””์Šค(Redis)๋ž€?  (0) 2025.03.11
[MyBatis] Oracle ์‹œํ€€์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ• (useGeneratedKeys)  (0) 2025.01.23
[ADSP] ๋ฐ์ดํ„ฐ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ <2๊ณผ๋ชฉ> ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš - 02์žฅ ๋ถ„์„ ๋งˆ์Šคํ„ฐํ”Œ๋žœ  (0) 2024.10.21
[ADSP] ๋ฐ์ดํ„ฐ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ <2๊ณผ๋ชฉ> ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš - 01์žฅ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš์˜ ์ดํ•ด  (0) 2024.10.19
[ADSP] ๋ฐ์ดํ„ฐ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ <1๊ณผ๋ชฉ> ๋ฐ์ดํ„ฐ ์ดํ•ด - 02์žฅ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์น˜์™€ ๋ฏธ๋ž˜  (0) 2024.10.13
'๐Ÿ’พ DataBase' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Redis] ๋ ˆ๋””์Šค(Redis)๋ž€?
  • [MyBatis] Oracle ์‹œํ€€์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ• (useGeneratedKeys)
  • [ADSP] ๋ฐ์ดํ„ฐ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ <2๊ณผ๋ชฉ> ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš - 02์žฅ ๋ถ„์„ ๋งˆ์Šคํ„ฐํ”Œ๋žœ
  • [ADSP] ๋ฐ์ดํ„ฐ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ <2๊ณผ๋ชฉ> ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš - 01์žฅ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐํš์˜ ์ดํ•ด
mxnxeonx
mxnxeonx
"์•„, ์ด๊ฑฐ ๋ญ์˜€๋”๋ผ"๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ์œ„ํ•œ ์ผ๊ธฐ์žฅ.
  • mxnxeonx
    MJ's Development Diary
    mxnxeonx
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (154)
      • ๐Ÿ’ป Language (43)
        • Java : ์ž๋ฐ” (18)
        • Python : ํŒŒ์ด์ฌ (9)
        • ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ (9)
        • Android : ์•ˆ๋“œ๋กœ์ด๋“œ (4)
        • JavaScript : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ (2)
      • ๐ŸŒ Environment (19)
        • IDE : ํ†ตํ•ฉ๊ฐœ๋ฐœํ™˜๊ฒฝ (9)
        • Virtual : ๊ฐ€์ƒํ™˜๊ฒฝ (10)
      • โš™ Framework (12)
        • Vue-๋ทฐ (3)
        • Spring-์Šคํ”„๋ง (7)
      • ๐Ÿ’พ DataBase (18)
      • ๐ŸŒŒ OS (36)
        • Linux-๋ฆฌ๋ˆ…์Šค (36)
      • ๐Ÿ’ฌ CI · CD (7)
        • Git : ๊นƒ (7)
      • ๐Ÿ“ƒ ETC (3)
      • ๐Ÿค– AI (4)
  • ๋งํฌ

    • GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
mxnxeonx
[MyBatis/Oracle] Sequence๋ฅผ ํฌํ•จํ•œ Bulk Insert(๋‹ค์ค‘ ํ–‰ ์‚ฝ์ž…)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”