tôi đoán là bạn đã thực hiện một số bước trước đó để đưa id vList vào một chuỗi phân tách (bạn không nói vList được điền như thế nào). Tại sao không giữ như một truy vấn?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...
Việc chuyển đổi ngữ cảnh khi chạy nhiều lần có thể gây khó khăn, nhưng với tôi phần tồi tệ nhất là bạn đang chấp nhận một cách mù quáng đầu vào tham số là một danh sách các con số, khi nó thực sự có thể là bất cứ thứ gì. Nó có thể (vô tội) là '1,2, X' và bạn sẽ gặp lỗi thời gian chạy "số không hợp lệ". Hoặc tệ hơn, nó có thể là một cuộc tấn công SQL injection. Nói chung, cách thực hành không tốt của nó (dynamic sql có vị trí của nó), nhưng chắc chắn KHÔNG phải cách bạn đang sử dụng nó.
Hãy thử một cái gì đó như sau:
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;
Bạn có thể tạo một loại đối tượng nếu bạn cần thứ gì đó phức tạp hơn một danh sách số.