merge문 오류인지 trigger 오류인지 모르겠습니다. 0 3 73

by 잘하자DBA [SQL Query] [2018.10.11 17:34:47]


GPPP057_ddl.txt (3,451Bytes)
GPPP001_ddl.txt (4,325Bytes)

MERGE INTO문을 사용하여 TRIGGER가 구동이 되는데 오류가 발생하여 문의드립니다.

MERGE INTO gppp001 tb_im
     USING (SELECT '1000' AS comp_cd, '6E75455' AS sty_cd FROM DUAL) tb_sys
        ON (tb_im.comp_cd = tb_sys.comp_cd AND tb_im.sty_cd = tb_sys.sty_cd)
WHEN NOT MATCHED
THEN
   INSERT     (comp_cd,
               org_comp_cd,
               sty_cd,
               plan_seq,
               in_user,
               in_time,
               upd_user,
               upd_time)
       VALUES ('1000',
               '1000',
               '6E75455',
               '001',
               'Z000034',
               SYSDATE,
               'Z000034',
               SYSDATE)

 

해당 MERGE문을 실행하면 GPPP001에 DATA가 없는데도 INSERT가 되지 않습니다.

참고로 11.2.0.2에서 11.2.0.4로 업그레이드 되고 나서 문제가 발생되었습니다.

11.2.0.2에서는 문제없이 되었습니다.

GPPP001에는 총 3개의 TRIGGER가 걸려있습니다.

그중 TR_GPPP001_CUST에서 for each row 옵션 유무에 따라

없으면 ORA-06502:PL/SQL: 수치 또는 값 오류 : NULL index table key value ORA-06512:"TEST.TR_GPPP001_CUST", 16행 ORA-04088: 트리거 :"TEST.TR_GPPP001_CUST"의 수행시 오류

있으면 위와 같이 TABLE에 DATA가 없어서 INSERT가 되어야 하는데 INSERT가 되지 않고 있습니다.

 

무엇이 잘못된 것인지 정말 궁금합니다.

by 마농 [2018.10.11 19:19:50]

글쎄요? for each row 가 있고 없고 차이는 엄청난 차이인데요?
이걸 넣었다가 뺐다 하면서 테스트 할 건 아니라고 생각됩니다.
일단 원상태(아마도 for each row 가 있는게 원상태 이겠죠?)로 돋려 놓으시고
에러메시지 보면서 대응 방법 생각하셔야 됩니다.
에러메시지 안나는데 입력만 안된다면?
혹시 에러 났는데 exception 절 때문에 그냥 넘어간걸 수도 있습니다.


by 잘하자DBA [2018.10.15 09:57:12]

네 답변 감사합니다. 원래 FOR EACH ROW가 없었던 트리거 입니다.


그래서 이관후 트리거 동작시 ORA-06502 에러가 떠서 그 문제를 해결하다보니 뒤늦게 FOR EACH ROW를 넣었습니다.


오라클 SR 진행 결과 DB 문제는 아니라고 하고 개발 이슈라고 하는데 어디가 문제인지 잘 몰라서 의견을 들어보고 싶었습니다.

 


by 마농 [2018.10.15 10:46:43]

문제 없이 잘 돌아가던 트리거라면?
for each row 를 임의로 붙이는 것은 잘못된 대응인듯 하구요.
해당 오류 메시지에 주목하세요. (ora-06502 : 수치 또는 값 오류)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입