ホームページ >データベース >mysql チュートリアル >DBMS_LOCK.sleep 権限なしで Oracle でスリープ機能を実現するにはどうすればよいですか?
Oracle の Sleep 関数: DBMS_LOCK.sleep の代替
Oracle では、DBMS_LOCK.sleep 関数は通常、実行を一時停止するために使用されます。指定された期間。ただし、この関数には特定の権限が必要であり、すべてのユーザーに付与されているわけではありません。
問題
提示されたコード スニペットは、DBMS_LOCK を利用する関数 (TEST_SLEEP) を示しています。 sleep は、指定された秒数の間実行を一時停止します。ただし、この関数では、プロシージャの所有者に DBMS_LOCK へのアクセスが許可されている必要があります。
ソリューション
DBMS_LOCK.sleep を使用せずに、同様のことを実現する代替メソッドがあります。効果:
1.現在のタイムスタンプによるループ
このアプローチでは、ループを使用して、必要な時間が経過するまで現在のタイムスタンプを繰り返しチェックします。
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;
この関数は、タイムスタンプとタイムスタンプの差がなくなるまでループします。現在のタイムスタンプと初期タイムスタンプ (指定されたスリープ時間を加えたもの) は 0 以下になります。時間遅延は次を使用して導入されます。システムに負荷がかかることを避けるために、DBMS_LOCK.SLEEP を少し増分 (1 マイクロ秒) します。
注:
このメソッドには DBMS_LOCK.sleep 権限は必要ありませんが、必要な場合があります。特定のシナリオでは DBMS_LOCK.sleep ほど正確または効率的ではありません。
以上がDBMS_LOCK.sleep 権限なしで Oracle でスリープ機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。