Din procedur definierar parametern så här:
serv in t45
Alltså t45
är den definierade datatypen för parametern.
När du nu anropar proceduren skickar du in en variabel v
. Och hur är v
definieras?
type t1 is table of number;
...
v t1;
t1
är en annan typ än t45
. Även om de har identiska strukturer är de olika typer . Och det är därför du får PLS-00306. Lösningen är ganska enkel:definiera v
som t45
.
Du måste initiera samlingen. Du gör detta med standardkonstruktorn av typen, antingen i början av programmet ...
v := t45();
... eller när du deklarerar det:
v t45 := t45();
När du väl kommit utöver det kommer du att upptäcka att din tilldelningslogik är fel:du hämtar in i ett element i samlingen innan du ökar räknaren eller utökar arrayen. Så vad du behöver är detta:
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;
/
Alternativt kan du använda den mindre omfattande bulk-insamlingen, som hanterar all looping och typhantering implicit:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Här är en db<>fioldemo visar att båda metoderna fungerar.