에러메시지
ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음: "IVAL"."COIL_NO" |
오 이건 또 무엇인가?
원인
원인은 간단하다. 에러메시지에 답이 있다!
ON절에 있는 참조되는 열은 갱신을 하지 말라고 오류를 뱉어 낸 것 이다.
나의 소스에서는 ON절에 COIL_NO, COIL_T, TEST_SEQNO가 들어 있다.
그리고 갱신 이라는 말은 UPDATE를 가르킨다. INSERT를 갱신이라고 하진 않으니까
보면 UPDATE문에 COIL_NO, COIL_T, TEST_SEQNO가 업데이트가 되는 것을 확인 할 수 있다.
아래 쿼리에서 굵게(Bold)된 글씨를 보자.
MERGE INTO TB_XXXXXXXXXXXXX IVAL USING (SELECT :P01_COIL_NO AS COIL_NO ,:P02_COIL_T AS COIL_T ,:P03_TEST_SEQNO AS TEST_SEQNO ,:P04_TENSILE_STRENGTH AS TENSILE_STRENGTH ,:P05_TENSILE_STRENGTH2 AS TENSILE_STRENGTH2 ,:P06_YIELDPOINT AS YIELDPOINT ,:P07_YIELDPOINT2 AS YIELDPOINT2 FROM DUAL) GVAL ON (IVAL.COIL_NO = GVAL.COIL_NO AND IVAL.COIL_T = GVAL.COIL_T AND IVAL.TEST_SEQNO = GVAL.TEST_SEQNO) WHEN MATCHED THEN UPDATE SET IVAL.COIL_NO = GVAL.COIL_NO ,IVAL.COIL_T = GVAL.COIL_T ,IVAL.TEST_SEQNO = GVAL.TEST_SEQNO ,IVAL.TENSILE_STRENGTH = GVAL.TENSILE_STRENGTH ,IVAL.TENSILE_STRENGTH2 = GVAL.TENSILE_STRENGTH2 ,IVAL.YIELDPOINT = GVAL.YIELDPOINT ,IVAL.YIELDPOINT2 = GVAL.YIELDPOINT2 |
위의 쿼리는 잘못 된 것이다. ON절에서 참조되는 컬럼은 수정을 하지 말라는 것이다.
해결방법
MERGE INTO TB_XXXXXXXXXXXXX IVAL USING (SELECT :P01_COIL_NO AS COIL_NO ,:P02_COIL_T AS COIL_T ,:P03_TEST_SEQNO AS TEST_SEQNO ,:P04_TENSILE_STRENGTH AS TENSILE_STRENGTH ,:P05_TENSILE_STRENGTH2 AS TENSILE_STRENGTH2 ,:P06_YIELDPOINT AS YIELDPOINT ,:P07_YIELDPOINT2 AS YIELDPOINT2 FROM DUAL) GVAL ON (IVAL.COIL_NO = GVAL.COIL_NO AND IVAL.COIL_T = GVAL.COIL_T AND IVAL.TEST_SEQNO = GVAL.TEST_SEQNO) WHEN MATCHED THEN UPDATE SET IVAL.TENSILE_STRENGTH = GVAL.TENSILE_STRENGTH ,IVAL.TENSILE_STRENGTH2 = GVAL.TENSILE_STRENGTH2 ,IVAL.YIELDPOINT = GVAL.YIELDPOINT ,IVAL.YIELDPOINT2 = GVAL.YIELDPOINT2 |
쿼리에서 ON절에 참조되어있는 3개의 컬럼을 UPDATE 구문에서 빼주면 된다.
UPDATE문을 MERGE INTO로 변경하다 보니 이런 문제를 찾을 수 있었다.
나처럼 이런일을 겪는 사람이 있을까? 혹시나해서 포스팅 했다!
덕분에 하나 배웠네.
'Good tips' 카테고리의 다른 글
[ORACLE] ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다. 원인은 무엇일까? (0) | 2018.04.20 |
---|---|
[Excel] Unknown error 0x800A03EC 에러의 원인은 무엇일까? (0) | 2018.04.19 |
예비군 동원훈련연기 하는 방법(주요업무) - 주요업무수행확인서 양식포함 (0) | 2018.04.16 |
[ORACLE] PLS-00410: RECORD,TABLE 또는 인수 목록에 중복 필드가 허용되지 않습니다. (0) | 2018.04.12 |
쉽게 따라하는 프린터 대기항목 삭제중 오류 없애는 방법 (0) | 2018.04.05 |