create or replace
PACKAGE P_ALARM IS
  TYPE CUR1 IS REF CURSOR;
END P_ALARM;create or replace
PROCEDURE StatKPI_AtchByCI() 
IS
icount number;
c_ru ALARMER.P_ALARM.CUR1;  
begin
strSql := 'select objid from ALARMER.' || TABLENAME;
  open c_ru for strSql;--为什么在这里一用以下几句就报错?
  for cc in c_ru
  loop
    icount := cc.objid;
  end loop;
--不加则没事
end;
另怎么使用存储过程中的输出游标,请各位指点。

解决方案 »

  1.   

    你加的那点语法就不对
    for i in 1..10000 loop  --最起码要写上从哪开始循环到哪
    null;
    end loop;
      

  2.   

    关于游标的问题,下面是某位版友发过的帖子,应该很标准了
    DECLARE 
      CURSOR my_cursor IS SELECT object_name FROM user_objects; 
      l_obj_name varchar2(100); 
    BEGIN 
      OPEN my_cursor; 
      LOOP 
        FETCH my_cursor INTO l_obj_name; 
        EXIT WHEN my_cursor%NOTFOUND; 
        DBMS_OUTPUT.PUT_LINE(l_obj_name); 
      END LOOP; 
      CLOSE my_cursor; 
    END; 
      

  3.   

    REF CURSOR 可以循环取值么,好像不可以把?
      

  4.   

    lz定义游标的需要参数时,一般把游标定义成带参数的游标,而lz没有这样而时采用了动态sql游标,那么在open 游标的时候需要execute immediate strSql一下才能正确.....
    begin 
    strSql := 'select objid from ALARMER.' || TABLENAME; 
      open c_ru for strSql; 
      execute immediate strSql;
    ....建议lz还是使用带参数的游标更合适.
      

  5.   

    open cursor 已经打开游标了。
    for xx in cursor又重新打开一次。所以报错。可以用
    loop
    fetch into
    end loop
      

  6.   

    for...in...loop 只适用于静态游标
    因为它自动执行的open不是for string 方式
    理解下动态游标的使用