Oracle
 sql >> Datenbank >  >> RDS >> Oracle

falsche Anzahl oder Typen von Argumenten im Aufruf von P_AA

Ihre Prozedur definiert den Parameter wie folgt:

serv in t45

Also t45 ist der definierte Datentyp des Parameters.

Wenn Sie nun die Prozedur aufrufen, übergeben Sie eine Variable v . Und wie ist v definiert?

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

t1 ist ein anderer Typ als t45 . Auch wenn sie identische Strukturen haben, sind sie unterschiedliche Typen . Und deshalb bekommen Sie PLS-00306. Die Lösung ist ganz einfach:Definieren Sie v als t45 .

Sie müssen die Sammlung initialisieren. Sie tun dies mit dem Standardkonstruktor des Typs, entweder beim Start des Programms ...

v := t45();

... oder wenn Sie es erklären:

v t45 := t45();

Sobald Sie darüber hinausgehen, werden Sie feststellen, dass Ihre Zuweisungslogik falsch ist:Sie rufen ein Element der Sammlung ab, bevor Sie den Zähler erhöhen oder das Array erweitern. Was Sie also brauchen, ist Folgendes:

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

Verwenden Sie alternativ das weniger ausführliche Bulk-Collect, das die gesamte Schleifen- und Typverwaltung implizit behandelt:

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

Hier ist eine db<>fiddle-Demo zeigt, dass beide Ansätze funktionieren.