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가 되지 않고 있습니다.
무엇이 잘못된 것인지 정말 궁금합니다.
항상 답변 감사드립니다.
네 for each row는 이관전부터 없었기 때문에 다시 원상복귀한 채로 test를 진행하고 있습니다.
근데
11.2.0.2 DB에서 TEST해 보면
merge문 실행시 WHEN NOT MATCHED 조건이 아닐 경우 TR_GPPP001_CUST TRIGGER에서
BEGIN
IF INSERTING THEN 부분을 타지 않고 빠져 나오는데
11.2.0.4 DB에서 TEST해 보면
merge문 실행시 WHEN NOT MATCHED 조건이 아닐 경우 TR_GPPP001_CUST TRIGGER에서
IF INSERTING THEN 조건을 타고 그 밑에 IF 절을 또 타서 에러가 납니다.
너무 희한한 증상이라 SR을 올려봐도 개발이슈니 그쪽에서 확인하라는 답변이 와서 답답하네요
일단 저는 MERGE구문에서 INSERT 조건이 아닌데도 불구하고 TR_GPPP001_CUST 트리거를 타는 이유를 먼저 모르겠습니다.
그리고 MERGE문에서 WHEN NOT MATCHED 조건인 경우 AS-IS DB인 경우
1. TR_GPPP001_BF_INSERT_COLL_GB -> BEFORE INSERT 트리거
2. TR_GPPP001_AF_INSERT_COLL_GB -> AFTER INSERT 트리거
3. TR_GPPP001_CUST -> AFTER INSERT 트리거
순으로 동작을 하는데
이관된 DB에서는
1 -> 3번 (NO_DATA_FOUND) 에러 떨어집니다. 2번 트리거를 타지 않는 이유도 너무 궁금합니다.
한 테이블에서 다중으로 트리거가 동작하는 경우 무슨 순서를 지정하는게 있는건지 그것도 궁금합니다.