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

Oracle SQL:Memahami perilaku SYS_GUID() saat hadir dalam tampilan sebaris?

Dokumentasi memberikan alasan mengapa Anda mungkin melihat perbedaan (penekanan milik saya):

Perhatian:

Karena SQL adalah bahasa deklaratif, bukan bahasa imperatif (atau prosedural), Anda tidak dapat mengetahui berapa kali fungsi yang dipanggil oleh pernyataan SQL akan berjalan —bahkan jika fungsi ditulis dalam PL/SQL, bahasa imperatif. Jika aplikasi Anda mengharuskan suatu fungsi dijalankan beberapa kali, jangan panggil fungsi itu dari pernyataan SQL. Gunakan kursor sebagai gantinya.

Misalnya, jika aplikasi Anda mengharuskan suatu fungsi dipanggil untuk setiap baris yang dipilih, maka buka kursor, pilih baris dari kursor, dan panggil fungsi untuk setiap baris. Teknik ini menjamin bahwa jumlah panggilan ke fungsi adalah jumlah baris yang diambil dari kursor.

Pada dasarnya, Oracle tidak menentukan berapa kali suatu fungsi akan dipanggil di dalam pernyataan sql:mungkin tergantung pada rilis, lingkungan, jalur akses di antara faktor-faktor lainnya.

Namun, ada cara untuk membatasi penulisan ulang kueri seperti yang dijelaskan dalam bab Penguraian Subkueri Bersarang:

Subquery menghapus sarang dan menggabungkan badan subkueri ke dalam isi pernyataan yang memuatnya, memungkinkan pengoptimal untuk mempertimbangkannya bersama-sama saat mengevaluasi jalur akses dan gabungan. Pengoptimal dapat menghapus sarang sebagian besar subkueri, dengan beberapa pengecualian . Pengecualian tersebut mencakup subkueri hierarkis dan subkueri yang berisi kolom semu ROWNUM, salah satu operator yang ditetapkan, fungsi agregat bersarang, atau referensi berkorelasi ke blok kueri yang bukan merupakan blok kueri luar langsung dari subkueri.

Seperti yang dijelaskan di atas, Anda dapat menggunakan ROWNUM pseudo-column untuk mencegah Oracle menghapus subquery:

SQL> WITH data AS (SELECT SYS_GUID() uuid FROM DUAL WHERE ROWNUM >= 1)
  2  SELECT uuid, uuid FROM data;

UUID                             UUID
-------------------------------- --------------------------------
1ADF387E847F472494A869B033C2661A 1ADF387E847F472494A869B033C2661A


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi NLS_CHARSET_NAME() di Oracle

  2. Pengikatan Parameter OracleCommand SQL

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

  4. Oracle.DataAccess tidak tersedia untuk seleksi di Visual Studio 2013

  5. apakah ada cara untuk mencatat semua pernyataan sql yang gagal di Oracle 10g