Если вы используете Oracle 10g или выше, есть несколько простых способов решить эту проблему.
Можно использовать существующий код, а в цикле OPERATORS оператор MEMBER OF проверить, существует ли он уже в коллекции.
Однако, более простой подход - определить три коллекции. Используйте массовый сбор, чтобы заполнить две коллекции полным набором записей из каждого запроса, а затем используйте третью коллекцию, чтобы отфильтровать любые дубликаты.
Что-то вроде этого:
declare
type recipients_list is table of recipient;
recs recipients_list := recipients_list();
admins recipients_list := recipients_list();
operators recipients_list := recipients_list();
begin
select firstname, lastname, email
bulk collect into admins
from users
where profile_id = 1;
select firstname, lastname, email
bulk collect into operators
from users
where operator = 1;
recs := admins multiset union distinct operators;
end;
/
«Можно ли иметь несколько союзов?»
Это наверняка возможно. Я не знаю, есть ли максимум, но если он будет, это будет большое число. Я обнаружил, что ограничения в Oracle имеют тенденцию быть щедрыми; если мы столкнемся с ограничениями, возможно, есть лучший способ сделать что угодно.