Salah satu solusi yang mungkin (yang pada akhirnya dapat disederhanakan) adalah dengan menggunakan fungsi tabel untuk memproses kursor dan menambahkan nilai fungsi.
Asumsikan fungsi yang mengembalikan sys_refcursor disebut get_cur
dan kursor terdiri dari kolom ID, NAME
(ini penting, karena fungsi tabel memerlukan definisi tipe).
Anda mendeklarasikan TYPE untuk baris (termasuk kolom jalur tambahan) dan untuk tabel yang dihasilkan.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
dan tentukan fungsi tabel dengan mengambil kursor dan menambahkan panggilan fungsi.
create or replace function get_cur2 return
t_rows
PIPELINED
as
cv_out sys_refcursor;
id number;
name varchar2(100);
begin
cv_out := get_cur;
loop
FETCH cv_out INTO id, name;
exit when cv_out%NOTFOUND;
pipe row(t_row(id,name, GetRegionPath(id)));
end loop;
close cv_out;
return;
end;
/
Sekarang Anda dapat memilih data dari fungsi tabel
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
dan tentu saja Anda dapat menggunakan kueri ini untuk membuka kursor di fungsi ketiga yang akan mengembalikan SYS_REFCURSOR dengan kolom jalur tambahan.