Dla PL/SQL Oracle zapewnia, że użyje oceny zwarcia:
Kiedy używasz nextval
w kodzie SQL mamy inną sytuację.
Przede wszystkim musimy pamiętać, że currval
i nextval
są pseudokolumny:
Od:3 pseudokolumny .
Teraz pytanie brzmi:dlaczego Oracle ocenia nextval
? lub Czy to zachowanie jest gdzieś powiedziane?
Twoja sprawa jest wyraźnie „1. Instrukcja SELECT najwyższego poziomu”, ale nie oznacza to, że nie ma logiki zwarcia, ale tylko, że nextval
jest zawsze oceniany.
Jeśli interesuje Cię logika zwarcia, lepiej usunąć nextval
z równania.
Zapytanie takie jak to nie ocenia podzapytania:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Ale jeśli spróbuj zrobić coś podobnego za pomocą coalesce
lub case
zobaczymy, że Optymalizator Oracle zdecyduje się na wykonanie podzapytań:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Stworzyłem testy z adnotacjami w tym demo w SQLFiddle aby to pokazać.
Wygląda na to, że Oracle stosuje logikę zwarcia tylko w przypadku warunku OR, ale z coalesce
i case
musi ocenić wszystkie gałęzie.
Myślę, że twoje pierwsze testy w PL/SQL pokazują, że coalsce
i case
używaj logiki zwarcia w PL/SQL, jak twierdzi Oracle. Twój drugi test, w tym sekwencja w instrukcjach SQL, pokazuje, że w takim przypadku nextval
i tak jest oceniany, nawet jeśli wynik nie jest używany, a Oracle również to dokumentuje.
Zestawienie tych dwóch rzeczy wygląda trochę dziwnie, ponieważ coalesce
i case
zachowanie wydaje mi się również bardzo niespójne, ale musimy również pamiętać, że implementacja tej logiki jest zależna od implementacji (tutaj moje źródło
)