Har du virkelig brug for at returnere en kommasepareret liste? Det ville generelt være meget bedre at deklarere en samlingstype
CREATE TYPE num_table
AS TABLE OF NUMBER;
Deklarer en funktion, der returnerer en forekomst af denne 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;
og brug derefter denne samling i din forespørgsel
SELECT *
FROM users_table
WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Det er også muligt at bruge dynamisk SQL (hvilket @Sebas demonstrerer). Ulempen ved det er imidlertid, at hvert kald til proceduren vil generere en ny SQL-sætning, der skal parses igen, før den udføres. Det lægger også pres på bibliotekets cache, hvilket kan få Oracle til at rense mange andre genanvendelige SQL-sætninger, hvilket kan skabe mange andre ydeevneproblemer.