type c_result is ref cursor;
sqlStr := 'select * from table';open c_result is sqlStr;
for c1 in c_result loop
dbms_output.put(c1.id);
end loop;为什么系统一直提示c_result未定义呢?难道for loop 不支持ref cursor吗?
忘高手指教

解决方案 »

  1.   

    open c_result for sqlStr;
      

  2.   

    1楼,抱歉,是我的贴子笔误,是for!我程序里是for的。哪位高手能回复我的问题呢?
      

  3.   


    declare
      type c_result is ref cursor;
      c1 table_name%rowtype;
      sqlStr varchar2(100):= 'select * from table';
    begin
      open c_result for sqlStr;
      loop
          fetch c_result into c1;
          exit when c_result%notfound;
          dbms_output.put(c1.id);
      end loop;
      close c_result; 
    end;
      

  4.   

    3楼的兄弟,我想用for loop方式,这样可以不用fetch into,for loop不能用吗?
      

  5.   

    for 。。loop 是隐式读取游标,自动打开循环完成就自动关闭游标
    当你用for...时候,由于前面c_result已经被open打开了,此时就会爆c_result未定义
    我是这么理解的
      

  6.   

    当你前面open c_result for sqlStr的时候c_result已经打开,当没有close关闭的时候执行for...再打开的时候就报错
      

  7.   


    type c_result is ref cursor;--这个定义的是ref cursor类型
    c_cur c_result;--这个才是游标变量
    /*
    --或者
    cursor c_cur;--这个是游标变量
    */
    sqlStr := 'select * from table';
    open c_cur is sqlStr;
    --或者使用这个for c1 in select * from table loop 前面就可以省了
    for c1 in c_cur loop 
    dbms_output.put(c1.id);
    end loop;
      

  8.   

    type c_result is ref cursor;
    cur c_result;
    sqlStr := 'select * from table';
    rec1 table%type;
    begin
    open cur for sqlStr;
    fetch cur into rec1.id;
    while cur%found loop
    dbms_output.put(cur.id);
    fetch cur into rec1.id;
    end loop;
    end;
      

  9.   

    declare
    type c_result is ref cursor;
    cur c_result;
    sqlStr := 'select * from table';
    rec1 table%type;
    begin
    open cur for sqlStr;
    fetch cur into rec1.id;
    while cur%found loop
    dbms_output.put(cur.id);
    fetch cur into rec1.id;
    end loop;
    close cur;
    end;
      

  10.   

    8楼兄弟,我就是用你这样的格式的,会报才c1未定义的!我用for  loop目的是不用fetch into,用fetch into我还得创建一个临时表去存放数据,太麻烦了。
      

  11.   

    type c_result is ref cursor; 
     c_result_cursor c_result 
    sqlStr := 'select * from table';open c_result_cursor for sqlStr;
    for c1 in c_result_cursor loop
    dbms_output.put(c1.id);
    end loop;
    close c_result_cursor;
      

  12.   

    13楼兄弟,你做过实验吗?这样会报错的!
    会报c_result_cursor未定义的.
      

  13.   

    zhuomingwang兄弟,你可以在pl sql里把你的代码写一个存储过程看看,肯定要报错的,报的错就是c_cur 未定义。我这边没有环境现在没法贴代码给你,但你写的和我昨天写的结构是一样所以应该会报错的。ref cursor不能用for loop遍历的,你可以做个实验试试看。
      

  14.   

    如果你能做一个for  loop遍历ref cursor的例子,我把所有的分都给你。
      

  15.   

    谢谢提醒 确实是这样的
    --你的问题用这个方法应该是可以的
    for c1 in (select * from table) loop 
    dbms_output.put(c1.id);  
    end loop; 
      

  16.   

    create or replace package TEST is
      type cursorType is ref cursor;
      procedure get(v_str1 out varchar2);
      end TEST;create or replace package body TEST is
    procedure get( v_str1 out varchar2) is
    cur1 cursorType;
    begin
      open cur1 for select student_code from student;
      for cur2 in cur1 loop
          dbms_output.put(cur2.student_code);
      end loop; 
      
    end get;
    end TEST;我把我的代码贴出来了,报的错误如下:
    Error: PLS-00221: 'CUR1' 不是过程或尚未定义 Line: 24
      

  17.   

    --或者这种方式也可以
    declare
    cursor v_cur is select ename from emp;
    begin
    for v_name in v_cur loop
    dbms_output.put_line(v_name.ename);
    end loop;
    end;SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLERPL/SQL 过程已成功完成。
      

  18.   

    zhuomingwang,如果是动态sql语句按照你的方式怎么处理?
      

  19.   

    如果是动态sql语句的话那估计就不能用for了 只能open fetch close了
    declare
    type c_result is ref cursor;
    v_cur c_result;
    v_name emp.ename%type;
    sqlstr varchar2(100):= 'select ename from emp';
    begin
    open v_cur for sqlstr;
    loop
    fetch v_cur into v_name;
    exit when v_cur%notfound;
    dbms_output.put_line(v_name);
    end loop;
    close v_cur;
    end;SQL> /
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLERPL/SQL 过程已成功完成。
      

  20.   

    ....LZ既然试了 动态 不行 这样那就乖乖 用 open xxx for sql_var;
    loop 
     fetch xxx into ....;
     exit when xxx%NOTFOUND;
     DBMS_OUTPUT.PUT_LINE();
    end loop;