Ihre Prozedur definiert den Parameter wie folgt:
serv in t45
Also t45
ist der definierte Datentyp des Parameters.
Wenn Sie nun die Prozedur aufrufen, übergeben Sie eine Variable v
. Und wie ist v
definiert?
type t1 is table of number;
...
v t1;
t1
ist ein anderer Typ als t45
. Auch wenn sie identische Strukturen haben, sind sie unterschiedliche Typen . Und deshalb bekommen Sie PLS-00306. Die Lösung ist ganz einfach:Definieren Sie v
als t45
.
Sie müssen die Sammlung initialisieren. Sie tun dies mit dem Standardkonstruktor des Typs, entweder beim Start des Programms ...
v := t45();
... oder wenn Sie es erklären:
v t45 := t45();
Sobald Sie darüber hinausgehen, werden Sie feststellen, dass Ihre Zuweisungslogik falsch ist:Sie rufen ein Element der Sammlung ab, bevor Sie den Zähler erhöhen oder das Array erweitern. Was Sie also brauchen, ist Folgendes:
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;
/
Verwenden Sie alternativ das weniger ausführliche Bulk-Collect, das die gesamte Schleifen- und Typverwaltung implizit behandelt:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Hier ist eine db<>fiddle-Demo zeigt, dass beide Ansätze funktionieren.