1

SYS_REFCURSORパラメータとしてを持つストアド プロシージャがありOUTます。署名は、たとえば次のようになります。

PROCEDURE myProc(p_someID IN INTEGER, p_cursor OUT SYS_REFCURSOR);

この手順を関数から呼び出します。関数では、名前が付けられた列をスカラーのネストされたテーブルにコピーする必要がありclientIDますp_cursor

私は次のようにやっています:

CREATE OR REPLACE FUNCTION myFunction
    RETURN sys_refcursor
IS
    someID      INTEGER       := 1234;
    myCursor    SYS_REFCURSOR;
    TYPE t_clientID_nt IS TABLE OF NUMBER(16,0);
    clientID_nt t_clientID_nt;
    otherID     SYS_REFCURSOR;
BEGIN
    myProc (someID, myCursor);
    FOR i IN myCursor
    LOOP
        clientID_nt.EXTEND;
        clientID_nt (clientID_nt.COUNT) := i.clientID;
    END LOOP;


    -- Other code that opens the cursor otherID
    -- based on the IDs in clientID_nt
    ...
    ... 
    RETURN otherID;
END;
/

この関数をコンパイルしようとすると、次のエラーが表示されます。

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

コードの 11 行目にあります。

このようなカーソルからフェッチして一括収集する方法についてのヘルプは大歓迎です。

4

1 に答える 1

7

forカーソル ループ ( )でカーソル変数を使用することはできませんFOR i IN myCursorFETCH INTOたとえば、ステートメントと通常のループステートメントを使用して、カーソル変数から一度に1行ずつ明示的にフェッチするかFETCH BULK COLLECT INTO、コレクションを作成するために使用する必要があります。例えば:

SQL> declare
  2    TYPE t_clientID_nt IS TABLE OF dual%rowtype;
  3    clientID_nt t_clientID_nt;
  4  
  5    l_cur sys_refcursor;
  6  
  7    procedure OpenAndPopulateCursor(p_cur in out sys_refcursor) is
  8    begin
  9      open p_cur for
 10        select *
 11         from dual;
 12    end;
 13  
 14  begin
 15    OpenAndPopulateCursor(l_cur);
 16  
 17    if l_cur%isopen
 18    then
 19      fetch l_cur bulk collect into clientID_nt;
 20    end if;
 21  
 22    dbms_output.put_line(concat( to_char(clientID_nt.count) 
 23                               , ' record(s) has/have been fetched.'));
 24  end;
 25  /

 1 record(s) has/have been fetched.

 PL/SQL procedure successfully completed
于 2013-10-24T10:31:32.707 に答える