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

fungsi pl/sql dipanggil berapa kali?

Ini adalah situasi di mana beberapa eksperimen berguna (ini dilakukan pada 10g). Dengan menggunakan kueri berikut, kita dapat mengetahui bahwa fungsi normal, menggunakan parameter yang sama (dalam hal ini, tidak ada) akan dieksekusi setiap kali dipanggil:

select dbms_random.value() from all_tables

Ini karena Oracle mengasumsikan bahwa suatu fungsi tidak akan mengembalikan nilai yang sama secara konsisten kecuali jika Anda memberi tahu sebaliknya. Kita dapat melakukannya dengan membuat fungsi menggunakan deterministic kata kunci:

CREATE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   RETURN DBMS_RANDOM.VALUE ();
END;

Menggunakan fungsi ini sebagai ganti dbms_random di kueri pertama memberi tahu kita bahwa kueri hanya dieksekusi sekali, meskipun banyak panggilan. Tapi ini hanya menjelaskan select bagian. Bagaimana jika kita menggunakan fungsi deterministik yang sama di kedua select dan where ayat. Kita dapat mengujinya dengan menggunakan kueri berikut:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Anda mungkin harus menjalankan ini beberapa kali untuk melihat bukti kami, tetapi, pada akhirnya, Anda akan melihat daftar nilai kurang dari 0,5. Ini memberi kami bukti bahwa bahkan fungsi deterministik dieksekusi dua kali:sekali untuk setiap bagian yang muncul. Sebagai alternatif, Anda dapat memodifikasi fungsi deterministik kami sebagai berikut, lalu jalankan kueri berikutnya, yang akan menampilkan 2 baris yang ditulis ke DBMS_OUTPUT .

CREATE OR REPLACE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   DBMS_OUTPUT.put_line ('Called!');
   RETURN DBMS_RANDOM.VALUE ();
END;

SELECT rand_det
FROM   all_tables;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jalankan Fungsi oracle yang mengembalikan kursor referensi di C #

  2. Keluaran skrip Pengembang SQL memotong lebar sys_refcursor

  3. Oracle SQL CASE WHEN ORA-00932:tipe data tidak konsisten:diharapkan CHAR mendapat NUMBER 00932. 00000 - tipe data tidak konsisten:diharapkan %s mendapat %s

  4. Kebocoran Memori dengan OracleCommand

  5. Produk() fungsi agregat