Behöver du verkligen returnera en kommaseparerad lista? Det skulle generellt sett vara mycket bättre att deklarera en samlingstyp
CREATE TYPE num_table
AS TABLE OF NUMBER;
Deklarera en funktion som returnerar en instans av denna samling
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;
och använd sedan den samlingen i din fråga
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Det är möjligt att använda dynamisk SQL också (vilket @Sebas demonstrerar). Nackdelen med det är dock att varje anrop till proceduren kommer att generera en ny SQL-sats som måste analyseras igen innan den exekveras. Det sätter också press på bibliotekscachen vilket kan få Oracle att rensa massor av andra återanvändbara SQL-satser som kan skapa många andra prestandaproblem.