Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Ocena zwarcia CASE i COALESCE działa z sekwencjami w PL/SQL, ale nie w SQL

Dla PL/SQL Oracle zapewnia, że ​​użyje oceny zwarcia:

Od:2 podstawy języka PL/SQL

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?

Od:Pseudokolumny sekwencji

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 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Uzyskaj zapytanie, które zawsze zwraca dokładnie jeden wiersz, nawet jeśli nie ma danych do znalezienia

  2. Utwórz operator zdefiniowany przez użytkownika z lewą/prawą stroną

  3. Usuń wiersz podrzędny i nadrzędny za pomocą jednego skryptu SQL

  4. Funkcja NANVL() w Oracle

  5. PHP, IIS, Oracle (OCI) nie działają