Czy naprawdę musisz zwrócić listę rozdzielaną przecinkami? Ogólnie byłoby znacznie lepiej zadeklarować typ kolekcji
CREATE TYPE num_table
AS TABLE OF NUMBER;
Zadeklaruj funkcję, która zwraca instancję tej kolekcji
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 następnie użyj tej kolekcji w zapytaniu
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Możliwe jest również użycie dynamicznego SQL (co demonstruje @Sebas). Wadą tego jest jednak to, że każde wywołanie procedury generuje nową instrukcję SQL, którą należy ponownie przeanalizować przed wykonaniem. Wywiera również presję na pamięć podręczną biblioteki, co może spowodować, że Oracle usunie wiele innych instrukcji SQL wielokrotnego użytku, które mogą spowodować wiele innych problemów z wydajnością.