Twoja procedura definiuje parametr w następujący sposób:
serv in t45
Więc t45
jest zdefiniowanym typem danych parametru.
Teraz, kiedy wywołujesz procedurę, którą przekazujesz w zmiennej v
. A jak jest v
zdefiniowany?
type t1 is table of number;
...
v t1;
t1
jest innym typem niż t45
. Nawet jeśli mają identyczne struktury są to różne typy . I dlatego dostajesz PLS-00306. Rozwiązanie jest dość proste:zdefiniuj v
jako t45
.
Musisz zainicjować kolekcję. Robisz to za pomocą domyślnego konstruktora typu, na początku programu ...
v := t45();
... lub kiedy to zadeklarujesz:
v t45 := t45();
Gdy przekroczysz to, zauważysz, że logika przypisania jest błędna:pobierasz element kolekcji przed zwiększeniem licznika lub rozszerzeniem tablicy. Potrzebujesz więc tego:
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;
/
Alternatywnie użyj mniej szczegółowego zbierania zbiorczego, które niejawnie obsługuje wszystkie pętle i zarządzanie typami:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Oto db<>demonstracja skrzypiec pokazujące oba podejścia działają.