Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Evaluasi hubungan pendek CASE dan COALESCE bekerja dengan urutan dalam PL/SQL tetapi tidak dalam SQL

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?

Dari:Sequence Pseudocolumns

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 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan ke Oracle 12c Database dari Pentaho Data Integration (Kettle) Community Edition

  2. Pemeriksaan kondisi Oracle

  3. distribusi pembayaran oracle sql query

  4. Gunakan gv$session untuk mengetahui apakah kueri menggantung

  5. Cara melarikan diri <,>, dan &karakter ke entitas html di Oracle PL/SQL