Você realmente precisa retornar uma lista separada por vírgulas? Geralmente seria muito melhor declarar um tipo de coleção
CREATE TYPE num_table
AS TABLE OF NUMBER;
Declare uma função que retorna uma instância desta coleção
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;
e, em seguida, use essa coleção em sua consulta
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Também é possível usar SQL dinâmico (o que o @Sebas demonstra). A desvantagem disso, no entanto, é que cada chamada para o procedimento gerará uma nova instrução SQL que precisa ser analisada novamente antes de ser executada. Ele também pressiona o cache da biblioteca, o que pode fazer com que o Oracle limpe muitas outras instruções SQL reutilizáveis que podem criar muitos outros problemas de desempenho.