For PL/SQL sikrer Oracle, at det vil bruge kortslutningsevaluering:
Fra:2 PL/SQL Language Fundamentals
Når du bruger nextval
i SQL-kode har vi en anden situation.
Først og fremmest skal vi huske på currval
og nextval
er pseudokolonner:
Fra:3 Pseudocolumns .
Spørgsmålet er nu:hvorfor Oracle evaluerer nextval
? eller er denne adfærd angivet et sted?
Din sag er klart "1. En SELECT-sætning på topniveau", men det betyder ikke, at kortslutningslogikken ikke er på plads, men kun den nextval
evalueres altid.
Hvis du er interesseret i kortslutningslogikken, er det bedre at fjerne nextval
fra ligningen.
En forespørgsel som denne evaluerer ikke underforespørgslen:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Men hvis du prøver at gøre noget lignende med coalesce
eller case
vi vil se, at Oracle Optimizer beslutter at udføre underforespørgslerne:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Jeg oprettede kommenterede tests i denne demo i SQLFiddle for at vise dette.
Det ser ud til, at Oracle kun anvender kortslutningslogikken, hvis med OR-tilstand, men med coalesce
og case
den skal evaluere alle grene.
Jeg tror, at dine første test i PL/SQL viser, at coalsce
og case
bruge en kortslutningslogik i PL/SQL, som Oracle oplyser. Din anden test, inklusive sekvensen i SQL-sætninger, viser, at i så fald er nextval
vurderes alligevel, selvom resultatet ikke bliver brugt, og det dokumenterer Oracle også.
At sammensætte de to ting ser lidt mærkeligt ud, fordi coalsce
og case
adfærd synes også at være virkelig inkonsekvent for mig, men vi skal også huske på, at implementeringen af denne logik er implementeringsafhængig (her er min kilde
)