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.