2017-03-09 20 views
3

私はOracle 12cを使用しています。 PL/SQLでは、私は、これまでのところは良いがPL SQL For Loop Sys_RefCursor

set serveroutput on 
declare 
    cursor c1 is 
    select 1 as y from dual; 
begin 
    for x in c1 loop 
    dbms_output.put_line(x.y); 
    end loop; 
end; 

私もこれを行うことができ、この

set serveroutput on 
declare 
begin 
    for x in (select 1 as y from dual) loop 
    dbms_output.put_line(x.y); 
    end loop; 
end; 

を...行うことができます。しかし、私はsys_refcursorでこれを行うことはできますか?私は...私はフェッチ/ whileループでそれを行うことができます承知していますが、私がやりたい

set serveroutput on 
declare 
    cur sys_refcursor; 
begin 
    cur := Package.GetData(1234); 
    fetch cur into y; 
    while cur%FOUND loop 
    dbms_output.put_line(y); 
    fetch cur into y; 
    end loop; 
end; 

...(私はそれが多くのクリーナーだと思う)ループ構文について好む

set serveroutput on 
declare 
    cur sys_refcursor; 
begin 
    cur := PACKAGE.GetData(1234); -- This returns a sys_refcursor 
    for x in cur loop 
    dbms_output.put_line(x.y); 
    end loop; 
end; 

Error report - 
ORA-06550: line 5, column 16: 
PLS-00221: 'cur' is not a procedure or is undefined 

sys_refcursorをループするメカニズムはありますか(フェッチ・イン/ whileループではなく)。おそらく、私が知りません12cの新しい幻想的な何か...?

+2

私はそうは思いません。 fetch/whileループで何が問題になっていますか? –

+1

絶対に参照カーソルを使用する必要がありますか? IMEでは、PL/SQL内で作業するときにREFカーソルを必要とすることは稀です。主にPL/SQL以外のプログラムにカーソル・ポインタを渡して、カーソルを開いたかのようにループできます。 – Boneist

+0

弱い型の参照カーソル([%rowtype以降は動作しません])(http://stackoverflow.com/q/11187376/266304)に基づいてレコードを宣言できないという問題は、レコード型を宣言したくない、またはそれが何を含むのか分からないのですか? 'x.y'リファレンスは少なくともいくつかのフィールドを知っていることを示唆していますか? –

答えて

2

SYS_REFCURSORはあらかじめ宣言された弱い参照カーソルです。フェッチすることなくsys_refcursorをループするメカニズムはありません。また、弱いrefcursorを通常のカーソルと比較することはできず、それらは異なった働きをします。結果を一時的に保持するために割り当てられるバッファ空間です。あなたがPLSQLブロック、PLSQLエンジンdoesnotに以下のステートメントを実行するとPLSQL変数それを理解し、エラーに

をスローxのCURループ内

PLS-00221: 'CUR' is not a procedure or is undefined 

以下の文以外にもあるため失敗します。その戻り値がSYS_REFCURSORの場合は、パッケージにOUTパラメータを定義していませんでした。

cur:= PACKAGE.GetData(1234);

あなたはSYS_REFCURSORのコンテンツを取得して、以下のようにそれを表示することができます

declare 
    a SYS_REFCURSOR; 
    v_emp_id employee.emp_id%type; 
begin   
    --- This is a procedure with OUT parameter as SYS_REFCURSOR 
    dynmc_selec(emp_output=>a); 

    loop 
    FETCH a INTO v_emp_id; 
    EXIT WHEN a%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(v_emp_id); 

    end loop; 
end; 
+0

弱参照カーソルと通常カーソルは異なる方法で動作するかもしれませんが、Oracleは文法的な砂糖forループで使用されるもう一方を扱うことができます。つまり、それができなければ、それは答えです。 – 0909EM