Предложение Connect By работает в 11g, но не в Oracle 8i: ORA-01436: цикл CONNECT BY в пользовательских данных

Я нашел код для генератора строк из этого вопроса Create View with 365 days

CREATE VIEW year_days (the_day) AS
SELECT TRUNC(SYSDATE, 'YYYY') + (LEVEL-1) AS the_day
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'),11)), 'DDD'))
/
SELECT * FROM year_days

Поскольку у меня нет привилегий CREATE, я изменил его на форму встроенного запроса:

SELECT
    year_days.* 
FROM
    (
    SELECT TRUNC(SYSDATE, 'YYYY') + (LEVEL-1) AS the_day
    FROM DUAL
    CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'),11)), 'DDD'))
    ) year_days

Приведенный выше код встроенного запроса отлично работает на одном из наших экземпляров Oracle 11g R2 (v11.2.0.3.0), а также на собственном LiveSQL Oracle (19c, v19.2.0.0.0).

Однако он не работает на экземпляре, на котором он должен работать, а именно на 8i (v8.1.7.4.0). Я получаю сообщение ORA-01436: CONNECT BY loop в пользовательских данных.

На первый взгляд кажется, что 8i видит в этом коде бесконечный цикл, но не 11g и выше. Почему ?

Примечание: я знаю, что 8i устарела. Я не могу это контролировать.


person mach128x    schedule 25.03.2019    source источник


Ответы (1)


Если это не обязательно должен быть запрос connect by, как насчет чего-нибудь попроще, например

select rownum
from all_objects
where rownum <= to_number(to_char(last_day(add_months(trunc(sysdate, 'YYYY'),11)), 'DDD'));

или, возможно,

select rownum 
from (select null from dual
      group by cube (1, 2, 3, 4, 5, 6, 7, 8, 9, 20)
     )
where rownum <= to_number(to_char(last_day(add_months(trunc(sysdate, 'YYYY'),11)), 'DDD'));

которые оба должны работать на Oracle 8i.

Другие хорошие методы генерации строк на форуме OraFAQ, здесь: http://www.orafaq.com/forum/t/95011/102589/

person Littlefoot    schedule 25.03.2019
comment
Я знаю, что существуют и другие методы генерации строк. Однако это не отвечает на вопрос. - person mach128x; 27.03.2019
comment
Хорошо, нет проблем. Я надеюсь, что хотя бы один из них удовлетворит ваши (и 8i) потребности. - person Littlefoot; 27.03.2019
comment
Для дальнейшего использования и помощи другим, это лучшая коллекция статей/скриптов, которую я нашел по теме генераторов строк: ROW GENERATOR - Methods to Generate Series, livesql.oracle.com/apex/livesql/file/ - person mach128x; 27.03.2019
comment
Я отдал предпочтение «методу иерархических запросов», основанному на приведенной выше ссылке от Oracle. На 8i должно работать. В этой конкретной версии должны быть некоторые сложности, которые мне нужно обнаружить и понять, чтобы заставить ее работать. - person mach128x; 27.03.2019