3

refカーソルはカーソルのようなforループで使用できますか? つまり好き

for i in cur_name 
loop
dbms_output.put_line(i.column_name)
end loop; 

もし不可能なら、なぜですか?

4

1 に答える 1

6

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;
/

エラーが発生します

PLS-00221: 'REF_CUR'はプロシージャではないか、未定義です

は、開いているカーソルを out 引数としてクライアント アプリに送信してレコードをループするために使用される へのref cursorポインタです。 ループスルーしたい場合は、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;
/

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;
/

また

BEGIN 
    for i in (SELECT table_name FROM all_tables WHERE ROWNUM < 5) loop
        dbms_output.put_line(i.table_name); 
    end loop;
END;
/
于 2015-12-15T13:11:42.770 に答える