Ref Cursor就是我們定義在服務器端的結果集的reference。 當我們打開一個Ref Cursor的時候,沒有任何的數據返回到客戶端,相反,數據在服務器上的地址將會被返回到客戶端。這樣用戶就可以自己決定什麼時間和以那種方式通過Ref Cursor去取數據。
在以前版本的ODP.NET中,我們可以通過Ref Cursor取數據,但是我們不能把Ref Cursor作為一個Input參數傳遞給PL/SQL的存儲過程和存儲函數。但是在Oracle Database 10g Release2,我們能夠很簡單的把Ref Cursor作為Input參數傳遞給PL/SQL的存儲過程和存儲函數。這是Oracle Database 10g Release2的新功能。
我們接下來就以例程的方式來向你介紹這個新功能。
准備數據庫
我們要在數據庫中生成一個表和一個包,我們接下來的例子會用到。
請用HR用戶登錄數據庫,然後運行下面的腳本。
create table processing_result
(
status varchar2(64)
);
create or replace package cursor_in_out as
type emp_cur_type is ref cursor return employees%rowtype;
procedure process_cursor(p_cursor in emp_cur_type);
end;
/
create or replace package body cursor_in_out as
procedure process_cursor(p_cursor in emp_cur_type) is
employee employees%rowtype;
begin
loop
fetch p_cursor into employee;
exit when p_cursor%notfound;
insert into processing_result
values('Processed employee #' ||
employee.employee_id || ': ' ||
employee.first_name || ' ' ||
employee.last_name);
end loop;
end;
end;
/