domyślam się, że wykonałeś kilka kroków wcześniej, aby uzyskać identyfikator vList w rozdzielanym ciągu (nie mówisz, w jaki sposób vList został wypełniony). Dlaczego nie zachować jako jednego zapytania?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...
Przełączanie kontekstu przy wielokrotnym uruchamianiu może być bolesne, ale dla mnie najgorsze jest to, że ślepo akceptujesz wprowadzanie parametrów jako listę liczb, podczas gdy może to być cokolwiek naprawdę. Może (niewinnie) być „1,2,X”, a otrzymasz błąd w czasie wykonywania „nieprawidłowy numer”. Albo gorzej, może to być atak typu SQL injection. Ogólnie jest to zła praktyka (dynamiczny sql ma swoje miejsce), ale na pewno NIE sposób, w jaki go używasz.
Wypróbuj coś takiego:
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;
Możesz utworzyć typ obiektu, jeśli potrzebujesz czegoś bardziej skomplikowanego niż lista liczb.