20 DBMS_APP_CONT
DBMS_APP_CONTパッケージは、使用できなくなったセッションの実行中のトランザクションがコミットされたかどうか、およびそのセッションに対する最後のコールが完了したかどうかを判断できるインタフェースを提供します。 
               
参照:
アプリケーション・コンティニュイティとトランザクション・ガードの説明およびこれら2つの機能の関連性については、『Oracle Database開発ガイド』を参照してください。
この章のトピックは、次のとおりです:
20.1 DBMS_APP_CONTの概要
DBMS_APP_CONTパッケージを使用して、この例の問題を解決できます。
問題の詳細
停止後にアプリケーションをリカバリする際の根本的問題の1つは、クライアントに返送されたコミット・メッセージに継続性がないことです。 クライアントとサーバー間に間隔がある場合、クライアントには通信の失敗というエラー・メッセージが示されます。 このエラーでは次のことがアプリケーションに知らされません。すなわち、送信によってコミット操作が実行されたかどうか、もしくは、プロシージャ・コールが予定されたすべてのコミットおよびセッション状態変更を行って完了まで実行されたか、一部の動作は失敗したか、またはクライアントから切断したまま現在も実行中というさらに悪い状態になっているかということです。
GET_LTXID_OUTCOME
GET_LTXID_OUTCOMEプロシージャの目的は、使用できなくなったセッションの実行中のトランザクションが完了したかどうかを判断することです。 元のセッションが使用できなくなったためにエラーが戻されるときに使用されます。 セッションが使用できなくなる理由として、セッション、インスタンス、サーバー、ネットワークの障害や、計画済停止または計画外停止があげられます。 このような停止が発生すると、アプリケーションは切断エラーを受信します。 しかし、このエラーでは、トランザクションがコミットされたかどうかを示す情報が提供されません。 また、アプリケーションの復旧後に、どんなコミット結果が期待されているかも示されていません。
参照:
論理トランザクションIDについては、『Oracle Database概要』を参照してください。
20.2 DBMS_APP_CONTのセキュリティ・モデル
アプリケーションでは、DBMS_APP_CONTパッケージのEXECUTE権限が必要です。
                  
この権限を付与するには、データベース管理者が次のSQL文を実行する必要があります。
GRANT execute on DBMS_APP_CONT to application user ;20.3 DBMS_APP_CONTサブプログラムの要約
このトピックでは、DBMS_APP_CONTのサブプログラムをアルファベット順に示し、簡単に説明しています。
                  
表20-1 DBMS_APP_CONTパッケージのサブプログラム
| サブプログラム | 説明 | 
|---|---|
| 
                                 
                                  このプロシージャは、どのサブルーチンにも継承される新しいリプレイ・ルールをアクティブ化します。ただし、そのサブルーチンに適用される新しいルールによって上書きされた場合を除きます。  | 
                           |
| 
                                 
                                  セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。  | 
                           |
| 
                                 
                                  このファンクションは、リプレイ・ルールのリストを返します。 その結果から、ルール・ターゲットがビットおよびファンクションでリプレイ可能かどうかをテストできます。  | 
                           |
| 
                                 
                                  このプロシージャは、既存のすべてのリプレイ・ルールをリセットします。 このプロシージャをコールすると、指定したスコープ内でローカルに定義されたルールがすべてクリアされ、親スコープ(親スコープが指定されていない場合はサービス)から継承していた元の状態にリストアされます。  | 
                           
20.3.1 APPLY_REPLAY_RULEプロシージャ
このプロシージャは、どのサブルーチンにも継承される新しいリプレイ・ルールをアクティブ化します。ただし、そのサブルーチンに適用される新しいルールによって上書きされた場合を除きます。
reset_replay_rulesがコールされるか、ブロックが戻されたときに効果を失います。 
                           ノート:
プロシージャ、ファンクションまたは無名ブロックのサブブロック内でこのプロシージャをコールすると、その親スコープにルールが適用されます。 サブブロックが復帰しても、ルールの効果が失われなくなります。 そのため、このプロシージャをサブブロック内でコールすることはお薦めしません。構文
DBMS_APP_CONT.APPLY_REPLAY_RULE ( replayable IN BOOLEAN, targets IN BINARY_INTEGER, scope IN BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT);
パラメータ
表20-2 APPLY_REPLAY_RULEプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
                                       
                                        
  | 
                                    
                                       
                                        
  | 
                                 
| 
                                       
                                        
  | 
                                    
                                       
                                        このルールが適用されるターゲットの効果。 複数の効果が必要な場合は、それらの効果をビットとして渡すか、個別の効果として  | 
                                 
| 
                                       
                                        
  | 
                                    
                                       
                                        ルールのスコープ。  | 
                                 
20.3.2 GET_LTXID_OUTCOMEプロシージャ
このプロシージャは、セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。
構文
DBMS_APP_CONT.GET_LTXID_OUTCOME ( client_ltxid IN RAW, committed OUT BOOLEAN, user_call_completed OUT BOOLEAN)
パラメータ
表20-3 GET_LTXID_OUTCOMEプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
                                        
  | 
                                    
                                        クライアント側の論理トランザクションID。 前回失敗したセッションから  | 
                                 
| 
                                        
  | 
                                    
                                        指定した論理  | 
                                 
| 
                                        
  | 
                                    
                                        すべての情報がクライアントに戻されたかどうか。 このようなメッセージの例として、自動コミットまたはコミットを正常に使用できたときに処理された行数、PL/SQLコール時のパラメータとファンクションの結果、または  | 
                                 
例外
表20-4 GET_LTXID_OUTCOMEプロシージャの例外
| 例外 | 説明 | 
|---|---|
| 
                                        
  | 
                                    
                                        サーバーの情報が最新であるため、トランザクションは古くてすでにコミットされたものです。 アプリケーションから渡された  | 
                                 
| 
                                        
  | 
                                    
                                        クライアントがサーバーより進んでいます。 これは、サーバーがフラッシュバックされた場合やメディア・リカバリを使用してリカバリされた場合、またはデータ損失を伴いながらも早期にオープンされたスタンバイである場合に発生することがあります。  | 
                                 
| 
                                        
  | 
                                    
                                        
  | 
                                 
| 
                                        
  | 
                                    
                                        同じユーザー名を持つ別のユーザーによって  | 
                                 
| 
                                        
  | 
                                    
                                        結果を確認できません。 処理中にエラーが発生しました。 エラー・スタックにエラーの詳細が示されています。  | 
                                 
20.3.3 GET_REPLAY_RULESファンクション
このファンクションは、リプレイ・ルールのリストを返します。 結果から、ルール・ターゲットがBITANDファンクションでリプレイ可能かどうかをテストできます。 
                     
構文
DBMS_APP_CONT.GET_REPLAY_RULES ( replayable IN BOOLEAN, scope IN BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT) RETURN BINARY_INTEGER;
パラメータ
表20-5 GET_REPLAY_RULESプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
                                       
                                        
  | 
                                    
                                       
                                        
  | 
                                 
| 
                                       
                                        
  | 
                                    
                                       
                                        ルールのスコープ。  | 
                                 
20.3.4 RESET_REPLAY_RULESプロシージャ
このプロシージャは、既存のすべてのリプレイ・ルールをリセットします。 このプロシージャをコールすると、指定したスコープ内でローカルに定義されたルールがすべてクリアされ、親スコープ(親スコープが指定されていない場合はサービス)から継承していた元の状態にリストアされます。
構文
DBMS_APP_CONT.RESET_REPLAY_RULES ( targets IN BINARY_INTEGER DEFAULT NULL, scope IN BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT);
パラメータ
表20-6 RESET_REPLAY_RULESプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
                                       
                                        
  | 
                                    
                                       
                                        ルールをリセットするターゲットの効果。  | 
                                 
| 
                                       
                                        
  | 
                                    
                                       
                                        ルールのスコープ。  |