Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

nomor atau jenis argumen yang salah dalam panggilan ke P_AA

Prosedur Anda mendefinisikan parameter seperti ini:

serv in t45

Jadi t45 adalah tipe data yang ditentukan dari parameter.

Sekarang ketika Anda memanggil prosedur, Anda memasukkan variabel v . Dan bagaimana v ditentukan?

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

t1 adalah tipe yang berbeda dengan t45 . Bahkan jika mereka memiliki struktur yang identik mereka adalah tipe yang berbeda . Dan itulah mengapa Anda mendapatkan PLS-00306. Solusinya cukup sederhana:tentukan v sebagai t45 .

Anda perlu menginisialisasi koleksi. Anda melakukan ini menggunakan konstruktor default dari jenis, baik di awal program ...

v := t45();

... atau saat Anda mendeklarasikannya:

v t45 := t45();

Setelah Anda melampaui itu, Anda akan menemukan logika penugasan Anda salah:Anda mengambil elemen koleksi sebelum Anda menambah penghitung atau memperluas array. Jadi yang Anda butuhkan adalah ini:

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

Atau gunakan pengumpulan massal yang tidak terlalu bertele-tele, yang menangani semua perulangan dan manajemen tipe secara implisit :

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

Ini demo biola<>db menunjukkan kedua pendekatan berfungsi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle sql Kurangi antara dua tanggal

  2. Masukkan catatan massal ke basis data jarak jauh (dblink) menggunakan Kumpulkan Massal

  3. Oracle NUMBER(p) ukuran penyimpanan?

  4. jalankan skrip Oracle sql dari java

  5. melakukan perhitungan pada data dalam tipe tabel