Мы можем использовать коллекции для хранения значений в соответствии с вашими целями, но они должны быть объявлены как типы SQL:
create type list_record is table of varchar2(128)
/
Это потому, что мы не можем использовать типы PL / SQL в инструкциях SQL. Увы, это означает, что мы не можем использовать %TYPE
или %ROWTYPE
, потому что они являются ключевыми словами PL / SQL.
Ваша процедура будет выглядеть так:
DECLARE
c_LIST list_record;
BEGIN
SELECT my_field
BULK COLLECT INTO c_LIST
FROM my_table
WHERE some_field = some_value;
-- try to check against list
SELECT * FROM some_other_table
WHERE some_critical_field IN ( select * from table (c_LIST);
END;
"Я вижу, что вам все еще приходилось выполнять
Оператор SELECT для заполнения списка
для предложения IN. "
Если значения находятся в таблице, нет другого способа получить их в переменную:)
"Я думаю, что есть
значительный прирост производительности при использовании
это через прямое полусоединение "
Не обязательно. Если вы используете значения только один раз, то подзапрос, безусловно, является лучшим подходом. Но поскольку вы хотите использовать одни и те же значения в ряде дискретных запросов, заполнение коллекции является более эффективным подходом.
В версии 11g Enterprise Edition мы можем использовать кэширование набора результатов . Это гораздо лучшее решение, но оно подходит не для всех таблиц.