这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如 
set transaction use rollback segment roll_20; //roll_20为回滚段名

解决方案 »

  1.   

    新建一个回滚段使用的表空间,再建一个PUBLIC的回滚段,是它 ONLINE
      

  2.   

    不明白是不是回滚段的问题,只是有一点可以肯定的:你的代码中不需要用到任何游标,比如其中的一段:
      ...
      loop
        fetch cur_jdm into l_jdm;
        exit when cur_jdm%notfound;
        --规格,花色,品牌
        begin
          select a.gbspec,a.gbsphs,a.gbppcode
          into l_jdm.gstspec,l_jdm.gsths,l_jdm.gstpp
          from goodsbase a
          where a.gbid = l_jdm.gstgdid;
          EXCEPTION WHEN OTHERS THEN
            l_jdm.gstspec := '';
            l_jdm.gsths := '';
            l_jdm.gstpp := '';
       end;
     ...用一句sql就解决了:
    update jxdcmonth x
      set (gstspec,gsths,gstpp) = 
          (select gbspec, gbsphs, gbppcode
             from goodsbase
            where a.gbid = x.gstgdid)
     where jdmmonth = v_month;其他的也类似。另外sum(a.gsthsjj)/count(a.gsthsjj)这样的写法也觉得怪,用avg(a.gsthsjj)不行吗?
      

  3.   

    谢谢,最后我想问一下用游标和直接update性能上会有多大差异?