Uw procedure definieert de parameter als volgt:
serv in t45
Dus t45
is het gedefinieerde datatype van de parameter.
Als je nu de procedure aanroept, geef je een variabele door v
. En hoe is v
gedefinieerd?
type t1 is table of number;
...
v t1;
t1
is een ander type dan t45
. Zelfs als ze identieke structuren hebben het zijn verschillende typen . En daarom krijg je PLS-00306. De oplossing is vrij eenvoudig:definieer v
als t45
.
U moet de verzameling initialiseren. U doet dit met behulp van de standaardconstructor van het type, ofwel aan het begin van het programma ...
v := t45();
... of wanneer u het aangeeft:
v t45 := t45();
Als je eenmaal verder bent dan dat, zul je merken dat je toewijzingslogica verkeerd is:je haalt een element van de verzameling binnen voordat je de teller verhoogt of de array uitbreidt. Dus wat je nodig hebt is dit:
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;
/
U kunt ook de minder uitgebreide bulkcollect gebruiken, die al het looping- en typebeheer impliciet afhandelt:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Hier is een db<>fiddle-demo laat zien dat beide benaderingen werken.