PL / SQLでこれを行う場合は、おそらくを使用する必要がありますMULTISET INTERSECT
。
SQLを使用するよりも簡単で、数桁高速です。
通常、SQLを使用する方がはるかに簡単で高速です。ただし、この場合、すでにPL / SQLを使用しているため、逆のことが当てはまります。可能な場合は、それらを切り替えないようにします。
--SQL Method: 8.5, 8.455, 8.502 seconds
--PL/SQL Method: 0.015, 0.016, 0.016 seconds
declare
v_cnt number;
v_a t_a := t_a('a','b','c');
v_b t_a := t_a('a','b');
v_c t_a;
begin
for i in 1 .. 100000 loop
--SQL method
/*
select count(*) into v_cnt
from
(
select * from table(v_A)
intersect
select * from table(v_B)
);
*/
--PL/SQL method
v_c := v_a multiset intersect v_b;
v_cnt := v_c.count;
end loop;
dbms_output.put_line(v_cnt);
end;
/