Perhatikan komentar tambahan berikut:
Mungkin di tengah pertanyaannya adalah kesalahpahaman tentang apa itu kursor. Ini bukan wadah yang penuh dengan catatan, ini adalah spesifikasi untuk kumpulan hasil, seperti pada suatu waktu, berdasarkan satu kueri SQL. Jadi jika Anda
open rc for select id from table1;
dan berikan rc
kembali ke pemanggil, Anda tidak meneruskan data apa pun, Anda meneruskan pointer ke area memori pribadi yang berisi kueri yang disiapkan. Anda tidak mendorong hasil, penelepon menariknya. Ini seperti program yang akan dijalankan pemanggil untuk mengambil baris. Anda tidak dapat membukanya sedikit lagi untuk menambahkan baris lain, yang menurut saya adalah apa yang Anda harapkan.
Untuk menggunakan koleksi di kursor dalam suatu prosedur, tipe koleksi harus dibuat sebagai objek skema terpisah (meskipun tentu saja Anda dapat menggunakan kembali tipe koleksi dalam prosedur lain, jadi tidak seketat kedengarannya).
Jika Anda tidak dapat membuat jenis, lihat jenis yang sudah ada yang dapat Anda gunakan:
select owner, type_name
from all_coll_types t
where t.coll_type = 'TABLE'
and t.elem_type_name = 'NUMBER';
Misalnya:
create or replace type number_tt as table of number;
create table table1 (id primary key, currency, t_id) as
select 10, 'GBP', 'PB1' from dual union all
select 15, 'GBP', 'RB' from dual union all
select 20, 'GBP', 'CC' from dual union all
select 25, 'AUD', 'DC' from dual;
create table table2 (id,country,account) as
select 10, 'UK', 'PB1' from dual union all
select 15, 'Wales', 'RB' from dual union all
select 20, 'SH', 'CC' from dual;
Sekarang prosedurnya bisa:
create or replace procedure myproc
( rc out sys_refcursor)
as
l_names number_tt;
begin
select id bulk collect into l_names
from table1
where currency = 'GBP';
open rc for
select t.id,t.country,t.account from table2 t
where t.id member of l_names;
end myproc;
Keluaran kursor:
ID COUNT ACC
---------- ----- ---
10 UK PB1
15 Wales RB
20 SH CC
(Saya menghapus i_id
parameter dalam prosedur Anda karena saya tidak jelas bagaimana Anda ingin menggunakannya.)
Agaknya ini adalah versi yang disederhanakan dari masalah yang sebenarnya, karena sebagaimana adanya, Anda dapat menggunakan kueri pertama sebagai subkueri dan Anda tidak memerlukan koleksi:
create or replace procedure myproc
( rc out sys_refcursor)
as
begin
open rc for
select t.id,t.country,t.account from table2 t
where t.id in
( select id
from table1
where currency = 'GBP' );
end myproc;
atau bergabung saja, seperti yang disarankan Littlefoot:
create or replace procedure myproc
( rc out sys_refcursor)
as
begin
open rc for
select t2.id, t2.country, t2.account
from table1 t1
join table2 t2 on t2.id = t1.id
where t1.currency = 'GBP';
end myproc;
Namun, Anda mengomentari jawaban itu bahwa Anda tidak dapat melakukannya karena kebutuhan Anda tampaknya melakukannya melalui kumpulan, loop, beberapa lakban, dua kucing, dan generator fusi.