Вы можете определить свои переменные во вложенном CTE:
select * from (
-- CTE to define variables (sort of)
with cte (some_date) as (
select date '2018-12-31' from dual
)
-- your real query that joins to the CTE and used cte.some_date
select d.*
from cte
cross join dual d
where sysdate < cte.some_date
);
или, проще, во встроенном представлении:
select d.*
from (
select date '2018-12-31' as some_date from dual
) t
cross join dual d
where sysdate < t.some_date;
В любом случае, cte
или t
это таблица из одной строки, поэтому перекрестное соединение делает ее столбцы видимыми, но не умножает количество строк в конечном наборе результатов (точнее, только умножает его на 1, что одно и то же).
Вопрос о том, принимает ли ваш «клиент» ту или иную форму, это другой вопрос ...