본문 바로가기
▶ Back-End/DataBase

Mybatis Oracle MERGE INTO 구문

by 오늘도 코딩 2021. 1. 29.
728x90
반응형

Oracle에서 데이터가 없으면 INSERT, 이미 데이터가 있으면 UPDATE

*하나의 쿼리로 두 가지 경우를 해결할 수 있다.

 

 

▷ 사용법

 

--쿼리 대상 [TABLE/VIEW]
MERGE INTO [TABLE/VIEW]    
    --비교대상 [TABLE/VIEW], DUAL은 위와 동일 할때 사용(쿼리 대상 [TABLE/VIEW]) 
    USING [TABLE/VIEW/DUAL] ON
    (
        -- 조건에 사용한 COLUMN은 UPDATE 불가
        [조건]	
    )
    --조건 일치 시 UPDATE
    WHEN MATCHED THEN    
        UPDATE SET
            [COLUMN1] = [VALUE1],
            [COLUMN2] = [VALUE2],
            [COLUMN3] = [VALUE3],
            ...
        -- UPDATE후 DELETE 사용 가능(DELETE 단독 사용 안됨)
        [DELETE WHERE [COLUMN1] = [VALUE1]]    
    -- 조건 불일치 시 INSERT
    WHEN NOT MATCHED THEN    
        INSERT
            (
                [COLUMN1],
                [COLUMN2],
                [COLUMN3],
                ...
            )
        VALUES
            (
                [VALUE1],
                [VALUE2],
                [VALUE3],
                ...
            )

 

 

▷ Example

 - 학생들의 년월 학점을 등록/수정

 - 학생들의 정보를 list로 넘겨  foreach를 사용해 쿼리를 반복 수행

 

<update id="example" parameterType="java.util.List">
        BEGIN
        <foreach collection="list" item="item" separator=" ">
        MERGE INTO GRADES_TABLE AS T  
            USING DUAL ON
            (
                T.STUDENT_ID = #{item.studentId}
                AND T.YYMM = #{item.yymm}
            )
           WHEN MATCHED THEN 
                UPDATE SET
                        GRADES= #{item.grades},
                        UPD_ID= #{item.id},
                        UPD_DTM=SYSTIMESTAMP
            WHEN NOT MATCHED THEN
                INSERT
                (
                    DEPARTMENT_ID,
                    STUDENT_ID,
                    GRADES,
                    YYMMDD,
                    RGST_ID,
                    RGST_DTM,
                    UPD_ID,
                    UPD_DTM
                )
                VALUES
                (
                    #{item.departmentId},
                    #{item.studentId},
                    #{item.grades},
                    #{item.yymm},
                    #{item.id},
                    SYSTIMESTAMP,
                    #{item.id},
                    SYSTIMESTAMP
                );
        </foreach>
        END;
</update>

 

 

▷ 관련 글

 

Mybatis Oracle BEGIN-END(PL/SQL)

한 번에 쿼리를 2개 이상 실행해야 하는 경우 사용 *PL/SQL에 대한 설명은 간단히 하고, Mybatis에서 어떻게 사용했는지를 다룰 예정 ▷ PL/SQL(Oracle's Procedural Language extension to SQL)이란 오라클에서 제공

coding-today.tistory.com

 

Mybatis foreach문(반복문/동적 SQL)

List or Array 형태의 동적인 값을 반복 처리하기 위해 사용 ▷ 기본 형태 ... ▷ 지원 태그 태그 명 태그 설명 collection 전달 받은 인자 item 전달 받은 인자 Alias(별명) open 구문 시작 시 들어갈 문자열 c

coding-today.tistory.com

 

MySql ON DUPLICATE KEY UPDATE 구문

MySql에서 데이터가 없으면 INSERT, 이미 데이터가 있으면 UPDATE *하나의 쿼리로 두 가지 경우를 해결할 수 있다. ▷ 사용법 INSERT INTO [TABLE] ( [COLUMN1], [COLUMN2], [COLUMN3], [COLUMN4] ) VALUES ( [VALUES1], [VALUES2],

coding-today.tistory.com

 

 

728x90
728x90

댓글