有表TB_1,字段名为:FID,FNum,Flag,
 我想对表中的数据进行游标循环,分别取出几组满足字段FNum之和 > 24.5 AND <= 25.5 的数据。
 如果后面一组不在这个范围的话也显示一组出来,并且停止循环。
 
 OPEN V_CUR FOR 'SELECT FID,NVL(FNum,0) FROM TB_1 WHERE NVL(FALG,0) = 0 ' ; 
  FETCH V_CUR INTO V_ID,V_NUM
  WHILE V_CUR%FOUND LOOP
    TEMPNUM:= TEMPNUM + V_NUM;
    IF TEMPNUM <= 25.5 THEN
      UPDATE TB_1 A SET A.FLAG = V_FLAG WHERE FID = V_ID; 
    ELSE
      TEMPNUM:= TEMPNUM - V_NUM;
    END IF; 
    IF TEMPNUM > 24.5 AND TEMPNUM <= 25.5 THEN 
      --满足这个条件就是一组,并把标示V_FLAG加1
      V_FLAG:= V_FLAG + 1;
      TEMPNUM:=0;
      --在这个应该怎么写,让其游标再次从第一条开始循环呢。当然应该排除字段FALG不等于0的数据了。
    END IF; 
    FETCH V_CUR INTO V_ID,V_NUM
  END LOOP;     
  
  这是我的思路,如果有其他更好办法,请赐教。

解决方案 »

  1.   

    可以尝试用goto 语法
    go to label;
      

  2.   

    TEMPNUM:=0已重新初始化,可以继续循环取下组,
    不用重新打开游标
      

  3.   

    是继续循环,但是应该算选掉FLAG标示不为零的数据,从头开始循环啊,不是继续循环下去。
      

  4.   

    我用goto实现多次循环,一样的不能达到满意的结果,有可能前面组合了两组在满足的范围类,后面的就全部不能组合了,因为加起来都不满足<=24.5 >= 25.5 的范围,所以这种用循环的模式基本上是算不出来最理想的组合了。我最开始用递归算法,速度太慢了,因为数据一多起来,就有N多种组合,20条以上的数据,算半天都算不出来。现在确实不知道该怎么实现了,客户太刁钻了啊。
      

  5.   

    csdn的高手们,给我出出主意吧。
      

  6.   

    我觉得你这个需要多次回退查询可以使用  for  i=1  to 100 或者 表的条数
               《标志>>
               OPEN V_CUR FOR 'SELECT FID,NVL(FNum,0) FROM TB_1 WHERE NVL(FALG,0) = 0 ' ; 
                ............
                ................
               IF TEMPNUM > 24.5 AND TEMPNUM <= 25.5 THEN  
      --满足这个条件就是一组,并把标示V_FLAG加1
      V_FLAG:= V_FLAG + 1;
      TEMPNUM:=0;
        go to <<标志>>    必须重新打开游标,因为你更新了flag,所以必须重新选择的
      END IF; 大体思路就这个,或许不需要for,但肯定想办法 必须重新查表的