sql >> Database teknologi >  >> RDS >> Oracle

CASE og COALESCE kortslutningsevaluering fungerer med sekvenser i PL/SQL, men ikke i SQL

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?

Fra:Sekvens-pseudokolonner

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 )



  1. Skal jeg håndtere et GraphQL ID som en streng på klienten?

  2. Sådan ÆNDRES Tabelværdiparameteren

  3. Sådan beregnes en absolut værdi i SQL

  4. Sådan fjerner du dublet med en bestemt tilstand