by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

MERGE 구문 작성 시 발생할 수 있는 에러와 해별방법 알아보기




1.TARGET TABLE과 SOURCE TABLE의 조인은 1:1이어야 한다.

에러발생 1) 중복 데이터 생성으로 ON절의 MERGE_T1, MERGE_T2 조인처리가 1:N 인 경우
MERGE INTO MERGE_T1 tt
USING (
SELECT c1, c2, c3
FROM MERGE_T2, (SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 2)
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.c1 = st.c1 )
WHEN MATCHED THEN
UPDATE SET tt.c2 = st.c2, tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;

ERROR at line 1:
ORA-30926: 원본 테이블의 고정행 집합을 가져올 수 없습니다.
해결방법 : SOURCE TABLE 데이터 추출시 DISTINCT나 GROUP BY 처리 필요
MERGE INTO MERGE_T1 tt
USING (
SELECT distinct  c1, c2, c3 <-- distinct 를 사용하여 중복을 제거해줌
FROM MERGE_T2, (SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 2)
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.c1 = st.c1 )
WHEN MATCHED THEN
UPDATE SET tt.c2 = st.c2, tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;
에러발생 2)ON절의 MERGE_T1, MERGE_T2 조인처리가 N:N 인 경우
MERGE INTO MERGE_T1 tt
USING (
SELECT c1, c2, c3
FROM MERGE_T2
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.c2 = st.c2 )
WHEN MATCHED THEN
UPDATE SET tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;

ERROR at line 1:
ORA-30926: 원본 테이블의 고정행 집합을 가져올 수 없습니다.
해결방법 : ON절의 조인연결 컬럼 확인 후 변경
MERGE INTO MERGE_T1 tt
USING (
SELECT c1, c2, c3
FROM MERGE_T2
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.c1 = st.c1 ) <-- 조인조건을 확인하여 처리 
WHEN MATCHED THEN
UPDATE SET tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;

2.UPDATE 컬럼은 ON절에 사용할 수 없다.

에러발생 1)UPDATE 컬럼은 ON절에 사용한 경우
MERGE INTO MERGE_T1 tt
USING (
SELECT c1, c2, c3
FROM MERGE_T2
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.c2 = st.c2 ) <-- update 컬럼을 on절에 사용
WHEN MATCHED THEN
UPDATE SET tt.c1 = st.c1, tt.c2 = st.c2, tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;

ERROR at line 1:
ORA-38104: ON절에서 참조되는 열을 갱신할 수 없음: "TT"."C1"
해결방법 : ON절의 조인컬럼을 rowid로 변경
MERGE INTO MERGE_T1 tt
USING (
SELECT c1, c2, c3
FROM MERGE_T2
WHERE c1 >= 99990
AND c1 <= 100090
) st
ON ( tt.rowid = st.rowid ) <-- 조인컬럼을 rowid로 변경처리 
WHEN MATCHED THEN
UPDATE SET tt.c1 = st.c1, tt.c2 = st.c2, tt.c3 = st.c3
DELETE WHERE (tt.c2 = 'A')
WHEN NOT MATCHED THEN
INSERT (tt.c1, tt.c2, tt.c3) VALUES (st.c1, st.c2, st.c3)
WHERE (st.c2 = 'A') ;

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.