sql >> Databáze >  >> RDS >> Oracle

nesprávný počet nebo typy argumentů ve volání P_AA

Váš postup definuje parametr takto:

serv in t45

Takže t45 je definovaný datový typ parametru.

Nyní, když voláte proceduru, předáváte proměnnou v . A jak je v definováno?

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

t1 je jiný typ než t45 . I když mají identické struktury,jsou to různé typy . A to je důvod, proč získáte PLS-00306. Řešení je celkem jednoduché:definujte v jako t45 .

Musíte inicializovat sbírku. To provedete pomocí výchozího konstruktoru typu, buď na začátku programu ...

v := t45();

... nebo když to prohlásíte:

v t45 := t45();

Jakmile se dostanete dále, zjistíte, že vaše logika přiřazení je nesprávná:načítáte prvek kolekce předtím, než zvýšíte počítadlo nebo rozšíříte pole. Takže potřebujete toto:

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

Případně použijte méně podrobné hromadné shromažďování, které implicitně zvládá veškerou smyčku a správu typů:

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

Zde je db<>ukázka houslí ukazující fungující oba přístupy.




  1. Sloučení řádků výsledků node-mysql do jediného návratu JSON pro node.js

  2. Přidat FULLTEXTOVÝ index do Doctrine 2 pomocí anotací?

  3. SQL Řadit podle na více sloupců

  4. MySQL Select ID, která se vyskytují na různých řádcích s více specifickými hodnotami pro sloupec