sql >> Database teknologi >  >> RDS >> Oracle

forkert antal eller typer af argumenter i kald til P_AA

Din procedure definerer parameteren sådan her:

serv in t45

t45 er den definerede datatype for parameteren.

Når du nu kalder proceduren, sender du en variabel v ind . Og hvordan er v defineret?

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

t1 er en anden type end t45 . Selvom de har identiske strukturer er de forskellige typer . Og det er derfor, du får PLS-00306. Løsningen er ret enkel:definer v som t45 .

Du skal initialisere samlingen. Du gør dette ved at bruge standardkonstruktøren af ​​typen, enten i starten af ​​programmet ...

v := t45();

... eller når du erklærer det:

v t45 := t45();

Når du kommer ud over det, vil du opdage, at din tildelingslogik er forkert:du henter ind i et element i samlingen, før du øger tælleren eller udvider arrayet. Så hvad du har brug for er dette:

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

Alternativt kan du bruge den mindre omfattende bulk-indsamling, som håndterer al looping og typestyring implicit:

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

Her er en db<>fiddle-demo viser, at begge tilgange virker.




  1. hvordan kan jeg oprette et tagging-system ved hjælp af php og mysql?

  2. MySQL INSERT ... PÅ DUBLIKAT NØGLOPDATERING med django 1.4 til masseindsættelse

  3. Hvordan konverteres MySQL-tid til UNIX-tidsstempel ved hjælp af PHP?

  4. Laravel 5.2 - Left Join DB::Raw virker ikke?