Fungsi Tidur dalam Oracle: Alternatif kepada DBMS_LOCK.sleep
Dalam Oracle, fungsi DBMS_LOCK.sleep biasanya digunakan untuk menjeda pelaksanaan untuk sesuatu tempoh yang ditetapkan. Walau bagaimanapun, fungsi ini memerlukan kebenaran khusus, yang mungkin tidak diberikan kepada semua pengguna.
Masalah
Coretan kod yang dibentangkan menunjukkan fungsi (TEST_SLEEP) yang menggunakan DBMS_LOCK. tidur untuk menjeda pelaksanaan selama beberapa saat tertentu. Walau bagaimanapun, fungsi tersebut memerlukan pemilik prosedur untuk diberikan akses kepada DBMS_LOCK.
Penyelesaian
Tanpa menggunakan DBMS_LOCK.sleep, terdapat kaedah alternatif untuk mencapai yang serupa kesan:
1. Bergelung dengan Cap Masa Semasa
Pendekatan ini menggunakan gelung untuk menyemak cap masa semasa berulang kali sehingga jumlah masa yang dikehendaki telah berlalu:
CREATE OR REPLACE FUNCTION MYSCHEMA.MY_SLEEP ( IN_TIME IN NUMBER ) RETURN INTEGER IS BEGIN v_now DATE; -- Current timestamp IN_TIME := IN_TIME * (1/86400); -- Convert to fractional day SELECT SYSDATE INTO v_now FROM DUAL; LOOP EXIT WHEN v_now + IN_TIME <= SYSDATE; -- Check again after 1 millisecond DBMS_LOCK.SLEEP(1000000 / 86400000); END LOOP; RETURN 1; END MY_SLEEP;
Fungsi ini bergelung sehingga perbezaan antara cap masa semasa dan cap masa awal (ditambah masa tidur yang ditentukan) menjadi kurang daripada atau sama dengan 0. Kelewatan masa diperkenalkan menggunakan DBMS_LOCK.SLEEP dengan kenaikan kecil (1 mikrosaat) untuk mengelak daripada membebankan sistem.
Nota:
Walaupun kaedah ini tidak memerlukan kebenaran DBMS_LOCK.sleep, ia mungkin tidak setepat atau cekap seperti DBMS_LOCK.sleep dalam keadaan tertentu senario.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Fungsi Tidur dalam Oracle Tanpa Kebenaran DBMS_LOCK.sleep?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!