sql >> Base de Datos >  >> RDS >> Oracle

número incorrecto o tipos de argumentos en la llamada a P_AA

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.