我已经隔离了一个非常特定的代码段,该代码段适用于我们的HP-UX Oracle 11.2环境,但在RHEL 7.1 Oracle 11.2环境中失败了。关于为什么会发生这种情况的任何指示?
其他所有内容(PSU级别除外)通常都是相同的。
TIA
AND v_effective_date
BETWEEN DECODE
(pet.attribute1,'OVERTIMEVACCOMP',
fnd_date.canonical_to_date(prv2.result_value),
TO_DATE ('01/01/0001', 'DD/MM/YYYY'))
AND DECODE
(pet.attribute1,'OVERTIMEVACCOMP',
fnd_date.canonical_to_date(prv3.result_value),
TO_DATE ('01/01/0001', 'DD/MM/YYYY'))
答案 0 :(得分:1)
大多数实体 - 属性 - 值模型都有一个致命的缺陷:字符串类型的数据。
如果所有值都存储为字符串,那么在将这些值转换为类型之前发生属性过滤至关重要。但Oracle的查询优化使得几乎不可能在SQL中强制执行特定的操作顺序。
This question有一个简单的例子,说明这种无序执行有多奇怪。这有点极端,但希望能帮助你证明不可预测的操作顺序。您不会认为此查询可能会失败,但确实如此:
WITH data AS (SELECT 1 AS cond, 10 AS num, 0 AS div FROM DUAL)
SELECT
CASE WHEN cond = 2 THEN (CASE WHEN MAX(div) = 0 THEN 0 ELSE SUM(num / div) END)
ELSE -1
END AS result
FROM data
GROUP BY cond;
ORA-01476: divisor is equal to zero
我们并不确切知道Oracle如何实施订单。也许它在RHEL和HPUX之间有所不同,也许它在星期四有所不同。不幸的是,即使使用LEAST
也可能不是防弹的。该功能可以逻辑按顺序运行,并且通常使用短路评估,但不能保证始终按该顺序运行。您可能刚刚在一个99.9%的解决方案之间切换到另一个99.9%的解决方案。
这只有两个万无一失的解决方案,在我的回答here中有更详细的讨论。更改表以针对不同类型使用不同的列,或者为每个查询添加带ROWNUM
的内联视图。这两者都不令人愉快。