Für PL/SQL versichert Oracle, dass es die Kurzschlussauswertung verwenden wird:
Aus:2 Grundlagen der PL/SQL-Sprache
Wenn Sie nextval
verwenden im SQL-Code haben wir eine andere Situation.
Zuallererst müssen wir uns diesen currval
merken und nextval
sind Pseudospalten:
Aus:3 Pseudospalten .
Die Frage ist nun:warum wertet Oracle nextval
aus ? oder Ist dieses Verhalten irgendwo angegeben?
Ihr Fall ist eindeutig "1. Eine SELECT-Anweisung der obersten Ebene", aber das bedeutet nicht, dass die Kurzschlusslogik nicht vorhanden ist, sondern nur das nextval
wird immer ausgewertet.
Wenn Sie an der Kurzschlusslogik interessiert sind, entfernen Sie besser das nextval
aus der Gleichung.
Eine Abfrage wie diese wertet die Unterabfrage nicht aus:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Aber wenn Sie versuchen, etwas Ähnliches mit coalesce
zu tun oder case
wir werden sehen, dass der Oracle Optimizer entscheidet, die Unterabfragen auszuführen:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Ich habe kommentierte Tests in dieser Demo in SQLFiddle erstellt um dies zu zeigen.
Es sieht so aus, als ob Oracle die Kurzschlusslogik nur dann anwendet, wenn die OR-Bedingung, aber coalesce
vorhanden ist und case
es muss alle Zweige auswerten.
Ich denke, Ihre ersten Tests in PL/SQL zeigen, dass coalsce
und case
verwenden eine Kurzschlusslogik in PL/SQL, wie Oracle angibt. Ihr zweiter Test, einschließlich der Sequenz in SQL-Anweisungen, zeigt, dass in diesem Fall nextval
wird trotzdem ausgewertet, auch wenn das Ergebnis nicht verwendet wird, und Oracle dokumentiert das auch.
Das Zusammenfügen der beiden Dinge sieht etwas seltsam aus, weil coalesce
und case
Verhalten scheint mir auch sehr inkonsistent zu sein, aber wir müssen auch bedenken, dass die Implementierung dieser Logik implementierungsabhängig ist (hier meine Quelle
)