【发布时间】:2010-12-28 13:54:44
【问题描述】:
以下语句适用于 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)
)
看起来 Oracle 11g 忽略了 where decode 甚至是子查询中的 where 子句。
该查询应该像在 Oracle 9i 上一样返回两行,但在 Oracle 11g EE 11.2.0.1.0 - 64 位上返回 ORA-01476: divisor is equal to zero。
有人可以帮忙吗?谢谢!
【问题讨论】:
-
对我来说在
10g和11g上都有效。 -
这么多来自 DUAL 的 SELECT... 你最好写一个存储过程之类的。
-
请在
9i和11g中发布查询的执行计划。 -
@Vitaly:我相信这只是一个重现错误的测试用例。
-
按大小写替换解码...当...结束。