Connect By子句适用于11g,但不适用于Oracle 8i:“ ORA-01436:用户数据中的CONNECT BY循环”

时间:2019-03-25 20:46:54

标签: sql oracle connect-by oracle8i

我从这个问题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)实例之一以及Oracle自己的LiveSQL(19c,v19.2.0.0.0)上都可以正常工作。

但是,它不能在需要运行的实例8i(v8.1.7.4.0)上运行。 我收到 ORA-01436:用户数据中的CONNECT BY循环

乍看之下,似乎8i在该代码中看到了一个无限循环,但在11g及更高版本中却看不到。为什么?

注意:我知道8i很旧。我对此无能为力。

1 个答案:

答案 0 :(得分: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/