Oracle
 sql >> Base de données >  >> RDS >> Oracle

mauvais nombre ou types d'arguments dans l'appel à P_AA

Votre procédure définit le paramètre comme ceci :

serv in t45

Alors t45 est le type de données défini du paramètre.

Maintenant, lorsque vous appelez la procédure, vous passez une variable v . Et comment est v défini ?

type t1 is table of number;
...
v t1;

t1 est un type différent de t45 . Même s'ils ont des structures identiques ils sont de types différents . Et c'est pourquoi vous obtenez PLS-00306. La solution est assez simple :définissez v comme t45 .

Vous devez initialiser la collection. Vous faites cela en utilisant le constructeur par défaut du type, soit en début de programme...

v := t45();

... ou lorsque vous le déclarez :

v t45 := t45();

Une fois que vous aurez dépassé cela, vous constaterez que votre logique d'affectation est erronée :vous récupérez un élément de la collection avant d'incrémenter le compteur ou d'étendre le tableau. Donc, ce dont vous avez besoin est ceci :

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;
/ 

Vous pouvez également utiliser la collecte en bloc moins détaillée, qui gère implicitement toutes les boucles et la gestion des types :

declare
    v t45;
begin
  select serv_item_id 
  bulk collect into v
  from serv_item;
  p_aa(v);
end;
/

Voici une démo db<>violon montrant que les deux approches fonctionnent.