Проблема: БД Oracle использует некоторую оптимизацию и не выполняет компонент WITH
, который не используется в конечном запросе. Так что нет выполнения неиспользованных запросов.
Вопрос:
Можно ли отключить оптимизацию Oracle и выполнить все запросы в предложении WITH
? Есть ли какие-то особые намеки на это?
Подробности:
Я хочу использовать Oracle Database Context механизм внутри моих запросов, выполняемых из Java-программы.
Я решил использовать Database session-based application context initialized locally
тип контекста.
Поэтому в одном сеансе базы данных я могу установить некоторые переменные контекста, и только в этом сеансе он будет виден.
У меня есть идея выполнить функцию (которая устанавливает необходимые переменные контекста) непосредственно перед реальным запросом SQL. Таким образом, лучшее место будет связывать обе вещи вместе. Это был бы лучший вариант для меня.
Минимальный пример:
Если мы выполним (или посмотрим на план объяснения) этот запрос, мы заметим, что подзапрос EXEC_CTX
НЕ выполнен.
Только последний запрос из real_table
фактически выполняется Oracle.
Можем ли мы каким-то образом заставить Oracle выполнить их оба (целый WITH
запрос)?
WITH EXEC_CTX AS (
select set_my_ctx(42) from dual
)
SELECT *
FROM real_table rt
WHERE rt.col_x = SYS_CONTEXT('CTX_NAME', 'PARAM_ID')
;
Я использую базу данных Oracle 12c.