2013-10-24 72 views
0

我有一個SYS_REFCURSOR作爲OUT參數的存儲過程。簽名是,例如,如下:從程序返回的REF CURSOR中提取和批量收集

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

我把這個過程從一個函數,在那裏我有一個從p_cursor命名爲clientID列複製到一個標量嵌套表。

我做如下:

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行。

任何關於如何從這樣的遊標獲取和批量收集的幫助是非常感謝。

回答

5

for遊標循環(FOR i IN myCursor)中不允許使用遊標變量。您必須一次顯式地從遊標變量中獲取一行,例如使用FETCH INTO語句和常規循環語句,或使用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 
+0

@Rachcha您知道引用光標正在返回的類型(它們各自有多少列和哪些數據類型)?您可能通過研究'myProc'程序的源代碼來獲取這些信息。如果你知道類型,它與'some_table%rowtype'有所不同,那麼你可以聲明一個記錄類型,它有許多字段,它們中的很多字段都是引用遊標包含的,並且這些字段是兼容的數據類型。 –