Как реализовать операцию разности коллекций, где значения множеств rowid?
Как получить набор значений из первого множества, которых нет во втором?
Первое множество : l_id_tab
Второе множество : RESOLUTION_T
Ошибка:
PLS-00306: ошибочно число или типы аргументов при обращении к 'MULTISET_EXCEPT_ALL'
declare
TYPE RESOLUTION_COLL IS TABLE OF rowid;
RESOLUTION_T RESOLUTION_COLL:=RESOLUTION_COLL();
TYPE t_id_tab IS TABLE OF rowid;
l_id_tab t_id_tab:=t_id_tab();
TYPE nested_typ IS TABLE OF rowid;
answer nested_typ;
begin
select rowid
BULK COLLECT INTO l_id_tab
from MONITORING;
select s.rowid
BULK COLLECT INTO RESOLUTION_T
from RESEARCH_METRICS_NONAUD_pr ss
join RESEARCH_MEDIA_SOURCE source_dict on source_dict.id=ss.media_id
join RESEARCH_MS_CLIP_DICT cd on cd.media_id=ss.media_id and cd.clip_id=ss.CLIP_ID
join RESEARCH_MS_CLIP_TYPE ct on ct.id=cd.clip_type and ct.media_id=cd.media_id
join research_period pers on pers.prid=ss.period
join MONITORING s on s.action_date=pers.start_date
left join DE_MART.UNICOMPET_MS_CLIP_ATTR_DICT atd on atd.clip_id=cd.clip_id and
atd.media_id=cd.media_id and atd.BUSINESS_CATEGORY_ID=21
group by s.rowid;
answer := l_id_tab MULTISET EXCEPT RESOLUTION_T;
for iter in answer.first .. answer.last
loop
dbms_output.put_line(answer(iter));
end loop;
end;
PS похожая ошибка была с методом exists коллекции.
Ответы (1 шт):
Все перечисленные в вопросе коллекции: RESOLUTION_COLL, t_id_tab, nested_typ, вроде выглядят одинаково, ведь они содержат элементы с одним и тем же типом данных.
Но это не так, PL/SQL язык строгой типизации, эти коллекции разного типа, их нельзя, ни сравнивать, ни присваивать им результат выражения с коллекциями другого типа.
В ошибке об этом и говорится:
declare
type ntt1 is table of rowid;
type ntt2 is table of rowid;
type ntt3 is table of rowid;
nt1 ntt1 := ntt1 ();
nt2 ntt2 := ntt2 ();
res ntt3;
begin
res := nt1 multiset except nt2;
end;
/
ORA-06550: line 9, column 12:
PLS-00306: wrong number or types of arguments in call to 'MULTISET_EXCEPT_ALL'
Попробуйте воспользоваться только одним типом, и всё заработает.
Например, так ожидаю одно значение 5 (на db<>fiddle):
declare
type ntt is table of rowid;
nt1 ntt := ntt ('1','3','5');
nt2 ntt := ntt ('1','2','3');
res ntt;
begin
res := nt1 multiset except nt2;
dbms_output.put_line ('res.count='||res.count||' res(1)='||res(1));
end;
/
res.count=1 res(1)=5