8

私はPL/SQLを初めて使用し、学習プロセスでカーソルを取得しました。OUT SYS_REFCURSOR私が理解している限り、その目的はC言語のポインタのように「データを返す」ことであるタイプのストアドプロシージャパラメータを見てきました。SYS_REFCURSORプロシージャがパラメータを開かなければならず、閉じることができない場合、誰がそのようなパラメータを閉じるのだろうかと思っていました。(プロシージャが終了するOUT SYS_REFCURSORと、返されるデータはありません)。

OUT SYS_REFCURSORまた、カーソルを閉じるためのパラメータを含むストアドプロシージャ以外の外部関数に依存するのは悪い設計だと思います。カーソルを使用せずにストアドプロシージャからテーブルを返す方法はありますか?

4

1 に答える 1

12

あなたがする必要があるのは、それが実際に開かれた場所に関係なく、それが終わったときにカーソルにCLOSEを発行することです:

-- A function to return a SYS_REFCURSOR
CREATE OR REPLACE FUNCTION f_c RETURN SYS_REFCURSOR IS
    cur SYS_REFCURSOR;
BEGIN
    OPEN cur FOR SELECT LEVEL FROM dual CONNECT BY LEVEL < 10;
    RETURN cur; 
END;

実行例は次のとおりです。

DECLARE
  cc SYS_REFCURSOR;
  r  VARCHAR2(10);
BEGIN
  cc := f_c;         -- Get the cursor from the function
  LOOP
    FETCH cc INTO r;
    EXIT WHEN cc%NOTFOUND;
    dbms_output.put_line('Output is: '||r);
  END LOOP;
  CLOSE cc;          -- Close the SYS_REFCURSOR returned from the function
END;
/

Output is: 1
Output is: 2
Output is: 3
Output is: 4
Output is: 5
Output is: 6
Output is: 7
Output is: 8
Output is: 9

関数またはプロシージャから値のセットを返すことに関しては、このトピックに関する別のSOの質問があります。

于 2011-05-25T17:29:16.793 に答える