Seu procedimento define o parâmetro assim:
serv in t45
Então
t45
é o tipo de dados definido do parâmetro. Agora, quando você chama o procedimento, você passa uma variável
v
. E como é v
definiram? type t1 is table of number;
...
v t1;
t1
é um tipo diferente de t45
. Mesmo que tenham estruturas idênticas são tipos diferentes . E é por isso que você obtém o PLS-00306. A solução é bem simples:defina v
como t45
. Você precisa inicializar a coleção. Você faz isso usando o construtor padrão do tipo, seja no início do programa ...
v := t45();
... ou quando você declara:
v t45 := t45();
Depois de ir além disso, você descobrirá que sua lógica de atribuição está errada:você está buscando em um elemento da coleção antes de incrementar o contador ou estender a matriz. Então o que você precisa é isso:
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;
/
Como alternativa, use a coleta em massa menos detalhada, que lida com todos os loops e gerenciamento de tipos implicitamente:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Aqui está uma demonstração de db<>fiddle mostrando ambas as abordagens funcionando.