DBMS_ALERT
は、データベース・イベント(アラート)の非同期通知をサポートします。このパッケージおよびデータベース・トリガーを適切に使用することで、アプリケーションは、データベース内で関連する値が変更されるたびに通知を受け取ることができます。
この章では、次の項目について説明します。
概要
セキュリティ・モデル
定数
制限事項
例外
使用上の注意
例
グラフィック・ツールで、データベース表のデータをグラフ表示する場合を想定します。グラフィック・ツールは、データを読み込んでグラフ表示した後、読み込んだデータに関連するデータベース・アラート(WAITONE
)を待機できます。他のユーザーがデータを変更すると、ツールが自動的に起動されます。必要となるのは、データベース表にトリガーを設定することのみであり、この設定によって、トリガーが起動されると必ず信号(SIGNAL
)が送信されます。
このパッケージのセキュリティは、選択したユーザーまたはロールにこのパッケージのEXECUTE
権限を付与することで制御できます。このパッケージの先頭部分に、使用するアラート名を制限するためのカバー・パッケージを記述することもできます。この場合は、パッケージではなく、このカバー・パッケージのEXECUTE
権限を付与できます。
データベース・アラートはコミットを発行するため、Oracle Formsでは使用できません。Oracle Formsがアクティブの状態でストアド・プロシージャをコールする場合の制限については、Oracle Formsのドキュメントを参照してください。
DBMS_ALERT
を使用すると、エラー状態のときにアプリケーション・エラー-20000が発生します。表20-2に、エラー・メッセージおよびそのエラーが発生する可能性のあるプロシージャを示します。
次に、一般的アプリケーションおよび特定のアプリケーションに関する注意を示します。
アラートは、トランザクション単位で処理されます。つまり、アラートを通知するトランザクションがコミットされるまで、待機中セッションはアラートを受け取りません。したがって、特定のアラートに対する同時実行の送信と待機がいくつか発生する場合があります。
待機中のアプリケーションはデータベース内でブロックされるため、別の処理は実行できません。
アプリケーションは、複数のイベントに対して登録でき、WAITANY
プロシージャを使用して、すべてのイベントの発生を待機できます。
WAITONE
またはWAITANY
プロシージャに対して、オプションのtimeout
パラメータを指定することもできます。timeout
を0(ゼロ)に設定すると、保留中のアラートが存在しない場合はすぐに戻されます。
通知セッションは、待機中セッションが受け取るメッセージをオプションで渡せます。
アラートは、対応するアプリケーションの待機コールよりも頻繁に通知されます。この場合、古いアラートは廃棄されます。アプリケーションは、トランザクションのコミットごとに、最新のアラートを取得します。
アプリケーションで、トランザクション単位のアラートが必要ない場合は、DBMS_PIPE
パッケージを使用してください。
SIGNAL
のコール後にトランザクションがロールバックされた場合、アラートは発生しません。
アラートを受け取り、データを読み込んでも、データが変更されていない場合があります。これは、先行したアラートの後にデータが変更されたが、その前に先行したアラートに関するデータが読み込まれているためです。
通常、Oracleはイベント・ドリブンであるため、ポーリング・ループは発生しません。ポーリング・ループは、次の2つの場合に発生する可能性があります。
共有モード。データベースを共有モードで実行している場合は、別のインスタンスからのアラートをチェックするためにポーリング・ループが必要です。ポーリング・ループのデフォルト値は1秒で、SET_DEFAULTS
プロシージャで設定できます。
WAITANY
プロシージャ。WAITANY
プロシージャを使用していて、通知セッションが通知の1秒以内にコミットしない場合は、このコミットされていないアラートが別のアラートをカムフラージュしないようにするために、ポーリング・ループが必要です。ポーリング・ループは1秒間隔で始まり、30秒間隔まで段階的に変化します。
表20-2 DBMS_ALERTエラー・メッセージ
エラー・メッセージ | プロシージャ |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
全従業員について、部門ごとの平均給与のグラフを作成するとします。アプリケーションは、EMP
の変更を常に認識しておく必要があります。アプリケーションのコードは次のようになります。
DBMS_ALERT.REGISTER('emp_table_alert'); <<readagain>>: /* ... read the emp table and graph it */ DBMS_ALERT.WAITONE('emp_table_alert', :message, :status); if status = 0 then goto <<readagain>>; else /* ... error condition */
EMP
表のトリガーは次のようになります。
CREATE TRIGGER emptrig AFTER INSERT OR UPDATE OR DELETE ON emp BEGIN DBMS_ALERT.SIGNAL('emp_table_alert', 'message_text'); END;
アラートが不要になると、アプリケーションは次の要求を作成します。
DBMS_ALERT.REMOVE('emp_table_alert');
この要求によって、アラートの通知側の処理量が削減されます。登録したアラートが存在している間にセッションが終了(または異常終了)した場合、そのアラートは結果的に、このパッケージの次のユーザーによって消去されます。
例では、アプリケーションが中間値をすべて参照するとはかぎりませんが、常に最新のデータを参照することが保証されます。
表20-3 DBMS_ALERTパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
アラートからメッセージを受け取ります。 |
|
アラートからの通知を無効にします。 |
|
このセッションに対するアラートを登録リストからすべて削除します。 |
|
ポーリング間隔を設定します。 |
|
アラートを通知します(登録セッションにメッセージを送信します)。 |
|
セッションに登録したアラートからのメッセージの受取りを、 |
|
名前を設定したアラートからのメッセージの受取りを、 |
セッションは、このプロシージャによってアラートを登録します。
アラートとの関連が不要になったセッションは、このプロシージャによって登録リストからそのアラートを削除できます。アラートを削除すると、アラートの通知側が行う処理量が削減されます。
このプロシージャによって、このセッションに関連するアラートを登録リストからすべて削除します。セッションですべてのアラートが不要になったときは、必ずこのプロシージャを使用してください。
このプロシージャは、セッションの中でこのパッケージを初めて参照すると、自動的にコールされます。したがって、前のセッションが異常終了した場合でも、そのセッションに関連するアラートが現在のセッションに影響を与えることはありません。
このプロシージャは常にコミットを実行します。
このプロシージャはアラートを通知します。SIGNAL
コールは、コールしたトランザクションがコミットされたときのみ有効になります。トランザクションがロールバックされると、SIGNAL
は無効になります。
このアラートを登録したすべてのセッションに通知されます。関連しているセッションが現在待機中の場合は、そのセッションが起動されます。関連しているセッションが現在待機中でない場合は、次にそのセッションが待機コールを行ったときに通知されます。
複数のセッションが、同時に同じアラートの通知を受けられます。各セッションは、アラートを通知するとき、コミットするまでその他の同時セッションをすべてブロックします。この結果、トランザクションはシリアル化されます。
現行のセッションが登録されているすべてのアラートを対象として、そのいずれかの発生を待機する場合にこのプロシージャをコールします。
構文
DBMS_ALERT.WAITANY ( name OUT VARCHAR2, message OUT VARCHAR2, status OUT INTEGER, timeout IN NUMBER DEFAULT MAXWAIT);
パラメータ
表20-8 WAITANYプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
発生したアラート名を戻します。 |
|
アラートに関連付けられたメッセージを戻します。 これは、 |
|
戻される値。 0 - アラート発生。 1 - タイムアウト発生。 |
|
アラートの最大待機時間。
|
このプロシージャは、特定のアラートの発生を待機します。このプロシージャが実行される前に、暗黙的なCOMMIT
が発行されます。最初にアラートを通知するセッションが、その後のトランザクションでアラートを待機する場合もあります。この場合は、通知の後および待機の前にコミットする必要があり、この処理を行わないと、(DBMS_ALERT
によってコールされる) DBMS_LOCK
.REQUEST
からステータス4が戻されます。
構文
DBMS_ALERT.WAITONE ( name IN VARCHAR2, message OUT VARCHAR2, status OUT INTEGER, timeout IN NUMBER DEFAULT MAXWAIT);
パラメータ
表20-9 WAITONEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
待機するアラート名。 |
|
アラートに関連付けられたメッセージを戻します。 これは、 |
|
戻される値。 0 - アラート発生。 1 - タイムアウト発生。 |
|
アラートの最大待機時間。 名前を設定したアラートが |