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

PL/SQL riscrive query concatenate con clausola 'IN'

la mia ipotesi è che tu abbia eseguito alcuni passaggi in precedenza per ottenere gli ID vList in una stringa delimitata (non dici come è stato popolato vList ). Perché non mantenere come una query?

begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...

Il cambio di contesto quando eseguito molte volte può essere doloroso, ma per me la parte peggiore è che stai accettando ciecamente l'input dei parametri come un elenco di numeri, quando potrebbe essere qualsiasi cosa. Potrebbe (innocentemente) essere "1,2,X" e riceverai un errore di runtime "numero non valido". O peggio, potrebbe essere un attacco SQL injection. È una cattiva pratica in generale (sql dinamico ha il suo posto), ma sicuramente NON come lo stai usando.

Prova qualcosa del genere:

create or replace type t_num_tab as table of number;

create or replace procedure test_proc(i_list in t_num_tab) as
  type t_name_tab is table of varchar2(100);
  l_names t_name_tab;
begin
  -- get names
  select name
  bulk collect into l_names
  from user_table
  where id in (select * from table(i_list));

  -- do something with l_names
  dbms_output.put_line('Name count: ' || l_names.count);

end;

Puoi creare un tipo di oggetto se hai bisogno di qualcosa di più complicato di un elenco di numeri.