에러메시지


  오라클 에러 "ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다. 



처음에는 오 이게 무슨말이지? 했지만,


찾고 나서는 바로 알아 차렸다! 한번 살펴보자.






원인



처음보는 에러라 당황스러워서 구글링 해보니 MERGE 문이 문제였다.


즉, MERGE 문에서 조인할 때 2건 이상이 있을 경우에 이런 에러가 발생한다.


생각해보니 USING 구문이 서브쿼리랑 비슷한다고 생각했다.


수정해야할 테이블의 데이터도 1건이여야 하고, 


USING 문에서는 1건의 데이터만 나와야 한다. ( 그래서 보통 KEY값으로 ON에서 조회 )




MERGE INTO XXXXXXXXXX IVAL -- 작업스케줄기준

     USING (SELECT :P01_COIL_NO            AS  COIL_NO          

                         ,:P02_COIL_T               AS  COIL_T             

                         ,:P03_TEST_SEQNO       AS  TEST_SEQNO 

                         ,:P04_SURFACE            AS  SURFACE    

      FROM DUAL) GVAL

        ON (IVAL.COIL_NO = GVAL.COIL_NO AND IVAL.COIL_T = GVAL.COIL_T 

  AND IVAL.TEST_SEQNO = GVAL.TEST_SEQNO )



이렇게 되면서 오류가 발생하였다. 데이터가 두개이다보니 MERGE문이 무엇을 수정해야 할 지 모르는 것.


 COIL_NO

COIL_T

TEST_SEQNO

SURFACE

A123456

20

1

DATA1 

A123456

30

2

DATA2 


< DUAL 조회 데이터 내역 >


해결방법 



USING 에서 조회된 데이터를 1건이 검색되도록 변경해주면된다. 


ON절에서 SURFACE 조건을 추가하여 해결하였다.


중점은 "KEY가 되는 것을 잘 선택하여 조회를 하자." 이다.




MERGE INTO XXXXXXXXXX IVAL -- 작업스케줄기준

     USING (SELECT :P01_COIL_NO            AS  COIL_NO          

                         ,:P02_COIL_T               AS  COIL_T             

                         ,:P03_TEST_SEQNO       AS  TEST_SEQNO 

                         ,:P04_SURFACE            AS  SURFACE    

      FROM DUAL) GVAL

        ON (IVAL.COIL_NO = GVAL.COIL_NO AND IVAL.COIL_T = GVAL.COIL_T 

  AND IVAL.TEST_SEQNO = GVAL.TEST_SEQNO AND IVAL.SURFACE = GVAL.SURFACE)




아래 표처럼 하나의 데이터가 나와야 됩니다.


 COIL_NO

COIL_T 

TEST_SEQNO 

SURFACE

A123456

20 

1

DATA1 


+ Recent posts