Prosedur Anda mendefinisikan parameter seperti ini:
serv in t45
Jadi t45
adalah tipe data yang ditentukan dari parameter.
Sekarang ketika Anda memanggil prosedur, Anda memasukkan variabel v
. Dan bagaimana v
ditentukan?
type t1 is table of number;
...
v t1;
t1
adalah tipe yang berbeda dengan t45
. Bahkan jika mereka memiliki struktur yang identik mereka adalah tipe yang berbeda . Dan itulah mengapa Anda mendapatkan PLS-00306. Solusinya cukup sederhana:tentukan v
sebagai t45
.
Anda perlu menginisialisasi koleksi. Anda melakukan ini menggunakan konstruktor default dari jenis, baik di awal program ...
v := t45();
... atau saat Anda mendeklarasikannya:
v t45 := t45();
Setelah Anda melampaui itu, Anda akan menemukan logika penugasan Anda salah:Anda mengambil elemen koleksi sebelum Anda menambah penghitung atau memperluas array. Jadi yang Anda butuhkan adalah ini:
declare
cursor c1 is select serv_item_id from serv_item;
n number:=0;
v t45 := t45();
x number;
begin
open c1;
loop
fetch c1 into x;
exit when c1%notfound;
n:=n+1;
v.extend();
v(n) := x;
end loop;
close c1;
p_aa(v);
end;
/
Atau gunakan pengumpulan massal yang tidak terlalu bertele-tele, yang menangani semua perulangan dan manajemen tipe secara implisit :
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Ini demo biola<>db menunjukkan kedua pendekatan berfungsi.