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

numero o tipi di argomenti errati nella chiamata a P_AA

La tua procedura definisce il parametro in questo modo:

serv in t45

Quindi t45 è il tipo di dati definito del parametro.

Ora quando chiami la procedura passi in una variabile v . E come è v definito?

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

t1 è un tipo diverso da t45 . Anche se hanno strutture identiche sono di tipi diversi . Ed è per questo che ottieni PLS-00306. La soluzione è abbastanza semplice:definisci v come t45 .

Devi inizializzare la raccolta. Puoi farlo usando il costruttore di default del tipo, sia all'inizio del programma...

v := t45();

... o quando lo dichiari:

v t45 := t45();

Una volta superato, scoprirai che la tua logica di assegnazione è sbagliata:stai recuperando un elemento della raccolta prima di incrementare il contatore o estendere l'array. Quindi quello che ti serve è questo:

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

In alternativa, usa la raccolta in blocco meno dettagliata, che gestisce implicitamente tutti i cicli e la gestione dei tipi:

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

Ecco una demo di db<>violino mostrando entrambi gli approcci funzionanti.