merge문에서 mybatis selectKey 질문있습니다~! 0 6 2,713

by 천만달러 [Tibero] [2021.10.05 16:49:35]


<update id="savePediaPrepareTBL" parameterType="hashmap">
        <selectKey keyProperty="hmgpediaId" resultType="string" order="BEFORE">
            SELECT PEDIA_PREPARE_ID as hmgpediaId
                , ROWNUM AS RNUM
            FROM (
                SELECT A.PEDIA_PREPARE_ID
                FROM HMG.TB_PEDIA_PREPARE A
                ORDER BY CREATE_DATE DESC
            )
            WHERE rownum = 1;
        </selectKey>
        MERGE INTO HMG.TB_HMGPEDIA_TBL A
        USING DUAL ON (A.HMGPEDIA_ID = #{hmgpediaId} AND A.LANG_CD = #{langCd})
        WHEN MATCHED THEN
            UPDATE SET
                SORT_NO = #{sortNo}
                , USE_YN = #{useYn}
                , DEL_YN = #{delYn}
                , TBL_TITLE = #{tblTitle}
                , TBL_CONTENTS = #{tblContents}
                , UPDATE_USER = #{__param.userId}
                , UPDATE_DATE = CURRENT_TIMESTAMP
        WHEN NOT MATCHED THEN
        INSERT (
            HMGPEDIA_ID
            , LANG_CD
            , SORT_NO
            , USE_YN
            , DEL_YN
            , TBL_TITLE
            , TBL_CONTENTS
            , CREATE_USER
            , CREATE_DATE
            , UPDATE_USER
            , UPDATE_DATE
        ) VALUES (
            #{hmgpediaId}
            , #{langCd}
            , #{sortNo}
            , #{useYn}
            , #{delYn}
            , #{tblTitle}
            , #{tblContents}
            , #{__param.userId}
            , CURRENT_TIMESTAMP
            , #{__param.userId}
            , CURRENT_TIMESTAMP
        )
    </update>

 

위 쿼리에서 어떤게 잘못됐는지 도저히 알수가 없어서

여기에 질문올립니다 ㅠㅠ

위 쿼리에서 selectKey부분에서 잘못된부분이 있을까요?

고수님들 도움부탁드립니다 ㅠ

by 마농 [2021.10.05 17:14:26]

조회 항목이 두개라서 그런게 아닐까요?
" , ROWNUM AS RNUM " 부분을 제거하면 어떨런지?


by 천만달러 [2021.10.05 17:27:38]

그렇게 했는데도 안되네요 ㅠㅠ


by 마농 [2021.10.05 17:28:58]

별도 selectKey 를 이용하지 말고 직접 머지하는건 어떤가요?
 

MERGE INTO hmg.tb_hmgpedia_tbl a
USING 
(
SELECT pedia_prepare_id  AS hmgpedia_id
     , #{langCd}         AS lang_cd
     , #{sortNo}         AS sort_no
     , #{useYn}          AS use_yn      
     , #{delYn}          AS del_yn      
     , #{tblTitle}       AS tbl_title   
     , #{tblContents}    AS tbl_contents
     , #{__param.userId} AS user_id
  FROM (SELECT pedia_prepare_id
          FROM hmg.tb_pedia_prepare
         ORDER BY create_date DESC
        )
 WHERE ROWNUM = 1
) b
ON (a.hmgpedia_id = b.hmgpedia_id AND a.lang_cd = b.lang_cd)
WHEN MATCHED THEN
UPDATE
   SET sort_no      = b.sort_no
     , use_yn       = b.use_yn      
     , del_yn       = b.del_yn      
     , tbl_title    = b.tbl_title   
     , tbl_contents = b.tbl_contents
     , update_user  = b.user_id
     , update_date  = CURRENT_TIMESTAMP
WHEN NOT MATCHED THEN
INSERT ( hmgpedia_id
       , lang_cd
       , sort_no     
       , use_yn      
       , del_yn      
       , tbl_title   
       , tbl_contents
       , update_user 
       , update_date 
       , create_user 
       , create_date 
       )
VALUES ( b.hmgpedia_id
       , b.lang_cd
       , b.sort_no     
       , b.use_yn      
       , b.del_yn      
       , b.tbl_title   
       , b.tbl_contents
       , b.user_id 
       , CURRENT_TIMESTAMP
       , b.user_id 
       , CURRENT_TIMESTAMP
       )
;

 


by 천만달러 [2021.10.05 18:16:18]

테이블을 2개 사용해서 등록을 해야해서 A테이블에 id값을 B테이블에 가져가야 A테이블 ID값에 B테이블 1,2,3,4 이렇게 등록되게 하려고 하는 작업이라...흠...쿼리에는 문제가 없어 보여서 스크립트를 보고 있습니다 ㅎ;;


by 마농 [2021.10.06 08:56:38]

머지문 자체가 a 를 이용해 b 에 (입력 및 수정) 시키는 구문입니다.
원본의 머지문은 select 를 별도로 먼저 수행해 변수에 담아 처리하는 것이고
제가 제시한 머지문은 select 자체를 Using 절에 넣은 것입니다.
제가 제시한 머지문도 원본의 머지문과 동일한 기능을 수행합니다.


by 마농 [2021.10.06 15:15:11]

세미콜론(;) 때문은 아닐런지?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입