Я делаю простой пример рекурсивного запроса с оракулом sql.Я вычисляю будущие месяцы в формате MON-YY.Мне удалось получить, казалось бы, правильный запрос, но я не понимаю условие разрыва с запросом WITH.
Я пытаюсь разбить значение года (например, остановка при достижении 2020 года), но этообнаруживает цикл при этом.Если я разбиваю значение месяца (например, декабрь), оно работает.
Вот мой запрос с перерывом на месяц:
with
prochains_mois(mois, annee) as (
select 'sep' as mois, 19 as annee
from dual
union all
select
case mois
when 'jan' then 'fev'
when 'fev' then 'mar'
when 'mar' then 'avr'
when 'avr' then 'mai'
when 'mai' then 'jun'
when 'jun' then 'jui'
when 'jui' then 'aou'
when 'aou' then 'sep'
when 'sep' then 'oct'
when 'oct' then 'nov'
when 'nov' then 'dec'
when 'dec' then 'jan'
end,
case mois
when 'dec' then annee + 1
else annee
end
from prochains_mois r
where mois <> 'dec'
)
select * from prochains_mois;
Если я это сделаю, он вернёт согласованный результат.
MOI ANNEE
--- ----------
sep 19
oct 19
nov 19
dec 19
Теперь, если я попытаюсь разбить рекурсивный запрос на год, скажем, 2020, поэтому я изменю условие where в предложении with на:
where annee < 20
Тогда я получу:
ORA-32044: cycle detected while executing recursive WITH query
Я попытался порвать с более поздним месяцем, чтобы проверить, правильно ли работает добавление моего года, похоже, это так.Если я сломаюсь в марте, я получу январь и февраль правильно:
where mois <> 'mar'
дает
MOI ANNEE
--- ----------
sep 19
oct 19
nov 19
dec 19
jan 20
fev 20
mar 20