Как реализовать операцию разности коллекций, где значения множеств 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 шт):

Автор решения: 0xdb

Все перечисленные в вопросе коллекции: 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
→ Ссылка