You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MyBatis XML实现Oracle批量Upsert(插入或更新)的问题

Oracle 批量Upsert(MERGE)实现方案

针对你需要用单条MERGE语句批量处理Employee列表的需求,可通过构造批量数据源的方式实现,具体MyBatis XML配置如下:

完整批量MERGE语句

<update id="batchUpsertEmployee">
  MERGE INTO EMPLOYEE emp
  USING (
    <foreach collection="employeeList" item="employee" separator="UNION ALL">
      SELECT 
        #{employee.employeeId, jdbcType=VARCHAR} AS EMPLOYEE_ID,
        #{employee.employeeName, jdbcType=VARCHAR} AS EMPLOYEE_NAME
      FROM dual
    </foreach>
  ) inholder
  ON (inholder.EMPLOYEE_ID = emp.EMPLOYEE_ID)
  WHEN MATCHED THEN
    UPDATE SET emp.EMPLOYEE_NAME = inholder.EMPLOYEE_NAME
  WHEN NOT MATCHED THEN
    INSERT (EMPLOYEE_ID, EMPLOYEE_NAME)
    VALUES (inholder.EMPLOYEE_ID, inholder.EMPLOYEE_NAME)
</update>

关键说明

  • 修正语法错误:原语句中INSERT ... VALUE应为INSERT ... VALUES,这是Oracle的语法要求。
  • 批量数据源构造:通过<foreach>循环遍历employeeList,每个元素生成一条SELECT ... FROM dual,用UNION ALL拼接成批量数据源,让USING子句包含所有待处理的员工数据。
  • 参数复用:UPDATE和INSERT时直接引用inholder中的字段,避免重复编写#{}参数,既简洁又减少参数绑定错误。
  • 性能与限制:Oracle对UNION ALL的子查询数量有上限(默认通常支持数千条),建议批量大小控制在1000条以内,避免触发语法限制。
  • 索引要求:确保EMPLOYEE.EMPLOYEE_ID是主键或唯一索引,否则MERGE可能出现重复匹配的异常。

内容的提问来源于stack exchange,提问作者Crimshot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:13