【问题标题】:Connect By clause works on 11g but not on Oracle 8i : "ORA-01436: CONNECT BY loop in user data"Connect By 子句适用于 11g,但不适用于 Oracle 8i:“ORA-01436:用户数据中的 CONNECT BY 循环”
【发布时间】:2019-03-25 20:46:54
【问题描述】:

我从这个问题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 loop in user data

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

注意:我知道 8i 已经过时了。我无法控制。

【问题讨论】:

    标签: sql oracle connect-by oracle8i


    【解决方案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/

    【讨论】:

    • 我知道存在其他行生成技术。但是,这并不能回答问题。
    • 好的,没问题。我希望其中至少有一个能满足您(和 8i)的需求。
    • 为了将来参考和帮助他人,这是我找到的关于行生成器主题的最佳文章/脚本集合:“ROW GENERATOR - 生成系列的方法”,livesql.oracle.com/apex/livesql/file/…
    • 我的偏好是基于上述 Oracle 参考的“分层查询方法”。它应该适用于 8i。我需要发现和理解该特定版本的一些复杂之处才能使其发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2018-03-31
    相关资源
    最近更新 更多