2010-01-07 20 views
7

Czy ktoś wie, dlaczego funkcja Oracle NVL (i NVL2) zawsze ocenia drugi parametr, nawet jeśli pierwszy parametr nie jest NULL?Dlaczego NVL zawsze ocenia drugi parametr?

prosty 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

powraca 0, ale drukuje również Called. Zostało wywołane

nvl_test, mimo że wynik jest ignorowany, ponieważ pierwszym parametrem nie jest NULL.

Odpowiedz

8

Zawsze tak było, więc Oracle musi zachować to w ten sposób, aby zachować kompatybilność wstecz.

Zamiast tego należy użyć COALESCE, aby uzyskać zwarcie.

+1

Zastrzeżenie: nie powoduje zwarcia w 9i. –

3

w ogóle, że to ma sens, że drugi parametr jest oceniany przed wywołaniem funkcji, ponieważ w ogóle to jak funkcje nazywane są: wszystkie argumenty do funkcji są oceniane i ocenione wartości są wysyłane do funkcji.

Jednak w przypadku bardzo powszechnej funkcji systemowej, takiej jak NVL, uważam, że PL/SQL może zoptymalizować, traktując wywołanie funkcji jako specjalny przypadek. Ale może to jest trudniejsze, niż się wydaje (dla mnie), ponieważ jestem pewien, że ta optymalizacja przydarzyłaby się twórcom oprogramowania Oracle.

Powiązane problemy