Váš postup definuje parametr takto:
serv in t45
Takže t45 je definovaný datový typ parametru.
Nyní, když voláte proceduru, předáváte proměnnou v . A jak je v definováno?
type t1 is table of number;
...
v t1;
t1 je jiný typ než t45 . I když mají identické struktury,jsou to různé typy . A to je důvod, proč získáte PLS-00306. Řešení je celkem jednoduché:definujte v jako t45 .
Musíte inicializovat sbírku. To provedete pomocí výchozího konstruktoru typu, buď na začátku programu ...
v := t45();
... nebo když to prohlásíte:
v t45 := t45();
Jakmile se dostanete dále, zjistíte, že vaše logika přiřazení je nesprávná:načítáte prvek kolekce předtím, než zvýšíte počítadlo nebo rozšíříte pole. Takže potřebujete toto:
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;
/
Případně použijte méně podrobné hromadné shromažďování, které implicitně zvládá veškerou smyčku a správu typů:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Zde je db<>ukázka houslí ukazující fungující oba přístupy.