sql >> Database >  >> RDS >> Oracle

verkeerd aantal of soorten argumenten in aanroep naar P_AA

Uw procedure definieert de parameter als volgt:

serv in t45

Dus t45 is het gedefinieerde datatype van de parameter.

Als je nu de procedure aanroept, geef je een variabele door v . En hoe is v gedefinieerd?

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

t1 is een ander type dan t45 . Zelfs als ze identieke structuren hebben het zijn verschillende typen . En daarom krijg je PLS-00306. De oplossing is vrij eenvoudig:definieer v als t45 .

U moet de verzameling initialiseren. U doet dit met behulp van de standaardconstructor van het type, ofwel aan het begin van het programma ...

v := t45();

... of wanneer u het aangeeft:

v t45 := t45();

Als je eenmaal verder bent dan dat, zul je merken dat je toewijzingslogica verkeerd is:je haalt een element van de verzameling binnen voordat je de teller verhoogt of de array uitbreidt. Dus wat je nodig hebt is dit:

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

U kunt ook de minder uitgebreide bulkcollect gebruiken, die al het looping- en typebeheer impliciet afhandelt:

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

Hier is een db<>fiddle-demo laat zien dat beide benaderingen werken.




  1. Splits woorden met een hoofdletter in sql

  2. Rails 3:migratiefout bij gebruik van json als kolomtype in een ActiveRecord ondersteund door Postgres

  3. Een bestaande database koppelen met MySQL

  4. mysql laad data lokaal infile