안녕하세요.. 궁굼한것이 있습니다!!
이번에 10G R2 -> 11G R2로 DBMS 업글을 위해 이것저것 테스트 중에..
10G에서는 잘 돌아가는데 11G에서는 돌아가지 않는 업데이트문이 있네요.
UPDATE /*+ BYPASS_UJVC */
(SELECT
월계.기초재고미착 월계_기초재고미착
,월계.기말재고미착 월계_기말재고미착
,(월계.미착입점량+월계.미착반품량+월계.미착이동반입량) 월계_기말재고미착1
,MON.기말재고미착 MON_기말재고미착
FROM (SELECT * FROM 영업매장월계
WHERE 발생일자 = NEXT_YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) 월계
,(SELECT * FROM 영업매장월계
WHERE 발생일자 = YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) MON
WHERE 월계.품번 = MON.품번
AND 월계.사이즈 = MON.사이즈
AND 월계.색상 = MON.색상
AND 월계.매장코드 = MON.매장코드
AND 월계.매장존 = MON.매장존
)
SET
월계_기초재고미착 = MON_기말재고미착,
월계_기말재고미착 = MON_기말재고미착 + 월계_기말재고미착1;
계속 (ORA-01779 cannot modify a column which maps to a non key-preserved table)
오류를 뱉어내더군요....
음 이런식의 UPDATE 쿼리구요.. 이리저리 검색결과..
BYPASS 힌트는 11G R2부터는 사용 할 수 없는 힌트가 되버렸다는 것을 알았습니다.
해결방법을 찾던 도중.. MERGE를 이용하기로 하고....
MERGE INTO (SELECT *
FROM 영업매장월계
WHERE 발생일자 = NEXT_YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) 월계
USING (SELECT *
FROM 영업매장월계
WHERE 발생일자 = YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) MON
ON ( 월계.품번 = MON.품번
AND 월계.사이즈 = MON.사이즈
AND 월계.색상 = MON.색상
AND 월계.매장코드 = MON.매장코드
AND 월계.매장존 = MON.매장존)
WHEN MATCHED THEN
UPDATE
SET 월계.기초재고미착 = MON.기말재고미착,
월계.기말재고미착 = MON.기말재고미착 + 월계.미착입점량
+ 월계.미착반품량
+ 월계.미착이동반입량
WHEN NOT MATCHED THEN
INSERT(발생일자, 매장코드, 매장존, 품번, 색상, 사이즈,
기초재고, 기초재고미착, 기말재고, 기말재고미착, 기초재고금액, 기말재고금액)
VALUES(NEXT_YYYYMM, MON.매장코드, MON.매장존, MON.품번, MON.색상, MON.사이즈,
MON.기말재고, MON.기말재고미착, MON.기말재고, MON.기말재고미착, MON.기말재고금액, MON.기말재고금액);
이런식으로 쿼리를 변경을 하였습니다.
헌데.. 위 MERGE 쿼리중 빨간부분의 년월 변수때문에 ORA-600 오류를 뱉어내네요;;
빨간부분을 변수를 안쓰고 직접 '201104' 이런식으로 쓰면 잘 돌아가구요..
혹시 제가 실수한 부분이 있을까요??
오류는 ORA-00600 : INTERNAL ERROR CODE, ARGUMENTS:[qcsfbdnp:1],[],[],.... 입니다..
변수관련 오류인 것으로 판단하여 변수 타입 등등 다시확인해보았지만 이미 10g에서 잘 실행되던
구문이기에 문제가 없어 보입니다.
의견 부탁드리겠습니다^^