oracel批量插入数据,分批数据插入,批量插入时常遇到的报错

首先,解释:

在oracel中批量插入时是不能用VALUS(值1,值2,值3,值4,。。。。)这种方式进行批量插入的,错误例子如下:

<insert id="XiangGangInser" parameterType="list" useGeneratedKeys="false">
    insert into 
   T_ZJJK_XIANGGANG(MAIL_NUM,CLCT_DATE,WEIGHT,CLCT_CITY,DEST_CD,DEST_PROV,DEST_CITY,AMOUNT)
    VALUES
    <foreach item="map" index="index" collection="list" open="" separator="," close="">
       ( #{map.MAILNUM},#{map.CLCTDATE},#{map.WEIGHT},#{map.CLCTCITY},#{map.DESTCD},# 
    {map.DESTPROV},#{map.DESTCITY},#{map.AMOUNT})
    </foreach>
    </insert>

正确的方法为:利用oracel的嘘表进行批量插入的操作,例子如下:

<insert id="XiangGangInser" parameterType="list" useGeneratedKeys="false">
    insert into T_ZJJK_XIANGGANG(MAIL_NUM,CLCT_DATE,WEIGHT,CLCT_CITY,DEST_CD,DEST_PROV,DEST_CITY,AMOUNT)
    <foreach item="map" index="index" collection="list" separator="UNION ALL" >
    select 
        #{map.MAILNUM},#{map.CLCTDATE},#{map.WEIGHT},#{map.CLCTCITY},#{map.DESTCD},#{map.DESTPROV},#{map.DESTCITY},#{map.AMOUNT}
    from dual
    </foreach>
    </insert>

 但是需要注意的是:批量插入时不能一次插入太多条数据,会报错sql异常,所以需要分批插入,比如一次两千条的插:

//为了防止SQL语句超出长度出错,进行分批插入
     List list = new ArrayList();
        int i3 = 0;
	          if(list.size()==0) {
	        	  continue;
	          }
	          else if(list.size()<=2000){
                  // 这里进行数据库的插入操作
	            	i3=  inserdao.XiangGangInser(list);
	            }else{
                    if ((ii * 2000) == Math.min((ii + 1) * 2000, list.size() - 1)) {
                    continue;
                         }
	             int times = (int)Math.ceil(list.size()/2000.0 );
	        	 for(int ii=0; ii<times; ii++ ){
	        	   i3 = inserdao.XiangGangInser(list.subList(ii*2000, Math.min((ii+1)*2000, 
        list.size()-1)));
	        	    }
	        	    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值