[ORACLE] MERGE문 UPDATE는 되는데 INSERT 안되는 현상

김민성·2023년 6월 7일
2
post-thumbnail

어느날 쿼리를 고치는데 MERGE문을 처음으로 수정해봤다.

아래는 문제가 생겼던 쿼리 예시이다.

MERGE INTO TEST.T_TABLE TTB
USING (
		SELECT NAME, AGE
        FROM TEST.T_TABLE
        WHERE NAME = :I_NAME
) A ON (TTB.NAME = A.NAME)
WHEN MATCHED THEN
         UPDATE SET AGE = :I_AGE,
         MDFCN_DT  = SYSDATE
WHEN NOT MATCHED THEN
         INSERT (NAME, AGE, MDFCN_DT)
         VALUES(:I_NAME, :I_AGE, SYSDATE);

처음 봤을때는 MERGE문의 문법상 오류가 없다고 판단했다.

INTO 구역에서 대상 테이블을 지정하고
USING 구역에서 비교할 테이블을 지정하고
ON 절에서 조건문
WHEN MATCHED THEN에서 맞으면 UPDATE
WHEN NOT MATCHED THEN에서 틀리면 INSERT

눈으로 보는 문법상 오류는 보이지 않았다.

그래서 MERGE문의 사용법을 찾아보니
같은 테이블을 바라볼 때,
다른 테이블을 바라볼 때 사용법이 달랐다.

결론 먼저 말하면

같은 테이블을 바라볼때는 DUAL을 사용하자.

MERGE INTO TEST.T_TABLE TTB
USING DUAL A ON (TTB.NAME = :I_NAME)
WHEN MATCHED THEN
         UPDATE SET AGE = :I_AGE,
         			MDFCN_DT  = SYSDATE
WHEN NOT MATCHED THEN
         INSERT (NAME, AGE, MDFCN_DT)
         VALUES(:I_NAME, :I_AGE, SYSDATE);

Why?

MERGE할 테이블이 타겟인 동시에 비교할 대상이라
비교 조건이 항상 MATCHED로 나온다.


참조 블로그

profile
정리하는 개발자

0개의 댓글