【问题标题】:Oracle DECODE statement failing on RHEL but works on HPUXOracle DECODE 语句在 RHEL 上失败,但在 HPUX 上有效
【发布时间】:2016-05-01 10:03:06
【问题描述】:

我已经隔离了一个非常具体的代码片段,它可以在我们的 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'))

【问题讨论】:

  • 确定不是解码问题?您确定 fnd_date.canonical_to_date 函数在两个系统中返回相同的值吗?
  • “失败”是什么意思 - 没有返回您期望的数据(在这种情况下可能是数据问题)?给你一个错误?该函数是否有效,对于两种环境都完全相同,并且您确定这不会出错(这可能在查询中静默发生)-如果您在 PL/SQL 上下文中为表中的每一行调用该函数报告任何错误?特定于环境的行为/错误是可能的,但不太可能。
  • 这是一个将所有数据存储为字符串的实体-属性-值模型吗?在极少数情况下,DECODECASE 可以无序或不短路地评估表达式。查询不应假定在调用函数之前检查了OVERTIMEVACCOMP 条件。
  • 感谢各位大侠的反馈,我们将代码改写如下:
  • 编辑 cmets 真的只有 5 分钟吗?无论如何...感谢您的反馈,我们将代码改写为“AND DECODE (pet.attribute1,'OVERTIMEVACCOMP', fnd_date.canonical_to_date(prv2.result_value),TO_DATE ('01/01/0001', ' DD/MM/YYYY'))

标签: oracle select decode


【解决方案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 的内联视图。两者都不愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多