Альтернативным подходом было бы передать массив в базу данных и использовать функцию TABLE()
в предложении IN. Это, вероятно, будет работать лучше, чем временная таблица. Это, безусловно, будет более эффективным, чем выполнение нескольких запросов. Но вам нужно будет контролировать использование памяти PGA, если у вас есть большое количество сессий, выполняющих эту работу. Кроме того, я не уверен, насколько легко будет подключить это в Hibernate.
Примечание: TABLE()
функции работают в движке SQL, поэтому им нужно, чтобы мы объявили тип SQL.
create or replace type tags_nt as table of varchar2(10);
/
В следующем примере массив заполняется парой тысяч случайных тегов. Затем он использует массив в предложении IN запроса.
declare
search_tags tags_nt;
n pls_integer;
begin
select name
bulk collect into search_tags
from ( select name
from temp_tags
order by dbms_random.value )
where rownum <= 2000;
select count(*)
into n
from big_table
where name in ( select * from table (search_tags) );
dbms_output.put_line('tags match '||n||' rows!');
end;
/