子查询适用于9i但不适用于11g

Zsu*_*tam 1 sql oracle oracle11g

以下声明适用于Oracle 9i,但不适用于Oracle 11g

SELECT *
FROM
(
    SELECT 0 scrnfail_rate, '9' zz, 7 hh FROM DUAL
    UNION ALL
    SELECT 0 scrnfail_rate, '9' zz, 7 hh FROM DUAL
)
WHERE zz IS NOT NULL
AND TO_CHAR (hh) NOT IN
(
    SELECT
        DECODE
        (
            scrnfail_rate, 0, -1,
                ROUND (LEVEL * 1 / (scrnfail_rate / 100)) 
                - 
                ROUND (1 / (2 * (scrnfail_rate / 100)))
        ) AS nno
    FROM   DUAL
    WHERE   NVL (scrnfail_rate, 0) > 0
    CONNECT BY   LEVEL <= ROUND(9 * scrnfail_rate / 100)
)
Run Code Online (Sandbox Code Playgroud)

看起来Oracle 11g忽略了子查询中解码甚至where子句的位置.此查询应返回两行,就像在Oracle 9i上一样,但结果ORA-01476: divisor is equal to zero在Oracle 11g EE 11.2.0.1.0 - 64位上.


有人可以帮忙吗?谢谢!

Zsu*_*tam 5

我发现Oracle 11.2.0.1.0中存在导致此问题的错误.

alter session set optimizer_features_enable='11.1.0.7'
Run Code Online (Sandbox Code Playgroud)

改变优化器功能解决了这个问题.