ORA-01779 에러

2022. 6. 12.·Oracle/SQL

Oracle 21c부터 Updatable Join View에 대한 ORA-01779 에러가 사라진 것으로 보입니다. 참고로 이 에러와 관련된 BYPASS_UJVC 힌트는 11.1 버전에서 deprecate되었습니다.

Starting with Oracle Database Release 21c, it is not mandatory for all updatable columns in a join view to map to columns of a key-preserved table. When updating a join view, ensure that the UPDATE operation is deterministic. Note that this does not cause any impact on update performance.

 

테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;

CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);

INSERT INTO t1 VALUES (1, 1);
INSERT INTO t2 VALUES (1, 2);
COMMIT;

 

아래 UPDATE 문은 19.3 버전에서 ORA-01779 에러가 발생합니다.

-- 2: 19.3
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
   SET ac2 = bc2;

ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다

 

21.3 버전에서 UPDATE 문을 수행하면 구문이 정상적으로 수행됩니다.

-- 3: 21.3
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
   SET ac2 = bc2;

1 행이 업데이트되었습니다.

ROLLBACK;

 

하지만 동일 행이 2번 갱신되면 ORA-30926 에러가 발생합니다.

-- 4-1
INSERT INTO t2 VALUES (1, 2);

-- 4-2
UPDATE (SELECT a.c2 AS ac2, b.c2 AS bc2 FROM t1 a, t2 b WHERE b.c1 = a.c1)
   SET ac2 = bc2;

ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다

 

V$SYSTEM_FIX_CONTROL 뷰에서 관련 개선을 조회할 수 있습니다. 

-- 5
SELECT sql_feature, description, optimizer_feature_enable
  FROM v$system_fix_control
 WHERE bugno = 19138896;

SQL_FEATURE        DESCRIPTION                                              OPTIMIZER_FEATURE_ENABLE
------------------ -------------------------------------------------------- ------------------------
QKSFM_DML_19138896 allow update of join view without key preserved property 21.1.0

1개의 행이 선택되었습니다.

 

[2023-04-04]

23c부터 UPDATE 문과 DELETE 문에 대한 직접 조인이 가능해졌습니다.

 

관련 링크

  • Bug 19138896 - allow update of join view without key preserved property (Doc ID 19138896.8)

 

저작자표시 비영리 변경금지 (새창열림)
'Oracle/SQL' 카테고리의 다른 글
  • IF [NOT] EXISTS 절
  • UPDATE 문, DELETE 문에 대한 직접 조인
  • 무한소수의 집계 순서에 따른 결과 값
  • FOR UPDATE SKIP LOCKED 절 사용 방법
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 주력해 왔으며, 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며, Oracle 사의 공식 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (194)
      • Oracle (166)
        • SQL (32)
        • PLSQL (10)
        • Performance (72)
        • Administration (36)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (4)
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 공지사항

  • 최근 글

  • 최근 댓글

  • 인기 글

  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • hELLO· Designed By정상우.v4.10.0
정희락
ORA-01779 에러
상단으로

티스토리툴바