Oracle
 sql >> база данни >  >> RDS >> Oracle

CASE и COALESCE оценка на късо съединение работи с последователности в PL/SQL, но не и в SQL

За PL/SQL Oracle гарантира, че ще използва оценка на късо съединение:

От:2 езикови основи на PL/SQL

Когато използвате 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 поведението изглежда наистина непоследователно и аз също, но също така трябва да имаме предвид, че прилагането на тази логика зависи от изпълнението (ето моят източник )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извикам java клас от oracle trigger?

  2. Каква е разликата между varchar и varchar2 в Oracle?

  3. Възможно ли е Oracle sqlldr да приеме TNS запис като квалификатор на екземпляр в Oracle 10 и 11?

  4. Пребройте броя на елементите в разделен със запетая низ в Oracle

  5. Премахнете първите знаци от низ в Oracle Server