私の推測では、以前に 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;
数値のリストよりも複雑なものが必要な場合は、オブジェクト タイプを作成できます。