Avez-vous vraiment besoin de renvoyer une liste séparée par des virgules ? Il serait généralement préférable de déclarer un type de collection
CREATE TYPE num_table
AS TABLE OF NUMBER;
Déclarez une fonction qui renvoie une instance de cette collection
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;
puis utilisez cette collection dans votre requête
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Il est également possible d'utiliser SQL dynamique (ce que @Sebas démontre). L'inconvénient, cependant, est que chaque appel à la procédure générera une nouvelle instruction SQL qui doit être analysée à nouveau avant d'être exécutée. Cela exerce également une pression sur le cache de la bibliothèque, ce qui peut amener Oracle à purger de nombreuses autres instructions SQL réutilisables, ce qui peut créer de nombreux autres problèmes de performances.