view에 Trigger걸어서 안에 merge into 쓰기 0 6 7,514

by 김선호 merge into ORA-38104 [2009.05.21 16:44:09]


안녕하세요 (_ _) 오랜만에 질문 올려요~

암호화 관련 내용인데, a 테이블에 update를 하면 b테이블에 일치하는 조건이 있을 경우 update를, 없을 경우 insert를 하여라!

오늘의 과제인데... 이거 생각보다 했갈리네요 ㄱ - ..... 다음은 트리거안에 있는 merge into 구문입니다.

            merge into b
           using dual           
            on (b.customer_id = :old.customer_id )
            when matched then                                   
                  UPDATE 
                  SET ID=:new.ID, NAME=:new.NAME                              
            when not matched then          
                       INSERT 
                       (    ID, NAME        )
                       VALUES
                       (    :new.ID,  :new.NAME;)

update b
set  ID=1, NAME='김선호'
where id = 10000194;         실행시

ORA-38104: Columns referenced in the ON Clause cannot be updated: "ID"

라고 나옵니다.

안되가지고 중간에 merge into 구문 빼고 dbms_output.put_line으로 들어오는 old와 new id 값을 체크해봤는데

new.id : customer: 1
old.id : customer: 10000194

라구 잘 나왔거든요. 근데 왜 저런 오류가 나오는지 도통 이해가 안가네요..... 고수님들 도움 부탁드립니다!!

by 마농 [2009.05.21 17:45:37]
머지구문의 on절에서 참조된 컬럼을 변경할 수 없다는 말이네요.

by 김선호 [2009.05.22 10:55:41]
그럼 merge into 쓸 때는 모든 컬럼의 update가 불가능한 거네요.... 그럼 select 임시저장 후 delete-> insert 말고 다른 방법은 없을 까요?

by 마농 [2009.05.22 11:45:41]
1. 모든 컬럼의 업데이트가 불가한것이 아니죠.
- ON 절의 조건으로 사용된 컬럼에 대해서만 변경이 불가한거죠.
2. "select 임시저장 후 delete-> insert"는 무슨 의미인지 모르겠네요.
- 그냥 count후 0건이면 insert 아니면 update하시면 됩니다.
- 아니면 일단 update한후 update결과건수가 0건이면 insert하셔도 되구요.
- 아니면 일단 insert한후 중복 오류 발생시에 update하는 방법도 있구요.

by 김선호 [2009.05.25 15:16:45]
select 후 커서에 내용 저장 하고 delete 한 다음 insert 한다는 거였습니다. 제가 잘 못 써놨네요 ㅎ count하기엔 row가 너무 많아 못쓰겠구...
그리고 on 에 조건을 안걸면 matched ,not matched구문을 못 쓰는거 아닌가요? 음;;

by 마농 [2009.05.25 17:07:17]
1. count하실때 풀스캔을 염려하시는건가요?
- 조건값을 인덱스키로 잡아 놓으셨다면 문제 없어 보입니다.
2. on절에 조건을 안주면?
- 머지구문 자체 특성상 조건절에 사용한 컬럼을 갱신할수 없다고 말씀드린것은
조건절을 쓰지 말라는 뜻으로 한말이 아닙니다.
어차피 안되는 것이니 다른 방법을 찾아보라는 뜻으로 한 말입니다.

by 김선호 [2009.05.25 18:42:22]
음 그럼 일단은count해서 0건이면 insert , 아니면 update하는 방법으로 해야겠네요.
마농님 감사합니다!
count말고 할 수 있는 방법도 계속 찾아봐야겠네요 ㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입