У меня есть вопрос об Oracle PL / SQL.
В процедуре один и тот же встроенный оператор SELECT неоднократно используется с предложениями WHERE в запросах:
...
where start_year in (
SELECT MB_START FROM MEMBERS
)
...
Фактический встроенный оператор SELECTв предложении WHERE процедура более сложна и заменена на «SELECT MB_START FROM MEMBERS», чтобы облегчить понимание моего вопроса.И именно поэтому я задаю вопрос:
Повторение одного и того же подзапроса во многих предложениях WHERE обременительно, затрудняет чтение засоренного кода и является потенциальной тратой ресурсов сервера.Есть ли способ получить то, что возвращает вложенный подзапрос, сохраненный в переменной, например:
DECLARE
start_years <type_for_IN_operator>;
BEGIN
...
select mb_start into start_years from members;
...
WHERE start_year in (start_years)
...
END;
/
Я много искал и не смог выяснить, поддерживает ли Oracle сохранение значений в переменной виспользоваться оператором IN.Если это поддерживается, каков тип данных для type_for_IN_operator?
Ответ на ответы и дополнительный вопрос:
Спасибо всем за ответы на вопрос.
Я спросилвопрос, потому что я заметил, что оператор IN принимает набор значений в различных формах, таких как
- литералы: IN (2015, 2016, 2017)
- столбец, выбранный изtable: IN (выберите mb_start из членов)
- коллекция с помощью инструкции SELECT: in (выберите column_value из таблицы (collection))
, поэтому я подумал, что у них может быть что-то общеетипа типа данных, которые я не знаю.Если существует такой тип данных, код запроса может быть намного проще и проще.
Меня привлекает идея APC, особенно это чистый SQL и виртуальная таблица многоразового использования.Я попытался, но перешел к проблеме.
Первоначально скрипт был:
select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (<that subquery>)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...
Теперь используем виртуальную таблицу и заменим первый оригинальный подзапрос:
with sqf as (
SELECT MB_START FROM MEMBERS
)
select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (select * from sqf)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...
И случилось, что запрос завершился даже немного быстрее, чем исходный код.Тем не менее, когда второйтакже заменяется виртуальной таблицей sqf, запрос выполнялся вечно, хотя и не выдавал ни одной ошибки.Я должен был убить это.Я попробовал еще пару раз, и он вел себя так же.
Любой совет?