어느 가을날의 전환점

ORACLE|오라클 수정 가능 조인 뷰(/*+ BYPASS_UJVC */), ORA-01779, MERGE 본문

Database/Oracle

ORACLE|오라클 수정 가능 조인 뷰(/*+ BYPASS_UJVC */), ORA-01779, MERGE

어느가을빛 2013. 5. 9. 13:59

※ 수정 가능 조인 뷰

1. /*+ BYPASS_UJVC */

   - Oracle 11g 부터 사용할 수 없는 힌트 임.

   - 키-보존이 안되서 나는 오류를 무시하라는 힌트.


UPDATE /*+ BYPASS_UJVC */

 ( SELECT A.GBN AS A_A

, B.GBN AS B_B

 FROM MAIN A

  INNER JOIN STEP B

  ON A.ID = B.ID

WHERE A.TIME='01'

 ) X

 SET X.A_A = X.B_B

;


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

   (ORA-01779: cannot modify a column which maps to a non key-preserved table)

   - 키보존 되도록 하려면 B테이블의 ID 컬럼을 PK, UK로 셋팅 해야 함.

     (Unique함을 보증)


3. 다른 방법

   1) Sub-Query

UPDATE MAIN A

  SET GBN = (SELECT GBN FROM STEP B WHERE B.ID = A.ID)

WHERE A.TIME = '01'

  AND EXISTS (SELECT 1 FROM STEP B WHERE B.ID = A.ID)

;

   2) Merge

MERGE INTO MAIN A

    USING (SELECT A.ID, B.GBN FROM MAIN A, STEP B WHERE A.ID = B.ID AND A.TIME='01') C

       ON (A.ID = C.ID)

WHEN MATCHED THEN

    UPDATE SET GBN = C.GBN

;

MERGE INTO target_table_name

      USING (table|view|subquery) ON (join condition)

WHEN MATCHED THEN 

     UPDATE SET col1 = val1[, col2 = val2…]

WHEN NOT MATCHED THEN 

     INSERT(...) VALUES(...)

Comments