Untuk PL/SQL Oracle memastikan bahwa ia akan menggunakan evaluasi hubung singkat:
Dari:2 Dasar-Dasar Bahasa PL/SQL
Saat Anda menggunakan nextval
dalam kode SQL, kami memiliki situasi yang berbeda.
Pertama-tama kita harus ingat bahwa currval
dan nextval
adalah kolom semu:
Dari:3 Pseudocolumns .
Pertanyaannya sekarang adalah:mengapa Oracle mengevaluasi nextval
? atau Apakah perilaku ini dinyatakan di suatu tempat?
Kasing Anda jelas "1. Pernyataan SELECT tingkat atas", tetapi itu tidak berarti bahwa logika hubung singkat tidak ada, tetapi hanya nextval
itu selalu dievaluasi.
Jika Anda tertarik dengan logika hubung singkat, maka lebih baik hapus nextval
dari persamaan.
Kueri seperti ini tidak mengevaluasi subkueri:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Tetapi jika mencoba melakukan sesuatu yang mirip dengan coalesce
atau case
kita akan melihat bahwa Oracle Optimizer memutuskan untuk mengeksekusi subquery:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Saya membuat tes beranotasi di demo ini di SQLFiddle untuk menunjukkan ini.
Sepertinya Oracle menerapkan logika hubung singkat hanya jika dengan kondisi OR, tetapi dengan coalesce
dan case
ia harus mengevaluasi semua cabang.
Saya pikir tes pertama Anda di PL/SQL menunjukkan bahwa coalsce
dan case
gunakan logika hubung singkat di PL/SQL, seperti yang dinyatakan Oracle. Pengujian kedua Anda, termasuk urutan dalam pernyataan SQL, menunjukkan bahwa dalam kasus tersebut nextval
tetap dievaluasi, meskipun hasilnya tidak digunakan, dan Oracle juga mendokumentasikannya.
Menyatukan kedua hal itu terlihat agak aneh, karena coalesce
dan case
perilaku saya juga tampaknya sangat tidak konsisten, tetapi kami juga harus ingat bahwa implementasi logika itu bergantung pada implementasi (di sini sumber saya
)