Opravdu potřebujete vrátit seznam oddělený čárkami? Obecně by bylo mnohem lepší deklarovat typ kolekce
CREATE TYPE num_table
AS TABLE OF NUMBER;
Deklarujte funkci, která vrací instanci této kolekce
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;
a poté tuto kolekci použijte ve svém dotazu
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Je možné použít i dynamické SQL (což demonstruje @Sebas). Nevýhodou však je, že každé volání procedury vygeneruje nový příkaz SQL, který je třeba před provedením znovu analyzovat. Vyvíjí také tlak na mezipaměť knihovny, což může způsobit, že Oracle vyčistí spoustu dalších opakovaně použitelných příkazů SQL, což může způsobit spoustu dalších problémů s výkonem.