La tua procedura definisce il parametro in questo modo:
serv in t45
Quindi t45
è il tipo di dati definito del parametro.
Ora quando chiami la procedura passi in una variabile v
. E come è v
definito?
type t1 is table of number;
...
v t1;
t1
è un tipo diverso da t45
. Anche se hanno strutture identiche sono di tipi diversi . Ed è per questo che ottieni PLS-00306. La soluzione è abbastanza semplice:definisci v
come t45
.
Devi inizializzare la raccolta. Puoi farlo usando il costruttore di default del tipo, sia all'inizio del programma...
v := t45();
... o quando lo dichiari:
v t45 := t45();
Una volta superato, scoprirai che la tua logica di assegnazione è sbagliata:stai recuperando un elemento della raccolta prima di incrementare il contatore o estendere l'array. Quindi quello che ti serve è questo:
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;
/
In alternativa, usa la raccolta in blocco meno dettagliata, che gestisce implicitamente tutti i cicli e la gestione dei tipi:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Ecco una demo di db<>violino mostrando entrambi gli approcci funzionanti.