Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die CASE- und COALESCE-Kurzschlussauswertung funktioniert mit Sequenzen in PL/SQL, aber nicht in SQL

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?

Aus:Sequenz Pseudospalten

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 )