解决方案 »

  1.   

    问题解决了。insert 和update中所有的数据都需要从using中获取,这样就能达到批量merge into的效果了
    MERGE INTO TM_USER_CART_INFO T1
    USING 
    (
    <foreach collection="list" item="item" index="index" separator="union" >
       SELECT 
          CASE WHEN TEMP1.F_CART_ID IS NULL THEN TEMP.F_CART_ID ELSE TEMP1.F_CART_ID END F_CART_ID,
          TEMP.F_GOODS_NUM,
          TEMP.F_USER_ID,
          TEMP.F_REGION_NUM,
          TEMP.F_CHANNEL_NUM,
          TEMP.F_GOODS_COUNT
          FROM
         (SELECT #{cartId} F_CART_ID,#{goodsNum} F_GOODS_NUM,#{userId} F_USER_ID,#{regionNum} F_REGION_NUM,#{channelNum} F_CHANNEL_NUM,#{goodsCount} F_GOODS_COUNT  FROM DUAL) TEMP 
         LEFT JOIN
         (  
            SELECT * FROM  TM_USER_CART_INFO T2 
                WHERE 1=1 AND T2.F_USER_ID = #{userId}
                AND T2.F_GOODS_NUM = #{goodsNum}
                AND T2.F_REGION_NUM = #{regionNum}
                AND T2.F_CHANNEL_NUM = #{channelNum}
                and NOT EXISTS (SELECT '' FROM TM_USER_CART_MARKET T3 WHERE T3.F_CART_ID = T2.F_CART_ID)
              )TEMP1 ON TEMP1.F_GOODS_NUM = TEMP.F_GOODS_NUM
        </foreach>
        ) T
        ON (T1.F_CART_ID = T.F_CART_ID)
        WHEN MATCHED THEN
          UPDATE SET T1.F_GOODS_COUNT = T1.F_GOODS_COUNT + T.F_GOODS_COUNT, T1.F_UPDATE_TIME = (SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL)
        WHEN NOT MATCHED THEN
          INSERT
            (F_CART_ID, F_CHANNEL_NUM, F_MERCHANT_NUM, F_USER_ID, F_GOODS_NUM, F_GOODS_COUNT, F_ADD_TIME, F_REGION_NUM)
          VALUES
            (T.F_CART_ID, T.F_CHANNEL_NUM, '', T.F_USER_ID, T.F_GOODS_NUM, T.F_GOODS_COUNT, 
        (SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL), T.F_REGION_NUM)
      

  2.   

    问题解决了。insert 和update中所有的数据都需要从using中获取,这样就能达到批量merge into的效果了
    MERGE INTO TM_USER_CART_INFO T1
    USING 
    (
    <foreach collection="list" item="item" index="index" separator="union" >
       SELECT 
          CASE WHEN TEMP1.F_CART_ID IS NULL THEN TEMP.F_CART_ID ELSE TEMP1.F_CART_ID END F_CART_ID,
          TEMP.F_GOODS_NUM,
          TEMP.F_USER_ID,
          TEMP.F_REGION_NUM,
          TEMP.F_CHANNEL_NUM,
          TEMP.F_GOODS_COUNT
          FROM
         (SELECT #{cartId} F_CART_ID,#{goodsNum} F_GOODS_NUM,#{userId} F_USER_ID,#{regionNum} F_REGION_NUM,#{channelNum} F_CHANNEL_NUM,#{goodsCount} F_GOODS_COUNT  FROM DUAL) TEMP 
         LEFT JOIN
         (  
            SELECT * FROM  TM_USER_CART_INFO T2 
                WHERE 1=1 AND T2.F_USER_ID = #{userId}
                AND T2.F_GOODS_NUM = #{goodsNum}
                AND T2.F_REGION_NUM = #{regionNum}
                AND T2.F_CHANNEL_NUM = #{channelNum}
                and NOT EXISTS (SELECT '' FROM TM_USER_CART_MARKET T3 WHERE T3.F_CART_ID = T2.F_CART_ID)
              )TEMP1 ON TEMP1.F_GOODS_NUM = TEMP.F_GOODS_NUM
        </foreach>
        ) T
        ON (T1.F_CART_ID = T.F_CART_ID)
        WHEN MATCHED THEN
          UPDATE SET T1.F_GOODS_COUNT = T1.F_GOODS_COUNT + T.F_GOODS_COUNT, T1.F_UPDATE_TIME = (SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL)
        WHEN NOT MATCHED THEN
          INSERT
            (F_CART_ID, F_CHANNEL_NUM, F_MERCHANT_NUM, F_USER_ID, F_GOODS_NUM, F_GOODS_COUNT, F_ADD_TIME, F_REGION_NUM)
          VALUES
            (T.F_CART_ID, T.F_CHANNEL_NUM, '', T.F_USER_ID, T.F_GOODS_NUM, T.F_GOODS_COUNT, 
        (SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL), T.F_REGION_NUM)
      

  3.   

    上面写错了,#{xxxx} 改成 #{item.xxxx}