2012-02-21 68 views
2

我想編寫PL/SQL來測試包中的函數。該包定義了一個遊標類型如何使用記錄循環引用光標?

TYPE ref_cursor IS REF CURSOR; 

我想定義一個基於該類型的記錄。

我的代碼是:

DECLARE 
    cur PACKAGE_NAME.ref_cursor; 
    rec cur%ROWTYPE; 

爲什麼最後一行不正確的?

+0

你可以發佈遊標類型的聲明在包中嗎?特別是,包是聲明強還是弱的遊標? – 2012-02-21 21:10:34

+0

嗨賈斯汀,這是我想測試的包中的聲明。 (TYPE ref_cursor IS REF CURSOR;) – 2012-02-22 00:24:37

回答

12

您不能根據弱類型的REF CURSOR定義記錄類型。由於包中定義的遊標類型可用於從任意列的任意查詢中返回數據,因此PL/SQL編譯器無法確定將數據提取到的適當記錄類型。

如果您知道從函數返回的實際數據,則可以聲明該類型的記錄以將數據提取到中。例如,如果我聲明一個返回弱類型遊標類型的函數,但我知道遊標確實返回了基於EMP表的遊標,那麼我可以將該數據提取到EMP%ROWTYPE記錄中(請注意,SYS_REFCURSOR是系統定義的弱類型的REF CURSOR類型)

create or replace function f1 
    return sys_refcursor 
is 
    l_rc sys_refcursor; 
begin 
    open l_rc 
    for select * 
     from emp; 
    return l_rc; 
end; 

declare 
    l_rc sys_refcursor; 
    l_emp emp%rowtype; 
begin 
    l_rc := f1; 
    loop 
    fetch l_rc into l_emp; 
    exit when l_rc%notfound; 
    dbms_output.put_line(l_emp.empno); 
    end loop; 
end; 
+0

非常感謝,賈斯汀。 – 2012-02-22 13:43:39

+0

聲明 l_rc sys_refcursor; l_emp emp%rowtype; 開始什麼,如果我不知道類型的l_emp或沒有對象類型的權限 – donstack 2014-09-03 13:09:10