oracle 批量插入几千条数据只需100ms以内

最终的sql


insert into DR_ADJUST_HISTORY ( AGGREGATOR_NAME, CUSTOMER_LEVEL, ADUJST_TYPE, INVITE_STATE, ADJUST_ID, USER_PROFILE_ID, MAX_ADJUST_P, ADJUST_E, RESPONSE_NUMBER, TOTAL_SUBSIDY, REWARD_POINT ) 
select k.* from (
 select  
		NULL as AGGREGATOR_NAME, 
		NULL as CUSTOMER_LEVEL, 
		NULL as ADUJST_TYPE, 
		NULL as INVITE_STATE, 
		NULL as ADJUST_ID, 
		NULL as USER_PROFILE_ID, 
		NULL as MAX_ADJUST_P, 
		NULL as ADJUST_E, 
		NULL as RESPONSE_NUMBER, 
		NULL as TOTAL_SUBSIDY, 
		NULL as REWARD_POINT
	from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '66d1c7c1-73ca-4f04-a3d3-290e2e3204e4', 4.6261826, 7.6549335, 0, 0.0, 0 from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', 'ef753dcf-762f-4a2b-8cbc-38e28d0ca5d6', 4.485621, 7.2969246, 0, 0.0, 0  from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '7a7ce2a8-d1fa-47e7-b169-d2432d3d7a88', 4.4442787, 8.377349, 0, 0.0, 0  from dual union
 
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '5a557a27-9d18-46b3-b8ab-a5e246b41b51', 0.0, 0.0, 0, 0.0, 0  from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '069a8d65-3305-4df5-9bb6-0565d5e1c100', 0.0, 0.0, 0, 0.0, 0 from dual 

) k where k.AGGREGATOR_NAME is not NULL;

使用java代码拼接

private String getBatchSql(List<DrAdjustHistory> histories) {
        StringBuilder builder = new StringBuilder();
        builder.append(" select k.* from ( " +
                " select " +
                " NULL as AGGREGATOR_NAME,  " +
                " NULL as CUSTOMER_LEVEL, " +
                " NULL as ADUJST_TYPE,  " +
                " NULL as INVITE_STATE,  " +
                " NULL as ADJUST_ID,  " +
                " NULL as USER_PROFILE_ID,  " +
                " NULL as MAX_ADJUST_P, " +
                " NULL as ADJUST_E, " +
                " NULL as RESPONSE_NUMBER, " +
                " NULL as TOTAL_SUBSIDY, " +
                " NULL as REWARD_POINT " +
                " from dual union " );
        histories.stream().forEach( item ->{
            builder.append(" SELECT ");
            builder.append(" '" + item.getAGGREGATOR_NAME()+"' " ).append(" , ");
            builder.append(" '" + item.getCUSTOMER_LEVEL()+"' " ).append(" , ");
            builder.append(" '" + item.getADUJST_TYPE()+"' " ).append(" , ");
            builder.append(" '" + item.getINVITE_STATE()+"' " ).append(" , ");
            builder.append(" '" + item.getADJUST_ID()+"' " ).append(" , ");
            builder.append(" '" + item.getUSER_PROFILE_ID()+"' " ).append(" , ");
            builder.append(" '" + item.getMAX_ADJUST_P()+"' " ).append(" , ");
            builder.append(" '" + item.getADJUST_E()+"' " ).append(" , ");
            builder.append(" '" + item.getRESPONSE_NUMBER()+"' " ).append(" , ");
            builder.append(" '" + item.getTOTAL_SUBSIDY()+"' " ).append(" , ");
            builder.append(" '" + item.getREWARD_POINT()+"' " ).append(" from dual union ");

        });
        // 去除最后一个 union
        String sql = builder.toString();
        sql = sql.substring(0,sql.lastIndexOf("union"));
        sql += " ) k where k.AGGREGATOR_NAME is not NULL ";
        return sql;
    }

最终的mapper

  <insert id="batchInsertDataBySql" parameterType="java.lang.String">

        insert into DR_ADJUST_HISTORY
        ( AGGREGATOR_NAME, CUSTOMER_LEVEL, ADUJST_TYPE, INVITE_STATE, ADJUST_ID, USER_PROFILE_ID, MAX_ADJUST_P, ADJUST_E, RESPONSE_NUMBER, TOTAL_SUBSIDY, REWARD_POINT )
        ${batchSql}
    </insert>

基于代码形式的案例

 

插入两千条数据只需 200ms

<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="false">
        INSERT INTO
        T_MONITOR_ELEC_POPULATION
        <trim prefix="(" suffix=")" suffixOverrides=",">
            COURT_ID,
            RECORD_DATE,
            SEGMENTID,
            EEGRPID,
            POPULATION,
            INSERT_TIME
        </trim>
        SELECT a.* FROM(
        <foreach collection="list" item="item" separator="union all">
            select
                #{item.courtId},
                #{item.recordDate},
                #{item.segmentid},
                #{item.eegrpid},
                #{item.population},
                #{item.insertTime}
            from
            dual
        </foreach>
        )a
    </insert>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁漂打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值