Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

número errado ou tipos de argumentos na chamada para P_AA


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.