Su procedimiento define el parámetro de esta manera:
serv in t45
Entonces t45
es el tipo de datos definido del parámetro.
Ahora, cuando llama al procedimiento, pasa una variable v
. Y como es v
definido?
type t1 is table of number;
...
v t1;
t1
es un tipo diferente a t45
. Incluso si tienen estructuras idénticas son de diferentes tipos . Y es por eso que obtienes PLS-00306. La solución es bastante simple:define v
como t45
.
Necesitas inicializar la colección. Para ello, utilice el constructor predeterminado del tipo, ya sea al inicio del programa...
v := t45();
... o cuando lo declaras:
v t45 := t45();
Una vez que vaya más allá, encontrará que su lógica de asignación es incorrecta:está obteniendo un elemento de la colección antes de incrementar el contador o extender la matriz. Así que lo que necesitas es esto:
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;
/
Alternativamente, use la recopilación masiva menos detallada, que maneja todos los bucles y la gestión de tipos implícitamente:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Aquí hay una demostración de db<>fiddle mostrando ambos enfoques funcionando.