PL/SQLを使っているとたまにスリープさせたいシーンがあります。そんな時はDBMS_LOCK.SLEEPもしくはDBMS_SESSION.SLEEPプロシージャを使います。
18c以降はDBMS_SESSION.SLEEPを利用する
12cまではDBMS_LOCK.SLEEPを使っていましたが、以下の通り18c以降はDBMS_SESSION.SLEEPが推奨されています。特に機能的な違いは述べられていないようなので単純にそのまま置き換えればよさそうです。DBMS_LOCK.SLEEPと比べ便利になった所として利用するにあたって特別な権限付与は不要となりました。
DBMS_LOCK.SLEEPプロシージャは非推奨となりました。かわりにDBMS_SESSION.SLEEPプロシージャを使用してください。
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス, 18c より引用
E93903-05
https://docs.oracle.com/cd/E96517_01/arpls/release-changes.html#GUID-EDBEC906-B269-4C5B-A9FE-D5AADA61532B
-- 以下の通り何も問題なく実行できます
--
SQL> exec DBMS_SESSION.SLEEP(5)
PL/SQLプロシージャが正常に完了しました。
12cまでのDBMS_LOCK.SLEEPを利用するには権限付与が必要
DBMS_LOCK.SLEEPを利用する場合、通常権限が割当たっておらず実行する事ができません。そのまま実行を試みると以下のようなエラーが発生します
SQL> exec DBMS_LOCK.SLEEP(5)
BEGIN DBMS_LOCK.SLEEP(5); END;
*
行1でエラーが発生しました。:
ORA-06550: 行1、列7:
PLS-00201: 識別子DBMS_LOCKを宣言してください。
ORA-06550: 行1、列7:
PL/SQL: Statement ignored
SQL>
EXECUTE_CATALOG_ROLEロールを付与します
以下の通りsystemユーザ(DBAロール保持者)から権限付与を行うのですが、もしどうしてもDBMS_LOCKパッケージだけの実行権限付与にとどめておきたい場合はSYSユーザからgrant execute on DBMS_LOCK to sooni とする事で利用できるようになります。これはDBAロール保持者であってもできないです。
grant EXECUTE_CATALOG_ROLE to sooni ;
DBMS_LOCKの実行権限を直接付与する場合
こちらはsysからでないと実行できません
sqlplus / as sysdba
SQL> GRANT EXECUTE ON DBMS_LOCK TO SOONI
2 ;
権限付与が成功しました。
SQL>
あらためてSOONIスキーマで動作確認
SQL> set timing on
SQL> exec DBMS_LOCK.SLEEP(5)
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:05.29
SQL>