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 cc in strSql
      loop 
        icount := cc.objid; 
      end loop; 
      

  2.   

    LZ的tablename, strSql 变量也没见定义啊。
      

  3.   

    TABLENAME是传入参数;
    strSql:是定义过得,
    这里只是截取部分,只要一加上
      for cc in c_ru 
      loop 
        icount := cc.objid; 
      end loop; 
    就编译不通过。
      

  4.   

    你上面有个OPEN了,所以这里应该用显式游标:
      

  5.   

    动态游标的open需要使用for string的方式,for ... loop ... 实际自动完成了open,行级变量声明,close,但它的open不是for string 方式,
    因此你的程序相当于先用for string方式open了一次,然后又没用for string方式open了一次,因此动态游标不能用for...in...loop方式使用,只能用
    open
    loop
    fetch
    end loop
    close
    方式使用
      

  6.   

    改造了一下,这是个通用的程序,用的是Oracle的all_users表,在Oracle库上都能使用,请楼主参考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 P_ALARM.CUR1;  
    begin 
      open c_ru for select user_id from all_users;   loop 
        fetch c_ru into icount;
          exit when c_ru%notfound;
          DBMS_OUTPUT.PUT_LINE(icount);
      end loop; 
    end;