Votre procédure définit le paramètre comme ceci :
serv in t45
Alors t45
est le type de données défini du paramètre.
Maintenant, lorsque vous appelez la procédure, vous passez une variable v
. Et comment est v
défini ?
type t1 is table of number;
...
v t1;
t1
est un type différent de t45
. Même s'ils ont des structures identiques ils sont de types différents . Et c'est pourquoi vous obtenez PLS-00306. La solution est assez simple :définissez v
comme t45
.
Vous devez initialiser la collection. Vous faites cela en utilisant le constructeur par défaut du type, soit en début de programme...
v := t45();
... ou lorsque vous le déclarez :
v t45 := t45();
Une fois que vous aurez dépassé cela, vous constaterez que votre logique d'affectation est erronée :vous récupérez un élément de la collection avant d'incrémenter le compteur ou d'étendre le tableau. Donc, ce dont vous avez besoin est ceci :
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;
/
Vous pouvez également utiliser la collecte en bloc moins détaillée, qui gère implicitement toutes les boucles et la gestion des types :
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Voici une démo db<>violon montrant que les deux approches fonctionnent.