На мой взгляд, проще всего использовать SQL, чтобы разбить вашу строку:
with id_generator
as
(
SELECT regexp_substr(:txt, '[^,]+', 1, LEVEL) token
FROM dual
CONNECT BY LEVEL <= length(:txt) - length(REPLACE(:txt, ',', '')) + 1
)
select u.id, u.username
from users u, id_generator g
where u.id = g.token;
Этот запрос выглядит немного страшно, но вы можете взять верхнюю часть и запустить его изолированно, чтобы посмотреть, что он делает:
SELECT regexp_substr(:txt, '[^,]+', 1, LEVEL) token
FROM dual
CONNECT BY LEVEL <= length(:txt) - length(REPLACE(:txt, ',', '')) + 1
Это создает строку для каждого элемента в вашем списке, разделенном запятыми, который затем можно присоединить к другой таблице, чтобы получить результаты.
Больше обсуждений по этой проблеме в моем блоге - http://betteratoracle.com/posts/20-how-do-i-bind-a-variable-in-list