Oracle DECODE语句在RHEL上失败但在HPUX上运行

时间:2016-01-25 07:00:49

标签: oracle select decode

我已经隔离了一个非常特定的代码段,该代码段适用于我们的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'))

1 个答案:

答案 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的内联视图。这两者都不令人愉快。