Нет, вы не можете, но вы достаточно близки
Список, разделенный запятыми, заставит условие выглядеть так:
WHERE UROLE.ROLE_NAME in ('Jane, Andrew, Jill')
и вернетпустой набор результатов. В то время как вы ищете
WHERE UROLE.ROLE_NAME in ('Jane', 'Andrew', 'Jill')
Совершенно очевидно, что число переменных связывания должно будет отличаться от одного вызова к другому, поскольку списки имеют разную длину. Извините, это не то, что мы можем сделать легко. Вам нужно что-то под названием Метод динамического SQL 4 , и это кажется излишним.
Хотя есть более простой способ. Мы собираемся проанализировать входную строку значений, разделенных запятыми, в набор результатов. Мы собираемся сделать это в подзапросе, и мы можем использовать подзапросы в IN
.
Вот как мы это делаем
WHERE UROLE.ROLE_NAME in (
SELECT NAME
FROM (
SELECT regexp_substr(:P_LoggedInUserRoles, '(.*?)(,|$)', 1, LEVEL, null, 1) NAME, LEVEL LVL
FROM DUAL
CONNECT BY LEVEL <= regexp_count(:P_LoggedInUserRoles, ',') + 1)
ORDER BY LVL)
Я бесстыдно украл регулярное выражениеиз этого вопроса: Oracle - разделенная запятая строка с разделителями (строка содержит пробелы и последовательные запятые) , так что вы можете пойти дальше и получить ответ там.
Теперь недостатком, конечно, является то, чтомы будем делать этот CONNECT BY
трюк все время, даже если мы получим одно имя, но это тема для другого времени.