Pro PL/SQL Oracle zajišťuje, že bude používat vyhodnocení zkratů:
Když použijete nextval
v kódu SQL máme jinou situaci.
Nejprve musíme mít na paměti, že currval
a nextval
jsou pseudosloupce:
Od:3 pseudosloupce .
Otázka nyní zní:proč Oracle hodnotí nextval
? nebo Je toto chování někde uvedeno?
Váš případ je jasně "1. Příkaz SELECT nejvyšší úrovně", ale to neznamená, že není na místě logika zkratu, ale pouze nextval
se vždy vyhodnocuje.
Pokud vás zajímá logika zkratu, pak je lepší odstranit nextval
z rovnice.
Dotaz, jako je tento, nevyhodnocuje poddotaz:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Ale pokud se pokusíte udělat něco podobného s coalesce
nebo case
uvidíme, že se Oracle Optimizer rozhodne provést dílčí dotazy:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Vytvořil jsem komentované testy v této ukázce v SQLFiddle to ukázat.
Vypadá to, že Oracle aplikuje logiku zkratu pouze v případě, že s podmínkou OR, ale s coalesce
a case
musí vyhodnotit všechny větve.
Myslím, že vaše první testy v PL/SQL ukazují, že coalsce
a case
použijte logiku zkratu v PL/SQL, jak uvádí Oracle. Váš druhý test, včetně sekvence v příkazech SQL, ukazuje, že v tomto případě nextval
se stejně vyhodnotí, i když se výsledek nepoužije, a Oracle to také dokumentuje.
Spojení těchto dvou věcí vypadá trochu divně, protože coalsce
a case
chování se mi také zdá být opravdu nekonzistentní, ale musíme mít také na paměti, že implementace této logiky je závislá na implementaci (zde můj zdroj
)