Bạn có thực sự cần trả lại danh sách được phân tách bằng dấu phẩy không? Nói chung sẽ tốt hơn nhiều nếu khai báo một loại tập hợp
CREATE TYPE num_table
AS TABLE OF NUMBER;
Khai báo một hàm trả về một phiên bản của bộ sưu tập này
CREATE OR REPLACE FUNCTION get_nums
RETURN num_table
IS
l_nums num_table := num_table();
BEGIN
for i in 1 .. 10
loop
l_nums.extend;
l_nums(i) := i*2;
end loop;
END;
và sau đó sử dụng bộ sưu tập đó trong truy vấn của bạn
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Cũng có thể sử dụng SQL động (mà @Sebas trình bày). Tuy nhiên, nhược điểm của điều đó là mọi lệnh gọi đến thủ tục sẽ tạo ra một câu lệnh SQL mới cần được phân tích cú pháp lại trước khi nó được thực thi. Nó cũng gây áp lực lên bộ đệm thư viện, điều này có thể khiến Oracle xóa nhiều câu lệnh SQL có thể tái sử dụng khác, điều này có thể tạo ra nhiều vấn đề về hiệu suất khác.