我用上述语句,用循环判断aa.num的值,为什么不是实际的值,而是第一次循环为6,第二次循环为5,这是为什么?谢谢

解决方案 »

  1.   

    FUNCTION F(ID1 IN VARCHAR2, ID2 IN VARCHAR2) RETURN NUMBER
          IS
          s_err  VARCHAR2(100);
          
           CURSOR cur0 IS            
              SELECT year, COUNT(*)  aa
                FROM 表A
    WHERE id = ID1 OR id = ID2
            GROUP BY year, id;
           
          BEGIN   
                 FOR s IN cur0 LOOP
                   BEGIN  
                    
                IF s.aa > 2 THEN
     RETURN 2;
                END IF;           
                   END;
                END LOOP;

                
                RETURN 1;
               
         EXCEPTION
           WHEN OTHERS THEN
              s_err := SUBSTR(SQLERRM, 1, 100);
              RETURN 2;
                    
         END F;用游标得出的记录集为 2006 1
              2007 2
    表A中2006年的记录数为6,2007年的记录数为5。它怎么取得了这样的值?
    为什么第一次循环是6,第二次循环是5。
      

  2.   

    问题应该出在:
    CURSOR cur0 IS            
    SELECT year, COUNT(*)  aa
      FROM 表A
     WHERE id = ID1 OR id = ID2
     GROUP BY year, id;
    你再将值传进去测试一下;
    不过在你的函数中,逻辑上好像存在一些问题:
    1、函数只能返回最后一个值。你的函数中不论你怎样让它循环,循环完成后你让它的返回值始终是1,因为return 1写在了循环之外,所以为返回值1;
    2、个人认为你的需求不需要在函数中加游标,如果没有游标当然也就不需要循环读数据了;你完全只需要写一个固定的SQL查出来放在变量里面,再进行一个判断,再返回值就可以了。
      

  3.   

    谢谢zgh2003(世纪飞扬) 
    GROUP BY year, id是我拷错了,应该是GROUP BY year。
    我是为了测试才没有在循环中根据条件返回值的。
    我的需求很简单:就是在表A中查询在每年当中id为1或2的记录数,如果在任何一年中记录数大于2,则返回2;如果每年记录数都为1,则返回1;
    就是这个需求。希望再指点一下
      

  4.   

    FUNCTION F(ID1 IN VARCHAR2) RETURN NUMBER IS
      S_ERR VARCHAR2(100);
      v_count number(10);BEGIN
      SELECT COUNT(*) into v_count
        FROM 表A
       WHERE ID = ID1;
      if v_count>=2 then
        return 2;
      else
        return 1;
      end if;
    EXCEPTION
      WHEN OTHERS THEN
        S_ERR := SUBSTR(SQLERRM, 1, 100);
        RETURN 2;
      
    END F;测试:
    select f(col_id),... from table_name;
      

  5.   

    已解决,在GROUP BY year 加上having count(*) >1 得出在某一年记录数大于1的,循环游标,能进入游标就返回2,不能说明没有记录数大于1的,就返回1。
    再次谢谢zgh2003(世纪飞扬)您的费心关注
    真好!散分