Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

갑을병정이야기

ORA-30926 오류 개요

Billcorea 2026. 8. 25. 19:03

ORA-30926 오류는 Oracle Database에서 MERGE나 UPDATE 작업 시 동일한 대상 행(row)을 두 번 이상 갱신하려 할 때 발생하는 에러입니다. 주로 소스 데이터에 중복된 키가 있거나 ON 조건이 불완전해 하나의 대상 행에 여러 소스 행이 매칭될 때 나타납니다.

📌 ORA-30926 오류 개요

  • 에러 메시지: ORA-30926: unable to get a stable set of rows in the source tables
  • 원인:
    • 소스 테이블에 중복된 키 값 존재
    • ON 절의 조인 조건 불충분 → 하나의 대상 행에 여러 소스 행 매칭
    • 비결정적(non-deterministic) WHERE 절 사용
    • ETL 과정에서 데이터 품질 문제 (중복 데이터 유입)

🔎 발생 시나리오 예시

  • MERGE INTO target USING source ON (target.id = source.id)
    • source에 동일한 id 값이 여러 개 존재하면, target의 한 행이 두 번 갱신되려 하여 오류 발생.
  • 중복된 ROWID가 USING 절 서브쿼리에서 반환될 경우에도 동일한 문제가 생김.

✅ 해결 방법

  • DISTINCT: 소스 쿼리에서 중복 제거
  • sql
    MERGE INTO target t
    USING (SELECT DISTINCT id, val FROM source) s
    ON (t.id = s.id)
    WHEN MATCHED THEN UPDATE SET t.val = s.val;
    
  • ROW_NUMBER(): 중복 키가 있을 경우 하나만 선택
  • sql
    MERGE INTO target t
    USING (
      SELECT id, val
      FROM (
        SELECT id, val, ROW_NUMBER() OVER (PARTITION BY id ORDER BY val) rn
        FROM source
      ) WHERE rn = 1
    ) s
    ON (t.id = s.id)
    WHEN MATCHED THEN UPDATE SET t.val = s.val;
    
  • ON 절 수정: 조인 조건을 더 구체적으로 작성해 중복 매칭 방지
  • 소스 테이블 정제: MERGE 실행 전 중복 데이터 제거

⚠️ 주의할 점

  • MERGE 문은 결정적(deterministic)이어야 하며, 동일 행을 여러 번 갱신할 수 없음.
  • 오류를 단순히 회피하기보다 데이터 품질 관리와 조인 조건 검증이 근본적인 해결책.
  • 대규모 DML 작업 중 발생할 수 있으므로, 사전 검증 SELECT로 매칭 결과를 확인하는 것이 안전.
반응형