에러메시지




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로 변경하다 보니 이런 문제를 찾을 수 있었다.


나처럼 이런일을 겪는 사람이 있을까? 혹시나해서 포스팅 했다!


덕분에 하나 배웠네.

+ Recent posts