Oracle 实现批量插入并且获取批量插入的主键id

Oracle 批量插入使得主键自增有很多实现方式,笔者使用的是较为简单的(序列)的方式,实现批量插入。但是有个问题,就是批量插入的同时获取每条插入数据的序列号。因为Oracle本身不像Mysql,是不支持批量返回主键id的,这也就是说,Mysql结合Mybatis的自动赋值主键的注解是无效的。当然,获取主键主要两种。 

方式一: 先拿到主键,再批量插入。

方式二: 批量插入,再拿到主键。

笔者,所使用的是方式一,因为方式二我考虑使用触发器拿取,但是经过同事大佬点拨,大致意思是触发器很影响查询效率,相当于上锁,所以在这种情况下,实际业务不建议使用。方式一,我考虑就是先获取序列,放入到插入的集合中,再批量插入。但是这样有一个问题,就是需要频繁的与数据库交互,所以,如果大家有什么好的建议,可以提出来。

获取序列:

   /** 获取序列
     * @return
     */
    Long getTaskSeq();
  <select id="getTaskSeq" resultType="java.lang.Long">
         SELECT TASK_ID_SEQ.NEXTVAL FROM dual
  </select>

插入集合:

saveList.forEach(saveTaskDto -> {
                Long taskSeq = userTaskDao.getTaskSeq();
                saveTaskDto.setTaskId(taskSeq);
            });

批量插入:

  <insert id="insertBatchs" useGeneratedKeys="false" keyProperty="taskId">
        BEGIN
        <foreach collection="saveList" item="obj" separator="">
            insert into
            enterprise_user_task(task_id,enterprise_user_id,task_type,task_date,task_date_type,sys_create_date,sys_create_user)
            values
            (#{obj.taskId},#{obj.resourceUserId}, #{obj.taskType}, to_date(#{obj.taskDate}, 'yyyy-MM-dd'),#{obj.taskDateType}, #{obj.createDate},
            #{obj.createUser});
        </foreach>
        COMMIT;
        END;
    </insert>

这样就可以在插入的同时,获取到批量插入的数据的序列。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值