Din procedure definerer parameteren sådan her:
serv in t45
Så t45
er den definerede datatype for parameteren.
Når du nu kalder proceduren, sender du en variabel v
ind . Og hvordan er v
defineret?
type t1 is table of number;
...
v t1;
t1
er en anden type end t45
. Selvom de har identiske strukturer er de forskellige typer . Og det er derfor, du får PLS-00306. Løsningen er ret enkel:definer v
som t45
.
Du skal initialisere samlingen. Du gør dette ved at bruge standardkonstruktøren af typen, enten i starten af programmet ...
v := t45();
... eller når du erklærer det:
v t45 := t45();
Når du kommer ud over det, vil du opdage, at din tildelingslogik er forkert:du henter ind i et element i samlingen, før du øger tælleren eller udvider arrayet. Så hvad du har brug for er dette:
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 bruge den mindre omfattende bulk-indsamling, som håndterer al looping og typestyring implicit:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Her er en db<>fiddle-demo viser, at begge tilgange virker.