Tidur Tanpa Lengan dalam Oracle
Fungsi DBMS_LOCK.sleep menyediakan cara mudah untuk menjeda pelaksanaan dalam pangkalan data Oracle untuk tempoh tertentu. Walau bagaimanapun, pemberian akses kepada fungsi ini boleh menjadi risiko keselamatan. Adakah terdapat pendekatan alternatif untuk menjeda pelaksanaan tanpa menggunakan DBMS_LOCK.sleep?
Penyelesaian
Malangnya, tanpa akses kepada DBMS_LOCK.sleep, penggantian langsung mungkin tidak dapat dilakukan dengan mudah tersedia. Walau bagaimanapun, terdapat penyelesaian yang boleh mensimulasikan tingkah laku seperti tidur:
CREATE OR REPLACE FUNCTION MYSCHEMA.NO_SLEEP ( IN_TIME INT -- Number of seconds ) RETURN INTEGER AS BEGIN DECLARE v_now DATE; -- Current date and time BEGIN -- 1) Get the current date and time SELECT SYSDATE INTO v_now FROM DUAL; -- 2) Loop until the current date is greater than or equal to the timestamp plus the delay LOOP EXIT WHEN v_now + (IN_TIME * (1/86400)) >= SYSDATE; -- Convert seconds to fractional days END LOOP; RETURN 0; -- Return 0 upon successful sleep EXCEPTION WHEN OTHERS THEN RETURN -1; -- Return -1 in case of any other error END; END NO_SLEEP;
Penggunaan
Fungsi ini boleh digunakan sama seperti DBMS_LOCK.sleep:
SELECT NO_SLEEP(10.5) FROM DUAL; -- Sleep for 10.5 seconds
Nota:
Walaupun penyelesaian ini mensimulasikan fungsi tidur, adalah penting untuk ambil perhatian bahawa ia hanyalah hack dan tidak secekap sebagai DBMS_LOCK.sleep. Adalah disyorkan untuk memberikan akses kepada DBMS_LOCK.sleep jika aplikasi benar-benar memerlukan pelaksanaan berhenti seketika.
Atas ialah kandungan terperinci Bagaimana untuk Mensimulasikan DBMS_LOCK.sleep dalam Oracle Tanpa Risiko Keselamatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!