Oracle
 sql >> Baza danych >  >> RDS >> Oracle

zła liczba lub typy argumentów w wywołaniu P_AA

Twoja procedura definiuje parametr w następujący sposób:

serv in t45

Więc t45 jest zdefiniowanym typem danych parametru.

Teraz, kiedy wywołujesz procedurę, którą przekazujesz w zmiennej v . A jak jest v zdefiniowany?

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

t1 jest innym typem niż t45 . Nawet jeśli mają identyczne struktury są to różne typy . I dlatego dostajesz PLS-00306. Rozwiązanie jest dość proste:zdefiniuj v jako t45 .

Musisz zainicjować kolekcję. Robisz to za pomocą domyślnego konstruktora typu, na początku programu ...

v := t45();

... lub kiedy to zadeklarujesz:

v t45 := t45();

Gdy przekroczysz to, zauważysz, że logika przypisania jest błędna:pobierasz element kolekcji przed zwiększeniem licznika lub rozszerzeniem tablicy. Potrzebujesz więc tego:

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

Alternatywnie użyj mniej szczegółowego zbierania zbiorczego, które niejawnie obsługuje wszystkie pętle i zarządzanie typami:

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

Oto db<>demonstracja skrzypiec pokazujące oba podejścia działają.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00979:nie dotyczy wyrażenia GROUP BY

  2. porównywanie dwóch kursorów w Oracle zamiast używania MINUS

  3. Jak określić listę wyrażeń zmiennych w zapytaniu Pro*C?

  4. Jak uciec w tym samym czasie od przecinka i podwójnego cudzysłowu dla pliku CSV?

  5. Dlaczego Gdzie 1 <> 1 w zapytaniu zwraca wszystkie wiersze?