tebakan saya adalah Anda mengambil beberapa langkah sebelumnya untuk memasukkan id vList ke dalam string yang dibatasi (Anda tidak mengatakan bagaimana vList diisi). Mengapa tidak disimpan sebagai satu kueri?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...
Pergantian konteks ketika dijalankan berkali-kali bisa menyakitkan, tetapi bagi saya bagian terburuknya adalah Anda secara membabi buta menerima input parameter menjadi daftar angka, padahal itu bisa berupa apa saja. Itu bisa (tidak bersalah) menjadi '1,2,X', dan Anda akan mendapatkan kesalahan runtime "nomor tidak valid". Atau lebih buruk, itu bisa menjadi serangan injeksi SQL. Praktik buruknya secara umum (sql dinamis memang memiliki tempatnya), tetapi jelas BUKAN bagaimana Anda menggunakannya.
Coba sesuatu seperti ini:
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;
Anda dapat membuat tipe objek jika Anda membutuhkan sesuatu yang lebih rumit daripada daftar angka.