За PL/SQL Oracle гарантира, че ще използва оценка на късо съединение:
Когато използвате nextval
в SQL код имаме различна ситуация.
Преди всичко трябва да имаме предвид, че currval
и nextval
са псевдоколони:
От:3 псевдоколони .
Въпросът сега е:защо Oracle оценява nextval
? или Посочено ли е някъде това поведение?
От:Псевдоколони на последователността
Вашият случай очевидно е "1. Инструкция SELECT от най-високо ниво", но това не означава, че логиката на късо съединение не е налице, а само че nextval
винаги се оценява.
Ако се интересувате от логиката на късо съединение, тогава е по-добре да премахнете nextval
от уравнението.
Заявка като тази не оценява подзаявката:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Но ако се опитате да направите нещо подобно с coalesce
или case
ще видим, че Oracle Optimizer решава да изпълни подзаявките:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Създадох анотирани тестове в тази демонстрация в SQLFiddle за да покаже това.
Изглежда, че Oracle прилага логиката на късо съединение само ако е с условие ИЛИ, но с coalesce
и case
трябва да оцени всички клонове.
Мисля, че първите ви тестове в PL/SQL показват, че coalsce
и case
използвайте логика на късо съединение в PL/SQL, както заявява Oracle. Вашият втори тест, включително последователността в SQL изразите, показва, че в този случай nextval
се оценява така или иначе, дори ако резултатът не се използва и Oracle също документира това.
Сглобяването на двете неща изглежда малко странно, защото coalesce
и case
поведението изглежда наистина непоследователно и аз също, но също така трябва да имаме предвид, че прилагането на тази логика зависи от изпълнението (ето моят източник
)