代码之家  ›  专栏  ›  技术社区  ›  Peter Lang

为什么NVL总是评估第二个参数

  •  8
  • Peter Lang  · 技术社区  · 15 年前

    有人知道为什么甲骨文 NVL (和) NVL2 )函数始终计算第二个参数,即使第一个参数不是 NULL ?

    简单测试:

    CREATE FUNCTION nvl_test RETURN NUMBER AS
    BEGIN
      dbms_output.put_line('Called');
      RETURN 1;
    END nvl_test;
    

    SELECT NVL( 0, nvl_test ) FROM dual

    收益率 0 还有印刷品 Called .

    nvl_test 已调用,即使结果被忽略,因为第一个参数不是 无效的 .

    4 回复  |  直到 15 年前
        1
  •  8
  •   Jeffrey Kemp    15 年前

    一直都是这样,所以Oracle必须保持这种方式才能保持向后兼容。

    使用 COALESCE 而是得到短路行为。

        2
  •  5
  •   Doug Porter    15 年前

    这是汤姆·基特确认的帖子 decode case 短路但不短路 nvl 但他没有给出理由或文件来说明原因。只是说它是:

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:926029357278#14932880517348

    所以在你的情况下,你应该使用 译码 案例 而不是 NVL 如果在查询中调用昂贵的函数。

        3
  •  3
  •   Tony Andrews    15 年前

    通常,在调用函数之前对第二个参数进行计算是有意义的,因为通常调用函数的方式是这样的:对函数的所有参数进行计算,并将计算的值发送给函数。

    但是,在一个非常常见的系统函数(如nvl)的情况下,我认为pl/sql可以进行优化,将函数调用视为一种特殊情况。但也许这比听起来更困难(对我来说),因为我相信这种优化会发生在Oracle的开发人员身上。

        4
  •  0
  •   Jonas Lincoln    15 年前

    它们显然没有短路,但在Oracle文档中找不到任何引用。

    查看此讨论: http://forums.oracle.com/forums/thread.jspa?messageID=3478040