Предполагам, че сте предприели някои стъпки по-рано, за да получите id на vList в ограничен низ (не казвате как е бил попълнен vList). Защо не запазите като една заявка?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...
Превключването на контекст, когато се изпълнява много пъти, може да бъде болезнено, но за мен най-лошата част е, че сляпо приемате въвеждането на параметри като списък с числа, когато може да е всичко наистина. Може (невинно) да е „1,2,X“ и ще получите грешка по време на изпълнение „невалиден номер“. Или още по-лошо, може да е атака чрез SQL инжектиране. Като цяло това е лоша практика (динамичният sql има своето място), но определено НЕ как го използвате.
Опитайте нещо подобно:
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;
Можете да създадете тип обект, ако имате нужда от нещо по-сложно от списък с числа.