MERGE에서 INSERT문 사용질문입니다. 1 2 2,853

by 살찐강시 [2009.03.02 16:07:38]


좀전 질문내용이 약간 잘못되어 있어 좀더 자세하게 올려보겠습니다. 글로 물어보려니 참 힘드네요 ㅜㅜ

내용을 요약하면 MASTER, DETAIL 두개의 테이블이 있고 MASTER에는 DETAIL에 있는 합계데이타가 들어갑니다. 즉, DETAIL에 ID, STR_CD, SLIP_NO가 같은 데이타의 합계가 MASTER에 들어가 있습니다.
MASTER와 DETAIL은 ID, STR_CD, SLIP_NO로 조인이 되구요
보통 INSERT문 사용시에는

INSERT INTO TABLE_MASTER (ID, STR_CD, SLIP_NO, TOT_QTY, TOT_AMT, REG_DATE)
SELECT ID, STR_CD, SLIP_NO, SUM(TOT_QTY), SUM(TOT_AMT), SYSDATE AS REG_DATE
  FROM TABLE_DETAIL
 WHERE SLIP_NO = :SLIP_NO
   AND STR_CD = :STR_CD
   AND ID = :ID
   GROUP BY ID, STR_CD, SLIP_NO, REG_DATE

이런식으로 처리하는데 이걸 프로시저의 MERGE문 내에서 사용하려고 합니다.


vID, vSLIP_NO, vSTR_CD는 프로시저 인수로 받은변수고요

BEGIN
 MERGE INTO TABLE_MASTER M
      USING (SELECT ID, STR_CD, SLIP_NO
                     FROM TABLE_MASTER 
                   WHERE SLIP_NO = vSLIP_NO AND STR_CD = vSTR_CD AND ID = vID) S
 ON ( M.ID           = S.ID AND
         M.STR_CD  = S.STR_CD AND
         M.SLIP_NO = S.SLIP_NO )
 WHEN MATCHED THEN
      UPDATE SET

            TOT_QTY = (SELECT SUM(TOT_QTY) 
                                  FROM TABLE_DETAIL 
                               WHERE SLIP_NO = vSLIP_NO AND STR_CD = vSTR_CD AND ID = vID), 
            TOT_AMT = (SELECT SUM(TOT_AMT)
                                  FROM TABLE_DETAIL
                               WHERE SLIP_NO = vSLIP_NO AND STR_CD = vSTR_CD AND ID = vID),
            MOD_DATE = SYSDATE
        
 WHEN NOT MATCHED THEN

     INSERT (ID, STR_CD, SLIP_NO, TOT_QTY, TOT_AMT, REG_DATE)

 ->    (SELECT ID, STR_CD, SLIP_NO, SUM(TOT_QTY), SUM(TOT_AMT), SYSDATE AS REG_DATE
 ->       FROM TABLE_DETAIL
 ->      WHERE SLIP_NO = vSLIP_NO
 ->        AND STR_CD = vSTR_CD
 ->        AND ID = vID
 ->      GROUP BY ID, STR_CD, SLIP_NO, REG_DATE);
END;

에러가 나는 부분은 NOT MATCHED THEN문장에서 VALUES가 없다고 에러가 나구요
VALUES를 넣으면 ORA-00936 누락된 표현식 에러가 발생합니다.

-> 부분을 어떻게 해야 될까요

by 마농 [2009.03.02 16:13:40]
Using절에 마스터가 아닌 디테일이 와야 합니다.
Update또는 Insert절에서는 Select를 다시 할 필요 없이 Using절에서 Select한 항목들을 기술해주시기만 하면 됩니다.

by TeLl2 [2009.03.02 16:33:18]
마농님 말씀대로
using 절에
SELECT ID, STR_CD, SLIP_NO, SUM(TOT_QTY) a, SUM(TOT_AMT) b, SYSDATE AS REG_DATE
FROM TABLE_DETAIL
WHERE SLIP_NO = vSLIP_NO
AND STR_CD = vSTR_CD
AND ID = vID
GROUP BY ID, STR_CD, SLIP_NO, REG_DATE
을 넣으시고
update나 insert 시에는 S.a, S.b 이값으로 넣으세요..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입