Untuk mengurangkan keperluan untuk pemberian eksplisit kepada pakej DBMS_LOCK, pendekatan alternatif boleh digunakan untuk mensimulasikan fungsi DBMS_LOCK.sleep prosedur. Walaupun kaedah ini diakui sebagai "penggodaman yang mengerikan", kaedah ini menyediakan penyelesaian tanpa menggunakan pengubahsuaian kebenaran.
Fungsi tersuai di bawah bergantung pada pendekatan berasaskan cap masa:
-- Custom sleep function without DBMS_LOCK CREATE OR REPLACE FUNCTION MYSCHEMA.ALTERNATIVE_SLEEP ( IN_TIME NUMBER ) RETURN INTEGER IS v_now DATE; BEGIN -- Capture the current time SELECT SYSDATE INTO v_now FROM DUAL; -- Loop until the current time exceeds the initial time + input seconds LOOP EXIT WHEN v_now + (IN_TIME * (1/86400)) <= SYSDATE; END LOOP; RETURN 1; EXCEPTION WHEN OTHERS THEN RAISE; RETURN 1; END ALTERNATIVE_SLEEP;
Ini fungsi menggunakan satu siri manipulasi tarikh dan masa untuk mencapai tingkah laku seperti tidur. Ia secara berulang menyemak sama ada masa semasa telah melebihi masa tidur yang diingini dengan menambahkan saat input pada masa awal. Apabila syarat ini dipenuhi, fungsi keluar dari gelung.
Penggunaan fungsi tersuai ini adalah serupa dengan pendekatan asal:
SELECT ALTERNATIVE_SLEEP(10.5) FROM DUAL;
Perhatikan bahawa kaedah ini mempunyai kelemahannya dan tidak disyorkan untuk kegunaan praktikal.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mensimulasikan DBMS_LOCK.sleep Tanpa Memberi Keistimewaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!