私の推測では、vList IDを区切り文字列に入れるために以前にいくつかの手順を実行しました(vListがどのように入力されたかはわかりません)。 1つのクエリとして保持してみませんか?
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;
数値のリストよりも複雑なものが必要な場合は、オブジェクトタイプを作成できます。