我想編寫PL/SQL來測試包中的函數。該包定義了一個遊標類型如何使用記錄循環引用光標?
TYPE ref_cursor IS REF CURSOR;
我想定義一個基於該類型的記錄。
我的代碼是:
DECLARE
cur PACKAGE_NAME.ref_cursor;
rec cur%ROWTYPE;
爲什麼最後一行不正確的?
我想編寫PL/SQL來測試包中的函數。該包定義了一個遊標類型如何使用記錄循環引用光標?
TYPE ref_cursor IS REF CURSOR;
我想定義一個基於該類型的記錄。
我的代碼是:
DECLARE
cur PACKAGE_NAME.ref_cursor;
rec cur%ROWTYPE;
爲什麼最後一行不正確的?
您不能根據弱類型的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;
非常感謝,賈斯汀。 – 2012-02-22 13:43:39
聲明 l_rc sys_refcursor; l_emp emp%rowtype; 開始什麼,如果我不知道類型的l_emp或沒有對象類型的權限 – donstack 2014-09-03 13:09:10
你可以發佈遊標類型的聲明在包中嗎?特別是,包是聲明強還是弱的遊標? – 2012-02-21 21:10:34
嗨賈斯汀,這是我想測試的包中的聲明。 (TYPE ref_cursor IS REF CURSOR;) – 2012-02-22 00:24:37