Hai davvero bisogno di restituire un elenco separato da virgole? In genere sarebbe molto meglio dichiarare un tipo di raccolta
CREATE TYPE num_table
AS TABLE OF NUMBER;
Dichiara una funzione che restituisce un'istanza di questa raccolta
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 poi usa quella raccolta nella tua query
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
È anche possibile utilizzare SQL dinamico (che @Sebas dimostra). Lo svantaggio di ciò, tuttavia, è che ogni chiamata alla procedura genererà una nuova istruzione SQL che deve essere analizzata nuovamente prima di essere eseguita. Inoltre mette sotto pressione la cache della libreria che può indurre Oracle a eliminare molte altre istruzioni SQL riutilizzabili che possono creare molti altri problemi di prestazioni.