for 循环中的引用光标

Nar*_*iya 3 oracle plsql ref-cursor oracle11g

ref 游标可以像游标一样用于 for 循环吗?即喜欢

for i in cur_name 
loop
dbms_output.put_line(i.column_name)
end loop; 
Run Code Online (Sandbox Code Playgroud)

如果不可能那为什么?

Pra*_*een 8

您不能for像针对循环那样使用循环implicit/explicit cursors

declare
    ref_cur sys_refcursor;
BEGIN
    OPEN ref_cur FOR SELECT table_name FROM all_tables WHERE ROWNUM < 5;
    for i in ref_cur loop
        dbms_output.put_line(i.table_name); 
    end loop;  
END;
/
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误

PLS-00221:“REF_CUR”不是过程或未定义

Aref cursor是指向 an 的指针,open cursor用于将打开的游标作为输出参数发送给客户端应用程序以循环遍历记录。
如果你想循环的话,

declare
    ref_cur sys_refcursor;
    v_name all_tables.table_name%TYPE;
BEGIN
    OPEN ref_cur FOR SELECT table_name FROM all_tables WHERE ROWNUM < 5;
    LOOP
        FETCH  ref_cur INTO  v_name;
        exit when ref_cur%notfound;
        dbms_output.put_line(v_name); 
    end loop;  
END;
/
Run Code Online (Sandbox Code Playgroud)

implicit/explicit cursors如果光标的生命周期在以下范围内,则可以使用*block*

declare
    cursor cur IS SELECT table_name FROM all_tables WHERE ROWNUM < 5;
BEGIN 
    for i in cur loop
        dbms_output.put_line(i.table_name); 
    end loop;
END;
/
Run Code Online (Sandbox Code Playgroud)

或者

BEGIN 
    for i in (SELECT table_name FROM all_tables WHERE ROWNUM < 5) loop
        dbms_output.put_line(i.table_name); 
    end loop;
END;
/
Run Code Online (Sandbox Code Playgroud)