mit gæt er, at du tidligere har taget nogle skridt for at få vList-id'er ind i en afgrænset streng (du siger ikke, hvordan vList blev udfyldt). Hvorfor ikke beholde som én forespørgsel?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...
Kontekstskift, når det køres mange gange, kan være smertefuldt, men for mig er det værste, at du blindt accepterer parameterinput som en liste over tal, når det virkelig kan være hvad som helst. Det kunne (uskyldigt) være '1,2,X', og du får en runtime-fejl "ugyldigt nummer". Eller værre, det kan være et SQL-injektionsangreb. Dens dårlige praksis generelt (dynamisk sql har sin plads), men bestemt IKKE hvordan du bruger det.
Prøv noget som dette:
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;
Du kan oprette en objekttype, hvis du har brug for noget mere kompliceret end en liste med tal.