2010-01-07 5 views
7

Weiß jemand, warum Oracle NVL (und NVL2) -Funktion immer den zweiten Parameter auswerten, auch wenn der erste Parameter nicht NULL ist?Warum NVL immer 2. Parameter auswerten

Einfacher Test:

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

kehrt 0, sondern druckt auch Called.

nvl_test wurde aufgerufen, obwohl das Ergebnis ignoriert wird, da der erste Parameter nicht NULL ist.

Antwort

8

Es war schon immer so, also muss Oracle es so halten, dass es abwärtskompatibel bleibt.

Verwenden Sie stattdessen COALESCE, um das Kurzschlussverhalten zu erhalten.

+1

Vorbehalt: Es schließt nicht in 9i. –

3

Im Allgemeinen wäre es sinnvoll, dass der zweite Parameter vor dem Aufruf der Funktion ausgewertet wird, weil in der Regel, die ist, wie Funktionen aufgerufen werden: alle Argumente an die Funktion ausgewertet und Die ausgewerteten Werte werden an die Funktion gesendet.

Allerdings hätte ich im Falle einer sehr verbreiteten Systemfunktion wie NVL gedacht, dass PL/SQL optimieren könnte, was den Funktionsaufruf als Sonderfall behandelt. Aber vielleicht ist das schwieriger, als es sich für mich anhört, denn ich bin mir sicher, dass diese Optimierung den Entwicklern von Oracle eingefallen wäre.