ホームページ >データベース >mysql チュートリアル >DBMS_LOCK.sleep 権限なしで Oracle でスリープ機能を実現するにはどうすればよいですか?

DBMS_LOCK.sleep 権限なしで Oracle でスリープ機能を実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 20:35:10778ブラウズ

How Can I Achieve a Sleep Function in Oracle Without DBMS_LOCK.sleep Permissions?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。