4 クライアント・アプリケーションの開発(SNAのみ)
次のセクションでは、TIPを呼び出してリモート・ホスト・トランザクションを制御する方法について説明します。 また、ゲートウェイ・トランザクションを準備して実行するためのステップも提供します。 前提は次のとおりです。
-
リモート・ホスト・トランザクション(RHT)は既に書かれている
-
RHTに対応するTIPは、「TIPの作成」で説明されているステップを使用して既に定義されています
注意:
ゲートウェイがIMS Connect用のTCP/IPサポートを使用している場合は、TIPの呼び出しとリモート・ホスト・トランザクションの制御については、「クライアント・アプリケーション開発(TCP/IPのみ)」を参照してください。
トピック:
クライアント・アプリケーションの概要
手順ゲートウェイ管理ユーティリティ(PGAU)は、提供する定義を使用して完全なTIPを生成します。 クライアント・アプリケーションは、リモート・ホスト・トランザクションにアクセスするためにTIPを呼び出すことができます。 「手続き型ゲートウェイ管理ユーティリティ」は、PGAUの使用について詳しく説明しています。
この概要では、TIPを呼び出してリモート・ホスト・トランザクションを制御するために必要な作業について説明します。
ゲートウェイはOracleデータベースからPL/SQLコールを受信し、APPCコールを発行してリモート・トランザクション・プログラムと通信します。 これを可能にするのは、次の3つのアプリケーション・プログラムです:
-
APPC対応のリモート・ホスト・トランザクション・プログラム
-
Transactionインタフェース・パッケージ、またはTIP。 TIPは、クライアントとゲートウェイ間の通信を処理し、COBOLとPL/SQL間のデータ型変換を実行するPL/SQLパッケージです。
PGAUはあなたのために TIP仕様を生成します。 出荷されたサンプルでは、PGAUで生成されたパッケージは
pgadb2i.pkb
と呼ばれます。 この生成されたTIPには、リモート・トランザクション・プログラムにマップされる少なくとも3つの関数呼び出しが含まれます:-
pgadb2i_init
は、リモート・トランザクション・プログラムとの会話を初期化 -
pgadb2i_main
は、リモート・トランザクション・プログラムとアプリケーション・データを交換 -
pgadb2i_term
は、リモート・トランザクション・プログラムとの会話を終了
独自のTIPやデバッグを作成する場合は、TIPの詳細については「TIP内部」を参照してください。
-
-
TIPを呼び出すクライアント・アプリケーション。
クライアント・アプリケーションは、入出力引数を持つ3つのTIP関数を呼び出します。 この例では、クライアント・アプリケーションは従業員番号
empno
をリモート・トランザクションに渡し、リモート・トランザクションは従業員レコードemprec
を送り返します。
「表4-1」は、CICS-DB2トランザクションの例を使用して、PL/SQLドライバ、TIP、およびゲートウェイ間の論理フローを示します。
表4-1 CICS-DB2のロジック・フロー例
クライアント・アプリケーション | Oracle TIP | ゲートウェイとリモート・トランザクション(メインフレーム)の間で確立されたプロシージャ |
---|---|---|
|
|
ゲートウェイは制御ブロックを設定し、APPC |
|
|
ゲートウェイはAPPC |
|
|
ゲートウェイは制御ブロックをクリーンアップします。 |
ゲートウェイを利用してリモート・ホスト・トランザクションとデータを交換するクライアント・アプリケーションは、それ自体のためにいくつかのタスクを実行し、そのためにTIPに他のタスクを実行するよう指示します。 したがって、クライアント・アプリケーションの設計者は、リモート・トランザクションの動作とTIPが交換を容易にする方法を知る必要があります。
以下のセクションでは、リモート・ホスト・トランザクションの動作の概要、この動作がクライアント・アプリケーションによってどのように制御されるか、TIP関数呼び出しとデータ宣言がクライアント・アプリケーションをサポートしてリモート・ホスト・トランザクションを制御する方法について説明します。 これらのセクションでは、クライアント・アプリケーションのためにTIPが行うことと、TIPがリモート・ホスト・トランザクションとのデータ交換を呼び出す方法についてのバックグラウンド情報も提供します。
リモート・ホストのトランザクション要件の理解
リモート・ホスト・トランザクション・プログラム(RTP)を参照して、以下を確認します:
-
さまざまなクライアント・アプリケーションでTIP呼び出しに必要なPL/SQLパラメータ
-
呼び出しの順序
呼び出されるリモート・ホスト・トランザクション・プログラム(RTP)機能と、各呼び出しで交換されるデータを識別します。 次のように定義し、PG DDに格納します:
-
DEFINE DATA
-
DEFINE CALL
-
DEFINE TRANSACTION
具体的な定義ステップと、実際のTIPの作成と生成については、「TIPの作成」を参照してください。
TIP内容と目的
PGAU生成TIPの内容は、リモート・ホスト・トランザクションで使用可能なコールと交換されたデータを反映します。 このコンテンツを理解すると、TIPを呼び出すクライアント・アプリケーションを設計およびデバッグするときに役立ちます。
TIPはPL/SQLパッケージであるため、 2セクションがあります:
-
パッケージ仕様:
-
パブリック関数のプロトタイプとパラメータ、および
-
-
パッケージ本文:
-
プライベート関数と内部制御変数
-
パブリック・ファンクション
-
最後のパブリック関数に続くパッケージの初期化。
-
TIPの目的は、許可されたすべてのリモート・トランザクション・プログラムの対話に対してPL/SQL呼び出し可能な公開関数を提供することです。 リモート・トランザクション・プログラムの相互作用は、1つ以上の PGAXFER
RPC呼び出しを介して論理的に関連するデータ交換のグループです。 これは、概念的には、複数のフィールドが入力され、入力キーが押され、いくつかのフィールドがユーザーに返される画面またはメニューの対話に似ています。 さらに類推を行う:
-
ユーザーは、TIPまたはクライアント・アプリケーションに類似している可能性があります
-
記入されるフィールドは、TIP関数呼び出しの
IN
パラメータです -
返されるフィールドは、TIP関数呼び出しの
OUT
パラメータです -
画面またはメニューは、
IN
とOUT
パラメータの組み合わせです -
押された入力キーは、
PGAXFER
リモート・プロシージャ・コール(RPC)にリンクされます
トランザクション呼び出しを構成するパラメータの実際のグループ化は、ユーザーによって定義されます。 ゲートウェイは、リモート・トランザクション・プログラムがTIP関数呼び出しの集合に対応する方法に制限を置かず、各呼び出しは多くのIN
とOUT
パラメータを持ちます。
PGAユーザーは、通常、リモート・トランザクション・プログラムごとに1つのTIPを持ちます。 TIP関数呼び出しをグループ化する方法と、各呼び出しで交換されるデータ・パラメータは、リモート・トランザクション・プログラムのサイズ、複雑さ、および動作によって異なります。
PL/SQLパッケージの動作については、Oracle 「Oracle Database PL/SQL言語リファレンス」を参照してください。 以下の説明では、TIP内で実行する必要があるロジックについて説明します。 UNIXベースのシステムの場合はMicrosoft Windowsまたは$ORACLE_HOME/dg4appc/demo/CICS
ディレクトリの%ORACLE_HOME%\dg4appc\demo\CICS
ディレクトリに用意されているサンプルTIPおよびドライバのファイル例を参照してください。
リモート・ホストのトランザクション・タイプ
データベース・ゲートウェイ・アプリケーションのパースペクティブからは、リモート・ホスト・トランザクションには主に3つのタイプがあります:
-
ワンショット
-
永続的
-
multi-conversational
ワン・ショット取引
1つの従業員番号を受け取り従業員レコードを返す単純なリモート・トランザクション・プログラムは、従業員番号をIN
パラメータとして渡し、従業員レコードをOUT
パラメータとして返す1つのコールを提供するTIPを持つことができます。 これとすべてのTIPによって、さらに2つの関数呼び出しを提供する必要があります:
-
リモート・トランザクション・プログラムのinit関数呼び出し
-
リモート・トランザクション・プログラムは関数呼び出しを終了
最も単純なTIPには、tip_init
、tip_main
、tip_term
などの3つのパブリック関数があります。
クライアント・アプリケーションは、tip_init
、tip_main
、およびtip_term
を連続して呼び出します。 リモート・サイトでの対応アクティビティは、リモート・トランザクション・プログラムの開始、データ交換、およびリモート・トランザクション・プログラムの終了です。
リモート・トランザクション・プログラムは、ゲートウェイから終了信号を受信する前に自身を終了することさえできます。 このシーケンスは通常であり、ゲートウェイ・ロジックによって通常処理されます。 このようなリモート・トランザクション・プログラムはワン・ショットと呼ばれます。
永続的なトランザクション
より複雑なリモート・トランザクション・プログラムには、2つの動作モードがあります: INQUIRY
またはレポーティング・モード、およびUPDATE
モードがあります。 これらのモードには、2つのTIPデータ転送関数呼び出し: 1つはINQUIRY
用、もう1つはUPDATE
用です。 このようなTIPには、5つの公開機能があります。 次に例を示します。
-
これにより、リモート・トランザクション・プログラムとの通信が初期化されます。
-
これは、モード選択パラメータを受け取り、取引プログラムを照会モードまたは更新モードにします。
-
これは、特定の従業員番号の従業員レコードを戻します。
-
これは、特定の従業員番号の従業員レコードを受け入れます。
-
これにより、リモート・トランザクション・プログラムとの通信が終了します。
クライアント・アプリケーションはtip_init
とtip_mode
を呼び出してリモート・トランザクション・プログラムを照会モードにし、従業員レコードをスキャンし、(クライアント・アプリケーションとエンドユーザーに知られている)属性の組み合わせを検索します。 照会呼び出しの一部のパラメータは、更新モードへの変更を通知するように設定され、クライアント・アプリケーションはtip_updt
を呼び出してレコードを更新します。 クライアント・アプリケーションは最終的にtip_term
を呼び出してリモート・トランザクション・プログラムを終了します。
-
リモート・トランザクション・プログラムの開始
-
モード選択交換
-
ループ読書記録
-
更新モードに切り替える
-
1レコードを更新
-
リモート・トランザクション・プログラム終了
このようなリモート・トランザクション・プログラムは、終了するように通知されるまで相互作用するため、永続的プログラムと呼ばれます。
リモート・トランザクション・プログラムは、照会モードへの復帰を許可し、プロセス全体を無期限に繰り返すように書くことができます。
複数の会話型トランザクション
クライアント・アプリケーションは、あるトランザクションtran_A
から情報を取得し、続いて別のトランザクションtran_B
から情報を書き込むか、ルックアップする必要があります。 これは、適切に書かれたクライアント・アプリケーションとtran_A
とtran_B
のTIPで可能です。 実際、単一のクライアント・アプリケーションによって任意の数のトランザクションが同時に制御される可能性があります。 すべてのトランザクションは読取り専用で、クライアント・アプリケーションはそれぞれからデータを取り出してローカルのOracleデータベースに統合するか、Oracleフォームに表示します。
あるいは、トランザクションは、クライアント・アプリケーションによってどの入力選択が供給されたかに応じて、異なるモードで動作するか、または異なるサービスを実行することができます。 たとえば、tran_C
の1つのインスタンスは1つのサービスを実行し、2つ目のインスタンスは2番目のサービスを実行します。 tran_C
の各インスタンスは、クライアント・アプリケーションとの固有の会話を持ち、各インスタンスは実行されるサービスの性質に応じて、独自の動作(ワン・ショットまたは永続)を持つことができます。
各リモート・ホスト・トランザクションのカスタマイズされたTIP
各リモート・ホスト・システムには、ユーザーが呼び出す可能性のある数百のリモート・トランザクション・プログラム(RTP)が含まれている場合があります。 各リモート・トランザクション・プログラムは異なり、異なるデータを渡し、異なる機能を実行します。 したがって、ユーザーと各リモート・トランザクション・プログラムとの間のインタフェースは、各リモート・トランザクション・プログラムのユーザー要件に特化してカスタマイズする必要があります。 トランザクション・インタフェース・パッケージは、このカスタマイズされたインタフェースを提供します。
例
リモート・サイトに、従業員データベースまたは他のファイルシステム内の従業員情報を管理するトランザクション・プログラムがあるとします。 リモート・ホスト内のリモート・トランザクション・プログラム名は、従業員トラッキングの場合はEMPT
です。 EMPT
は照会機能と更新機能の両方を提供し、これらのEMPT
機能にアクセスして使用するには、異なるOracleユーザーが必要です。
一部のユーザーは、EMPT
の照会のみの使用に制限されている場合がありますが、更新要件があるユーザーもあります。 Oracleユーザー・クライアント・アプリケーションをサポートするには、少なくとも3つの可能なTIPが存在する可能性があります:
-
EMP_MGMT
を使用して、EMPT
リモート・トランザクション・プログラムのすべての機能へのアクセスを提供します。 -
EMP_UPDT
を使用して、EMPT
リモート・トランザクション・プログラムの更新機能にのみアクセスします。 -
EMP_INQR
を使用して、EMPT
リモート・トランザクション・プログラムのルックアップ機能にのみアクセスします。
これらのTIPへのエンドユーザーのアクセスは、Oracle権限によって制御されます。 リモート・ホストによってエンドユーザーに追加のセキュリティが課される可能性があります。
また、各TIPには、リモート・トランザクション・プログラム(EMPT
)の名前と、EMPT
とのAPPC会話を確立するのに十分なネットワーク情報がコード化されています。
クライアント・アプリケーション要件
TIPを使用すると、クライアント・アプリケーションはリモート・ホスト・トランザクションに対応して制御する必要があります。 内容は次のとおりです。
-
クライアント・アプリケーションの初期化
-
ユーザー入力と出力
-
TIP初期化関数を使用したリモート・ホスト・トランザクションの初期化(オーバーライドありとなし)
-
TIPユーザー機能を使用したリモート・ホスト・トランザクション制御およびデータ交換
-
TIP終了機能を使用したリモート・ホスト・トランザクションの終了
上記の3つのステップは、リモート・ホスト・トランザクションの要件に基づいて異なります。
-
例外処理
-
クライアント・アプリケーションの終了
ワン・ショット・リモート・ホスト・トランザクション・クライアント・アプリケーションでは、次の作業が必要です:
-
交換されるRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 そのような変数のPL/SQLデータ型は、各RHTに対応するTIPで既に定義されており、クライアント・アプリケーションはその宣言でTIPデータ型を参照するだけでよい。 詳細については、「"TIP変数の宣言"」も参照してください。 これらの変数の正確な使用法の詳細については、TIP/RHTのTIPコンテンツ・ドキュメント・ファイルを参照してください。
-
TIP初期化関数を使用してRHTを初期化します。 TIPは、ゲートウェイ・サーバーに、デフォルトのRHT識別パラメータ(PG DDにRHTが定義されたときに提供され、生成時にTIP内でエンコードされたもの)を指定して、目的のRHTを持つ会話を初期化するか、TIP初期化関数が呼び出されると、ユーザーまたはクライアントのアプリケーションに渡されます。 詳細については、「"会話の初期化"」および「"TIP初期化のオーバーライド"」を参照してください。
-
TIPユーザー機能(1回の呼び出し)を使用してRHTとデータを交換します。 前述のように、ワン・ショット・リモート・ホスト・トランザクションは単一のデータ交換にしか対応せず、その交換が完了すると、RHTは単独で終了します。 したがって、クライアント・アプリケーションは、データ交換を行うためにユーザー定義のTIP関数を1回呼び出すだけで済みます。
この呼び出しの正確な構文については、特定のTIP/RHTについては、
%ORACLE_HOME%\dg4appc\demo\CICS\
の%ORACLE_HOME%\dg4appc\demo\CICS\
のMicrosoft WindowsのTIPコンテンツ・ドキュメント・ファイルまたはUNIXベースのシステムの$ORACLE_HOME/dg4appc/demo/CICS/
を参照してください。クライアント・アプリケーションは、TIP関数呼び出しを呼び出す前に、値を
IN
またはIN OUT
の値に初期化する必要があります。 これらは、交換されるRHT/TIPデータ型を宣言したときに、上で宣言したのと同じ変数です。すべてのTIP関数呼び出しは
0
戻りコード値を返し、返されたすべてのユーザー・ゲートウェイ・データ値は関数パラメータで交換されます。 例外条件は必要に応じて発生し、例外ハンドラで傍受することができます。TIP関数呼び出しから戻ると、クライアント・アプリケーションは
IN OUT
またはOUT
パラメータ値を分析して操作できます。 これらは、交換されるRHT/TIPデータ型を宣言したときに、上で宣言したのと同じ変数です。TIPがリモート・ホスト・データのさまざまなタイプとフォーマットをどのように変換するかについては、「データ型変換」を参照してください。
-
TIP終了機能を使用してRHTを終了します。 アクセスされているRHTのタイプにかかわらず、TIPとの会話をクリーンアップして終了するには、TIP終了機能を呼び出す必要があります。 ワン・ショットRHTとの会話は、RHTが終了する前にゲートウェイ・サーバーから終了できます。 TIPもクリーンアップを実行する必要があります。 クリーンアップは、クライアント・アプリケーションの終了リクエスト時にのみ実行されます。
クライアント・アプリケーションは、正常終了または異常終了をリクエストできます。
詳細については、「"会話を終了"」を参照してください。
持続的なリモート・ホスト・トランザクション・クライアント・アプリケーションは:
-
交換されるRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 そのような変数のPL/SQLデータ型は、各RHTに対応するTIPですでに定義されています。クライアント・アプリケーションは宣言にTIPデータ型を参照するだけでよい。 詳細については、「"TIP変数の宣言"」を参照してください。 これらの変数の正確な使用法の詳細については、TIP/RHTのTIPコンテンツ・ドキュメント・ファイルを参照してください。
-
TIP初期化機能を使用してRHTを初期化します。 TIPは、ゲートウェイ・サーバーに、デフォルトのRHT識別パラメータ(PG DDにRHTが定義されたときに提供され、生成時にTIP内でエンコードされたもの)を指定して、目的のRHTを持つ会話を初期化するか、TIP初期化関数が呼び出されると、ユーザーまたはクライアントのアプリケーションに渡されます。 詳細については、「"会話の初期化"」および「"TIP初期化のオーバーライド"」を参照してください。
-
TIPユーザー機能を使用してRHTとデータを繰り返し交換します。 進行中または反復的な制御シーケンスを提供または必要とするリモート・ホスト・トランザクションは、RHTが対話型ユーザーまたは他の制御プログラムによって操作されるのと同じ方法でクライアント・アプリケーションによって制御されるべきです。 TIPとゲートウェイ・サーバーの介入はRHTの動作を変更しません。代わりに、TIPで定義されているさまざまな関数呼び出しを使用して、その動作の制御をクライアント・アプリケーションに拡張します。
永続的なRHTは、1つまたは複数のTIP関数呼び出しで制御できます。 RHTは、たとえば、会話が明示的に終了するまで、すべての入力に対して出力をループして返すように設計されている場合があります。 あるいは、TIP関数が
OUT
パラメータのみを持つ複数の交換で結果を実行して返す操作のカウントまたはリストを入力として受け入れるように設計されている可能性があります。永続RHTは対話型でもよく、各出力は以前の入力選択によって指定され、対話がクライアント・アプリケーションによって明示的に終了されたときにのみ終了します。
クライアント・アプリケーションで利用可能なTIP関数呼び出しは、特定のTIP/RHTのTIPコンテンツ・ドキュメント・ファイルに記述されています。
RHTがTIPの
IN
パラメータを解釈し、TIPのOUT
パラメータを返す方法は、RHTから決定されるか、RHTプログラマによって説明されなければなりません。 TIPは、RHTのクライアント・アプリケーション制御を容易にするために関数呼び出しおよび交換されたパラメータ・データ型を提供し、RHTが実行するように指示された操作のシーケンスに制限または前提条件を課すことはない。 TIPは、RHTがPG DDで受け入れるように定義された呼び出しおよびデータ・パラメータをクライアント・アプリケーションに提供します。 -
TIP終了機能を使用してRHTを終了します。 アクセスされているRHTのタイプにかかわらず、TIPとの会話をクリーンアップして終了するには、TIP終了機能を呼び出す必要があります。 永続RHTとの会話は、RHTが終了する前にゲートウェイ・サーバーから終了することも、RHTが既に終了している可能性もあります。 TIPもクリーンアップを実行する必要があり、このクリーンアップはクライアント・アプリケーションの終了リクエスト時にのみ実行されます。
クライアント・アプリケーションは、正常終了または異常終了をリクエストできます。
詳細については、「"会話を終了"」を参照してください。
マルチ会話型リモート・ホスト・トランザクション・クライアント・アプリケーションは:
-
交換されるRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 このような変数のPL/SQLデータ型は、各RHTに対応するTIPですでに定義されており、クライアント・アプリケーションはその宣言にTIPデータ型を参照するだけでよい。 詳細については、「"TIP変数の宣言"」を参照してください。 これらの変数の正確な使用法の詳細については、TIP/RHTのTIPコンテンツ・ドキュメント・ファイルを参照してください。
-
関係する各RHTを、TIP初期化関数を使用して初期化します。 特定のカスタマイズされたTIPは、PG DDで定義されている各RHTに存在します。 複数のRHTを制御するクライアント・アプリケーションはマルチ会話型であり、各RHTとその関連する会話を開始する必要があります。 これは、前と同じように各TIP初期化関数を呼び出すことによって行われます。複数のTIPが初期化されます。
単一のRHTが1つまたは複数の呼び出し元に対して複数のサービスを実行するように設計されており、クライアント・アプリケーションがこのRHTを使用するように設計されている場合、そのRHTに対応するTIPはクライアント・アプリケーションによって複数回初期化できます。
その後、クライアント・アプリケーションは、以下を使用して、制御下のアクティブなRHTと区別します:
-
複数のTIP/RHTが制御されているときのTIPスキーマ
tipname.callname
。 TIPユーザー・コールに同じTIPスキーマ名をエンコードすることで、クライアント・アプリケーションは、コールが行われているRHTを指定します。 -
同じTIP/RHTの複数のインスタンスが制御されている場合の
tranuse
IN OUT
パラメータ値。 これはTIP初期化関数呼び出しで返された値で、その後ユーザー定義のTIP関数呼び出しでIN
パラメータとして渡されます。 返されるtranuse
値は、RHTの特定のインスタンスに接続された会話に対応します。 クライアント・アプリケーションは、TIPユーザー・コールに同じtranuse
値を指定することにより、指定されたRHT呼び出しが行われているRHTインスタンスを指定します。
クライアント・アプリケーション・ロジックは、どのRHTが開始され、どのTIPおよび
tranuse
値が開始RHTに対応しているかを記録しなければなりません。 -
-
各RHTでデータを交換するには、TIPユーザー機能を使用するか、RHTがワン・ショットまたは永続的である場合は繰り返してください。 クライアント・アプリケーション・ロジックは、ユーザーがRHTを対話的に操作するのと同様に、適切なRHT操作に従って許可されたステップを経てRHTをシーケンスする必要があります。
クライアント・アプリケーション・ロジックは、必要なクロスRHT結果分析またはデータ転送も実行する必要があります。 すべてのTIPは、互いに独立して実行されます。
別のRHTへの入力として意図された1つのRHTからの出力は、最初のRHTから
IN
またはIN OUT
パラメータとしてクライアント・アプリケーションで受信され、クライアント・アプリケーションから2番目のRHTにIN
またはIN OUT
パラメータとして送信されます。 すべてのTIP-to-RHT関数呼び出しはクライアント・アプリケーションによって実行されなければならず、交換されるデータ・パラメータはクライアント・アプリケーションによって変数として宣言されていなければなりません。 TIPは、クライアント・アプリケーションに必要なデータ型定義とRHT関数呼び出しの両方を提供します。TIP関数呼び出しの正確な構文および交換されるパラメータ・データ型の定義については、各TIP/RHTのTIPコンテンツ・ドキュメント・ファイルを参照してください。
-
TIP終了機能を使用して、初期化された各RHTを終了します。 RHTを終了するには、対応するTIP終了関数を呼び出してRHTとその会話を終了し、TIPクリーンアップを開始する必要があります。 終了するRHTは、そのTIPスキーマ名(データ交換関数呼び出しと同じスキーマ)と同じRHTの複数のインスタンスが終了しているときの
tranuse
値によって指定されます。RHTおよびそれに対応するTIPは、クライアント・アプリケーションが望む順序で終了することができ、初期化されたのと同じ順序で終了する必要はありません。
注意:
さまざまなTIPデータ交換変数関数呼び出しの特定の構文は、特定のRHTのPG DDで以前定義されていたものと同じであり、TIPコンテンツ文書file (
tipname.doc
)またはTIP仕様書ファイルを調べることによって調べることができます生成された。 RHTがアクセスされているためにまだTIPが生成されていない場合は、「TIPの作成」、「"データ通信"」、「"CALL対応"」、および「"TRANSACTION対応"」を参照してください。 ただし、必要に応じてクライアント・アプリケーションのリファレンス・ドキュメントを利用できるように、最初にTIPを定義して生成することをお勧めします。
TIPとリモート・トランザクション・プログラムの通信の確保
リモート・ホストのトランザクション・プログラムとそれに関連するクライアント・アプリケーションのTIPは、 2つの重要な要件に対応している必要があります:
-
パラメータ
DATA
が定義されている方法に起因するパラメータのデータ型変換。 PGAUで生成されたTIPがデータ定義に基づいてデータをどのように変換するかについては、「データ型変換」を参照してください。 -
トランザクション
CALL
が定義されている方法から生じるAPPC送受信同期
これらのDATA
とCALL
の定義は、TRANSACTION
の定義で参照されます。
データ通信
PGAU DEFINE DATA
コマンドは、リモート・ホスト・トランザクションの言語でプログラミングされたデータ定義を使用して、 PGAU GENERATE
に必要な情報をPG DDに保存して、実行するTIP関数ロジックを作成します:
-
受信リモート・ホスト・トランザクションによって提供されるPL/SQL
IN
パラメータからのすべてのデータ変換 -
受信側のリモート・ホスト・トランザクションによって予期されるフォーマットへのすべてのバッファリング
-
送信側のリモート・ホスト・トランザクションによって提供されたフォーマットからバッファリングされていないすべてのデータ
-
送信リモート・ホストのトランザクションによって提供されるPL/SQL
OUT
パラメータへのすべてのデータ変換
PGAUは、リモート・ホスト・トランザクション・プログラムに含まれるデータ定義から変換およびバッファリング・ロジックを生成するために必要な情報を決定します。 PGAU DEFINE DATA
は、この情報をCOBOLコピーブックなどのファイルから、またはスクリプトからイン・ストリームに読み込み、繰り返し使用するためにPG DDに保存します。 ゲートウェイ管理者は、これらの定義ファイルをリモート・ホストからPGAUが実行されているOracleホストに転送する必要があります。
PG DDに格納されているデータ定義から、PGAU GENERATE
はリモート・ホスト・データ型を判別し、それを適切なPL/SQLデータ型に一致させます。 また、レコードとバッファ内のデータ長とオフセットを決定し、必要なPL/SQLロジックをTIPに生成します。 詳細については、「手続き型ゲートウェイ管理ユーティリティ」のPGAUの"DEFINE DATA"文と「管理ユーティリティのサンプル」の「"サンプルPGAU DEFINE DATA文"」文を参照してください。
後続の呼び出しでパラメータとして参照されるすべてのデータは、最初にPGAU DEFINE DATA
を使用して定義する必要があります。 単一の数字や文字列などの単純なデータ・アイテムや、レコードや構造などの複雑なマルチ・フィールド・データ集約を定義することができます。 PGAUは、クライアント・アプリケーションが生成されたTIPへの呼び出しを参照するために、同等のPL/SQL変数とフィールドまたは表のレコードを自動的に生成します。
説明したように、パラメータは、従業員番号などの単純なデータ・アイテム、従業員レコードなどの複雑なアイテムです。 PGAU DEFINE DATA
は、必要なデータ型情報を入力プログラムのデータ定義ファイルから自動的に抽出します。
この例では、empno
とemprec
は交換される引数です。
pgadb2i_main(trannum,empno,emprec)
したがって、これらのパラメータごとにPGAUのDEFINE DATA
文を発行する必要があります:
DEFINE DATA EMPNO PLSDNAME (EMPNO) USAGE (PASS) LANGUAGE (IBMVSCOBOLII) ( 01 EMP-NO PIC X(6). ); DEFINE DATA EMPREC PLSDNAME (DCLEMP) USAGE (PASS) LANGUAGE (IBMVSCOBOLII) INFILE("emp.cob");
trannum
引数には定義が必要ではないことに注意してください。 これはAPPC会話識別子であり、PGAUで定義する必要はありません。
CALL対応
APPC RECEIVE
とRECEIVE
を同期する必要があるということは、リモート・トランザクション・プログラムがデータ・パラメータの入力を期待すると、APPC RECEIVE
を発行してデータ・パラメータを読み取ることを意味します。 したがって、TIPは、ゲートウェイに、リモート・トランザクション・プログラムにデータ・パラメータを書き込むためのAPPCコードを発行させる必要があります。 また、リモート・トランザクション・プログラムがAPPC SEND
を発行したときに、ゲートウェイはAPPC SEND
を発行する必要があります。
PGAUのDEFINE CALL
文は、生成されたTIPがクライアント・アプリケーションによって呼び出される方法と、その呼び出しのためにリモート・ホスト・トランザクションと交換されるデータ・パラメータを指定します。 各PGAUのDEFINE CALL
文は、TIP関数の名前、1つ以上のデータ・パラメータ、および各データ・パラメータのIN/OUT
モードを指定することがあります。 データ・パラメータは、PGAUのDEFINE DATA
文で事前に定義されていなければなりません。 詳細については、「手続き型ゲートウェイ管理ユーティリティ」の"DEFINE CALL"および「管理ユーティリティのサンプル」の「"サンプルPGAU DEFINE CALL文"」を参照してください。
PGAU DEFINE CALL
処理は、PGAU GENERATE
によって後で使用するために、指定された情報をPG DDに保管します。 PGAU GENERATE
は、TIPパッケージ仕様で次を作成します:
-
CALL
で指定された各DATA
定義のPL/SQLパラメータで定義された各CALL
のpublic PL/SQL関数の宣言 -
パブリックPL/SQLデータ・パラメータの宣言
クライアント・アプリケーションは、PGAU DEFINE CALL
文で指定された関数名とパラメータ・リストを使用して、TIP public関数をPL/SQL関数呼び出しとして呼び出します。 また、クライアント・アプリケーションは、TIPパブリック・データ・パラメータと同じデータ型のプライベート変数を参照して宣言して、クライアント・アプリケーション内のデータの受け渡しや処理を容易にし、PGAU GENERATE
によって作成された宣言を共有することもできます。
この例では、次のPGAU DEFINE CALL
文を発行して、TIPパブリック関数を定義する必要があります:
DEFINE CALL DB2IMAIN PKGCALL (pgadb2i_main) PARMS ((empno IN),(emprec OUT));
フレキシブルなコール・シーケンス
各呼び出しでTIPとゲートウェイ間で交換されるデータ・パラメータの数は、リモート・トランザクション・プログラムのSEND/RECEIVE
リクエストが満たされている限り、ユーザーの裁量で変更できます。 たとえば、リモート・トランザクション・プログラムのデータ交換シーケンスは、次のようになります:
APPC SEND 5 fields (field1-field5) APPC RECEIVE 1 fields (field6) APPC SEND 1 field (field7) APPC RECEIVE 3 fields (field8 - field10)
結果のTIP/アプリケーション呼び出しシーケンスは次のようになります:
tip_call1(parm1 OUT, <-- APPC SEND field1 from remote TP parm2 OUT, <-- APPC SEND field2 from remote TP parm3 OUT); <-- APPC SEND field3 from remote TP tip_call2(parm4 OUT, <-- APPC SEND field4 from remote TP parm5 OUT); <-- APPC SEND field5 from remote TP tip_call3(parm6 IN OUT); --> APPC RECEIVE field6 in remote TP <-- APPC SEND field7 from remote TP tip_call4(parm8 IN, --> APPC RECEIVE field8 into remote TP parm9 IN, --> APPC RECEIVE field9 into remote TP parm10 IN); --> APPC RECEIVE field10 into remote TP
これらの4つのパブリック関数をTIPに定義するには、それぞれ固有のパブリック関数名(tip_callx
)と交換するデータ・パラメータ・リストを指定する4つのPGAU DEFINE CALL
文を発行する必要があります。 DEFINE DATA
を使用してデータ・アイテムを定義すると、任意のモード(IN
、OUT
、または IN OUT
)の複数の呼び出しで参照することができます。 たとえば、parm5
をparm6
の代わりに2回使用することができます。 これは、両方のインスタンスで同じデータが交換され、 tip_call2
のTIPとアプリケーションで受信され、おそらく更新されたtip_call4
のリモート・ホストに返されることを意味します。
また、リモート・トランザクション・プログラムの最初の5つのフィールドは、2つの別々のTIP関数呼び出し、tip_call1
およびtip_call2
によって読み取られます。 これは、それぞれ1つのOUT
パラメータの5つのTIP関数呼び出し、または5つのOUT
パラメータを持つ単一のTIP関数呼び出しでも同等に実行できます。 次に、リモート・トランザクション・プログラムの最初の読み取りフィールド(field6
)と後続の書き込みフィールド(field7
)は、単一のIN OUT
パラメータ(parm6
)を持つ単一のTIP関数呼び出し(tip_call3
)に対応します。
この1つのIN OUT
パラメータの使用は、field6
およびfield7
のリモート・トランザクション・プログラム・データ型が同じであり、parm6
のデータ型に対して実行された変換に対応することを意味します。 field6
とfield7
が異なるデータ型であった場合、それらは異なるPL/SQLパラメータに対応する必要があります(たとえば、parm6
IN
とparm7
OUT
)。 ただし、1つのTIP呼び出しで2つのパラメータとして、または2つのTIP呼び出しでそれぞれ1つのパラメータとして交換できます。
最後に、残りの3つのRECEIVE
フィールドのリモート・トランザクション・プログラムは、tip_call4
パラメータ8〜10によって提供されます。 また、3つのTIPコールで1つのパラメータを渡すことも、2つのTIPコールを1つのコールで1つのパラメータを渡し、2つのパラメータをどちらかの順序で渡すこともできます。 この柔軟性により、ユーザーは、ユーザーに最も適した方法で、リモート・トランザクション・プログラム動作とTIP機能コールとの間の対応関係を定義することができます。
連絡文書のオーダー制限を呼び出す
各TIP公開関数は、OUT
パラメータを受け取る前に、まずすべてのIN
パラメータを送信します。 したがって、1つのフィールドを送信し、次に1つのフィールドを受信することを予期するリモート・トランザクション・プログラムは、別個のTIP呼び出しに対応しなければならない。
次に例を示します。
tip_callO( parmO OUT); <-- APPC SEND outfield from remote TP
PGAXFER
RPCは最初に送信するパラメータをチェックしますが、見つからずパラメータを受け取るようになります:
tip_callI( parmI IN); --> APPC RECEIVE infield to remote TP
PGAXFER
RPCは、送信するパラメータを処理し、受信するパラメータをチェックしますが、noneとcompletesを検出します。したがって、OUT
パラメータとそれに続くIN
パラメータを持つ単一のTIP public関数は動作しません。これは、パラメータ・リスト内の位置に関係なく、IN
パラメータが最初に処理されるためです。
TRANSACTION対応
リモート・ホスト・トランザクションは、PGAU DEFINE TRANSACTION
文で定義され、トランザクションがサポートするCALL
の以前の定義への追加参照があります。
次のようなリモート・ホスト・トランザクション属性を指定します:
-
トランザクションIDまたは名前
-
ネットワーク・アドレスまたはロケーション
-
システム・タイプ(IBM370など)
-
リモート・ホストのOracleナショナル・ランゲージ
注意:
PL/SQLパッケージ名は、トランザクションの定義時に指定されます。これは、TIPが参照される名前であり、TIPに含めるためにpublic関数が呼び出す名前です。 各パブリック関数は、PG DDに格納されているPGAUの
DEFINE CALL
文で事前に定義されていなければなりません。GENERATE
文にパッケージ名(TIP名)を指定しないと、指定したトランザクション名がデフォルトでパッケージ名になります。 その場合、トランザクション名(tname)
は一意でなければならず、PL/SQLパッケージを含むデータベース内の有効なPL/SQL構文でなければなりません。詳細については、「手続き型ゲートウェイ管理ユーティリティ」の"DEFINE TRANSACTION"および「管理ユーティリティのサンプル」の「"サンプルPGAU DEFINE TRANSACTION文"」を参照してください。
この例では、次のDEFINE TRANSACTION
文を使用して、DB2I
というリモートCICSトランザクションを定義します:
DEFINE TRANSACTION DB2I CALL ( DB2IMAIN, DB2IDIAG ) SIDEPROFILE(CICSPROD) TPNAME(DB2I) LOGMODE(ORAPLU62) SYNCLEVEL(0) NLS_LANGUAGE("AMERICAN_AMERICA.WE8EBCDIC37C");
クライアント・アプリケーションからTIPを呼び出す
TIPが作成されたら、クライアント・アプリケーションをTIPとのインタフェースに書き込む必要があります。 TIP関数を呼び出すクライアント・アプリケーションには、5つの論理セクションが含まれている必要があります:
-
TIP変数を宣言
-
会話を初期化
-
データの交換
-
会話を終了
-
エラー処理
TIP変数の宣言
tipname.doc
ファイルのユーザー宣言セクションは、必要な宣言を文書化します。
TIP関数の呼び出しでPL/SQLパラメータを渡す場合、クライアント・アプリケーションは、TIP関数の引数には、仕様セクションのTIPで定義されているものとまったく同じPL/SQLデータ型を使用する必要があります。 たとえば、以下がTIP仕様、またはtipname.doc:
にあるとします
FUNCTION tip_call1 tranuse, IN BINARY_INTEGER, tip_var1 io_mode pls_type1, tip_record io_mode tran_rectype) RETURN INTEGER; TYPE tran_rectype is RECORD (rec_field1 pls_type1, ... rec_fieldN pls_typeN);
「表4-2」は、関数宣言の説明を提供します:
表4-2 関数宣言
項目 | 説明 |
---|---|
|
パッケージ仕様で定義されているTIP関数名。 |
|
このTIP呼び出しがデータを交換する会話を識別するTIP init関数から返されたリモート・トランザクション・インスタンス・パラメータ。 |
|
|
|
PL/SQLアトミック・データ型です。 |
|
PL/SQLレコード・フィールドは、リモート・トランザクション・プログラム・レコード・フィールドに対応しています。 |
クライアント・アプリケーションでは、PL/SQLアトミック・データ型は、TIP関数定義の対応する引数とまったく同じデータ型として定義する必要があります。 BEGIN
コマンドの前に、次のコードをクライアント・アプリケーションでコーディングする必要があります:
appl_var pls_type1; /* declare appl variable for .... */
TIPデータ型を再定義する必要はありません。 BEGIN
の前にクライアント・アプリケーションに表示される、クライアント・アプリケーション内でlocally
として宣言されている必要があります:
appl_record tipname.tran_rectype; /* declare appl record */
「表4-3」はコマンドライン引数を記述します:
表4-3 コマンドライン引数
項目 | 説明 |
---|---|
|
パッケージ仕様で定義されているTIP関数名。 |
|
このTIP呼び出しがデータを交換する会話を識別するTIP init関数から返されたリモート・トランザクション・インスタンス・パラメータ。 |
|
|
参照可能なユーザー宣言の完全な説明については、tipname
.doc
コンテンツ・ファイルを参照してください。
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP public関数を呼び出します:
rc = tip_call1( tranuse, appl_var, appl_record);
CICS-DB2の照会の例では、PL/SQLドライバpgadb2id.sql
(%ORACLE_HOME%\dg4appc\demo\CICS
ディレクトリにMicrosoft Windowsディレクトリに配置されているおよびUNIXベースのシステム用に$ORACLE_HOME/dg4appc/demo/CICS
ディレクトリがクライアント・アプリケーションであり、次の宣言が含まれています:
... ... CREATE or REPLACE PROCEDURE db2idriv(empno IN CHAR) IS tranuse INTEGER :=0 /* transaction usage number */ DCLEMP PGADB2I.DCLEMP_typ; /* DB2 EMP row definition */ DB2 PGADB2I.DB2_typ; /* DB2 diagnostic information */ rc INTEGER :=0 /* PGA RPC return codes */ line VARCHAR2(132); /* work buffer for output */ term INTEGER :=0; /* 1 if pgadb2i_term called */ ... ...
会話の初期化
の呼び出しは、会話を初期化するためにいくつかの目的を果たします:
-
PL/SQLパッケージ(TIP)をロードし、TIP初期化セクションでプログラミングされた初期化ロジックを実行するには。
-
TIP init関数が
PGAINIT
リモート・プロシージャ・コール(RPC)を呼び出すと、リモート・トランザクション・プログラム(RTP)との通信が確立され、トランザクション・インスタンス番号がアプリケーションに返されます。
オプションで、会話を初期化するための呼び出しを使用して、次のことを行うことができます:
-
デフォルトのRHT/OLTP識別、ネットワーク・アドレス属性、会話セキュリティのユーザーIDとパスワードを上書きします。
-
TIPが生成する診断トレースを指定します。 診断トレースの詳細については、「トラブルシューティング」を参照してください。
PGAUで生成されたTIPは、クライアント・アプリケーションが呼び出すことができる4つの異なる初期化関数を提供します。 これらはすべて同じ名前の関数がオーバーロードされますが、渡されるパラメータの型は異なります。
3つの初期化パラメータが渡されます:
-
RHT会話識別のトランザクション・インスタンス番号。
tranuse
パラメータは、すべてのTIP初期化で必要です。 -
TIPランタイム診断コントロールのTIP診断フラグ。
tipdiag
パラメータはオプションです。 TIP診断については、「トラブルシューティング」を参照してください。 -
TIPのデフォルトの上書きは、OLTP属性とネットワーク属性を上書きします。
override
パラメータはオプションです。
以下の4つの機能は、TIPコンテンツのドキュメント・ファイルに表示されるように表示されています。 クライアント・アプリケーションの使用例については後で説明します。
TYPE override_Typ IS RECORD ( tranname VARCHAR2(255), /* Transaction Program */ transync BINARY_INTEGER, /* RESERVED */ trannls VARCHAR2(50), /* RESERVED */ oltpname VARCHAR2(255), /* Logical Unit */ oltpmode VARCHAR2(255), /* LOG Mode Entry */ netaddr VARCHAR2(255), /* Side Profile */ oltpuser VARCHAR2(8), /* userid for OLTP access */ oltppass VARCHAR2(8)); /* password for OLTP access*/ FUNCTION pgadb2i_init( /* init standard */ tranuse IN OUT BINARY_INTEGER) RETURN INTEGER; FUNCTION pgadb2i_init( /* init override */ tranuse IN OUT BINARY_INTEGER, override IN override_Typ) RETURN INTEGER; FUNCTION pgadb2i_init( /* init diagnostic */ tranuse IN OUT BNARY_INTEGER, tipdiag IN CHAR) RETURN INTEGER; FUNCTION pgadb2i_init( /* init over-diag */ tranuse IN OUT BINARY_INTEGER, override IN override_Typ, tipdiag IN CHAR) RETURN INTEGER;
トランザクション・インスタンス・パラメータ
このトランザクション・インスタンス番号(例ではtranuse
)は、後続のTIP交換および終了機能に渡す必要があります。 ゲートウェイは、APPC会話(したがって、リモート・トランザクション・プログラムの反復)がデータが送信されるか、通信が終了するかを識別します。
単一のクライアント・アプリケーションが、同じリモート・トランザクション・プログラムまたは複数の異なるリモート・トランザクション・プログラムの複数のインスタンスを同時に制御する可能性があります。 トランザクション・インスタンス番号は、クライアント・アプリケーション・コールをゲートウェイを介して意図されたリモート・トランザクション・プログラムにルーティングするためのTIPのメカニズムです。
各アクティブ・トランザクションのトランザクション・インスタンス番号を保存し、そのトランザクションのために呼び出される各TIP関数に正しいものを渡すのはクライアント・アプリケーションの責任です。
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP初期化関数を呼び出します。 次に例を示します。
... ... tranuse INTEGER := 0;/* transaction usage number*/ ... ... BEGIN rc := pgadb2i.pgadb2i_init(tranuse); ... ...
TIP初期化のオーバーライド
前述の例では、クライアント・アプリケーションはリモート・トランザクション・プログラム名、ネットワーク接続、またはセキュリティ情報を指定していないことに注意してください。 TIPはそのような情報を内部的にデフォルトとしてコード化しており、クライアント・アプリケーションは選択されたリモート・トランザクション・プログラムに対して適切なTIPを単に呼び出すだけです。 ただし、クライアント・アプリケーションは、オプションでTIPのデフォルトを上書きしてセキュリティ情報を提供することもできます。
上書きを必要としないクライアント・アプリケーションを変更する必要はありません。
リモート・ホスト・トランザクションがPG DDで定義されている場合、DEFINE TRANSACTION
文は、デフォルトのOLTPおよびネットワーク識別属性を指定しました。これらの属性はオーバーライドできます:
-
TPname
-
LUname
-
LOGMODE
-
Side Profile
DEFINE TRANSACTION
文の詳細については、「手続き型ゲートウェイ管理ユーティリティ」の"DEFINE TRANSACTION"を参照してください。
これらのPG DD定義のトランザクション属性は、デフォルトとしてTIPに生成され、TIP初期化時にオーバーライドできます。 これにより、テスト・トランザクションまたはシステムで使用できる1つのTIPの使用が容易になり、後でTIPを再生成することなく、本番トランザクションまたはシステムで使用することができます。
override_Typ
レコードのデータ型は、クライアント・アプリケーションによってオーバーライドされるさまざまなトランザクション属性を記述します。 現在、次の 上書きがサポートされています:
-
tranname
は、DEFINE TRANSACTION
文のTPNAME
パラメータで指定された値をオーバーライドするように設定できます -
oltpname
は、DEFINE TRANSACTION
文のLUNAME
パラメータで指定された値をオーバーライドするように設定できます -
oltpmode
は、DEFINE TRANSACTION
文のLOGMODE
パラメータで指定された値をオーバーライドするように設定できます -
netaddr
は、DEFINE TRANSACTION
文のSIDEPROFILE
パラメータで指定された値をオーバーライドするように設定できます
PG DDで定義されているトランザクション属性に加えて、会話セキュリティ・ユーザーIDと会話セキュリティ・パスワードの2つのセキュリティ関連パラメータがあり、TIP初期化時に上書きできます。 これらのパラメータの値は、通常、ゲートウェイへのアクセスに使用されるデータベース・リンクまたはOracleデータベース・セッションのいずれかから取得されます。 OracleデータベースのユーザーIDがOLTPシステムにアクセスするのに十分でない場合があります。 ユーザーIDとパスワードの上書きは、これらのパラメータをOLTPシステムに指定する方法を提供します。
現在、次のオーバーライドがサポートされています:
-
oltpuser
は、OLTPとの会話を初期化するために使用されるユーザーIDを無効にするように設定できます -
oltppass
は、OLTPとの会話を初期化するために使用されるパスワードを無効にするように設定できます
セキュリティ・オーバーライドは、PGA_SECURITY_TYPE=PROGRAM
がゲートウェイ初期化ファイルで指定され、OLTPシステムが着信対話リクエストでユーザーIDとパスワードを受け入れるように構成されている場合にのみ有効です。
transync
(APPC SYNCLEVEL
)およびtrannls
(グローバリゼーション・サポート・キャラクタ・セット)は、オーバーライド・レコード・データ型で定義されますが、将来の使用のために予約されています。 RHTのSYNCLEVEL
およびグローバリゼーション・サポート名は、オーバーライドできません。
次の理由により、クライアント・アプリケーションはTIPの初期化時にデフォルトの属性を上書きする可能性があります:
-
別のバージョンのRHTを開始する(テストの代わりにプロダクションなど)
-
RHTを含むOLTPのロケーションを変更する(OLTPが移動またはバックアップ構成への切り替えによって移動された場合)
オーバーライドを必要とするクライアント・アプリケーションでは、オーバーライド・パラメータと初期化パラメータの任意の組み合わせを使用することができ、TIPを再生成したり、パラメータをオーバーライドしないアプリケーションに影響を与えることなく、。
TIPのデフォルトをオーバーライドするには、追加のクライアント・アプリケーション・レコード変数をoverride_Typ
データ型として宣言し、値をオーバーライド・サブ・フィールドに割り当てる必要があり、オーバーライド・レコード変数をクライアント・アプリケーションからのTIP初期化呼び出しで渡す必要があります。
次に例を示します。
... ... my_overrides pgadb2i.override_Typ; -- declaration ... ... my_overrides.oltpname := 'CICSPROD'; -- swap to production CICS my_overrides.tranname := 'TNEW'; -- new transaction name BEGIN rc := pgadb2i.pgadb2i_init(tranuse,my_overrides); -- init ... ...
TIP内で、上書き属性の構文上の問題がチェックされ、ゲートウェイ・サーバーに渡されます。
データの交換
クライアント・アプリケーションは、以前のtip_init
呼び出しから返されたトランザクション・インスタンス番号を渡して、影響を受けるリモート・トランザクション・プログラムを識別し、リモート・トランザクション・プログラムと交換されるクライアント・アプリケーション・データ・パラメータを識別する必要があります。
このCICS-DB2照会の例では、従業員番号を渡して従業員レコードを戻します:
rc = pgadb2i.pgadb2i_main(tranuse, /* transfer data */ empno, /* employee number */ DCLEMP); /* return employee record*/
会話を終了
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP終了関数を呼び出します。 次に例を示します。
... ... term := 1; /* indicate term called* */ rc := pgadb2i.pgadb2i_term(tranuse,0); /* terminate normally */ ... ...
トランザクションを終了するためにトランザクション・インスタンス番号がTIP終了コールに渡された後、またはリモート・トランザクション・プログラムが異常終了した後、その特定のトランザクション・インスタンス番号を忘れる可能性があります。
エラー処理
クライアント・アプリケーションには、クライアント・アプリケーションが終了する前にアクティブなAPPC会話をクリーンアップできる例外ハンドラが含まれている必要があります。 pgadb2id.sql
で提供されているサンプル・クライアント・アプリケーションには、例外処理の例が含まれています。
ゲートウェイの例外は、PGA-20900からPGA-20999の範囲で報告されます。 例外が発生した場合、TIP初期化関数への以前の呼び出しによって開始されたアクティブな会話に対して、TIP終了関数を呼び出す必要があります。
次に例を示します。
EXCEPTION WHEN OTHERS THEN IF term = 0 THEN /* terminate function not called yet */ rc := pgadb2i.pgadb2i_term(tranuse,1); /*terminate abnormally*/ END IF; RAISE; ... ...
リモート・トランザクションには、デバッグ情報をCICS一時記憶域キュー領域に書き込むなど、エラー処理とデバッグのための規定も含まれている必要があります。 Oracleの例外を傍受して処理する方法については、「Oracle Database PL/SQL言語リファレンス」を参照してください。
実行権限の付与
TIPは標準のPL/SQLパッケージであり、クライアント・アプリケーションからTIPを呼び出すユーザーに実行権限を与える必要があります。 この例では、PGADB2I
パッケージのexecuteをユーザーSCOTT
に付与します:
GRANT EXECUTE ON PGADB2I TO SCOTT
詳細については、「Oracle Database管理者ガイド」を参照してください。
アプリケーションの実行
クライアント・アプリケーションを実行する前に、ホストへの接続が確立され、受信パートナが使用可能であることを確認してください。 この例では、PL/SQL driver DB2IDRIV
を使用してCICS-DB2照会を実行します。 このクライアント・アプリケーションを実行するには、SQL*Plusから次のように入力します:
set serveroutput on
execute DB2IDRIV('nnnnnn')
;
APPC会話の共有
複数のTIPは、同じ会話を共有している1つ以上のRemote Host Transactions (RHT)と同じAPPC会話を共有できます。 この機能には2つの利点があります:
-
会話の制御を渡すことに依存する既存のRHTは、Oracle Database Gateway for APPCによってサポートされています。
-
そうでなければPL/SQLのコンパイルには大きすぎるTIPは、RHTに変更を加えることなく、クライアント・アプリケーションに同じ関数呼び出しとデータ定義のセットを提供する、より少ないユーザー定義関数を持つ複数の小さなTIPに分けることができます。
APPC会話の共有の概念
IMSなどのメインフレームのOLTPでは、トランザクションが別のトランザクションを呼び出すときにトランザクションを渡すことで、トランザクションが単一のAPPC会話を共有することができます。 RHTはPGAUが呼び出し、入力、出力を持つ単一のトランザクションとしてPGAUに定義され、PGAUはその特定のRHTに対応する初期化、転送、および終了機能を持つ単一のTIPを生成します。
TIPごとに生成されるロジックは、そのTIPが次のいずれかを可能にします:
-
init関数が呼び出されたときに新しい会話を開始する、または
-
そのユーザー定義関数が呼び出されたときに既存の会話でデータを転送
-
その"用語"機能が呼び出されたときに既存の会話を終了させる。
APPC会話は、複数のTIPによって共有され管理されるリソースとして扱われます。 どんなTIPもAPPC会話の唯一のユーザーであるという要件はありません。
3.4.0以降で生成されたTIPは、次のいずれかのサービスの組み合わせを実行できます:
-
開始
-
開始して転送
-
開始、転送、および終了(標準操作)
-
transfer
-
転送して終了
-
終了
-
開始して終了する(他のTIPが転送を実行することを前提とする)
単一のAPPC会話は、次の方法で共有できます:
-
1つのTIPから複数のRHTへ
-
複数のTIPから1つのRHTへ
-
複数のTIPから複数のRHTへ
APPC会話共有がなければ、クライアント・アプリケーションが呼び出す必要のあるすべてのRHTのすべての機能とデータを含む単一のTIPを定義する必要があります。 RHTのスーパーセットを持つTIPを作成すると、そのようなTIPがPL/SQLがコンパイルするには大きすぎることがよくあります。
逆に、APPC会話共有では、各RHT (または複数の異なるデータ交換操作を実行するRHTのそれぞれのRHTデータ交換)も、PL/SQLコンパイル制限を超えて小さくなる単一のTIPで定義できます。
APPC会話の共有の使用
APPC会話共有は、3.4.0以降で生成されたすべてのTIPで自動的に使用できます。 3.4.0より前に生成されたTIPは、APPC会話の共有に参加できません。 3.4.0より前に生成されたTIPは、PGAU 3.4.0を使用して再生成する必要があります。APPC会話の共有に参加することができます。 再生成されたTIP本文(tipname
.pkb
)のみが再コンパイルされていれば、PGAUは上位互換性があり、再生成は透過的でなければなりません。 TIP仕様も再コンパイルされている場合、クライアント・アプリケーションも再コンパイルが必要です。 詳細については、「TIP内部」を参照してください。
TIPの定義と生成は、第1章、第2章、第3章ですでに説明したとおりに行われます。 追加のオプションやパラメータを指定する必要はありません。
APPC会話共有の実行時使用は、クライアント・アプリケーションの制御下にあります。 これは、会話を共有するTIPのうちの1つのinit関数を呼び出し、返されたtranuse
値をそれぞれが所望の順序で呼び出されるときに他のTIP関数に渡すことによって達成される。 すべてのTIPが同じDEFINE TRANSACTION TPNAME
またはSIDEPROFILE
値で定義されている場合は、任意のTIP init関数を使用できます。 TPNAME
またはSIDEPROFILE
の値は、どのRHTを初期化するかを指定します。
会話を初期化するためにAPPC会話共有可能TIPのinit関数が呼び出されると、返されたtranuse
値は会話共有が有効であることを示します。 他のTIPで関数を呼び出すときに同じtranuse
値を渡すことで、他のTIPは、関連するすべてのTIPがバージョン3.4.0以降で生成されていれば、既に初期化された同じ会話で転送を実行します。
APPC会話共有TIP互換性
データベース・ゲートウェイの3.4.0以降で生成されたTIPは、3.4.0より前のTIPよりもtranuse
に異なる値を使用します。 3.4.0より前のTIPを使用して会話を初期化し、そのtranuse
値が3.4.0以降の生成されたTIPに渡された場合、次の例外が発生します:
ORA-20704 PGA_TIP: tranuse value cannot be shared
しかし、3.4.0より前に生成されたTIPは、共有された対話のための異なるtranuse
値を検出しません。そのため、予期しないエラーが発生する可能性があります。
注意:
共有会話で呼び出されるすべてのTIPは、3.4.0以降で生成されている必要があります。
3.4.0より前に生成されたTIPは、APPC会話の共有に参加できません。
tranuse
の値は、3.4.0より前のリリースと3.4.0以降のリリースとの間で互換性がありません。 これは、次の理由であなたのために問題を引き起こすべきではありません: 3.4.0より前には、TIPで定義されたすべてのRHT関数がそのTIP関数を通して呼び出されなければならず、その同じTIPのinit関数が最初に呼び出されて会話が初期化されなければなりませんでした。 tranuse
の値は、それを初期化したTIPに対してのみ有効でした。 したがって、プログラミングを変更しない限り、既存のアプリケーションで誤ってtranuse
の値を混在させることはできません。
3.4.0より前のTIPとクライアント・アプリケーションは変更なしで引き続き使用でき、古いクライアント・アプリケーションは変更なしで新しい3.4.0以降のTIPを呼び出すことができます。 これは、古いTIP本文が再生成され、コンパイルされたときに可能になります。古いクライアント・アプリケーションが変更されていなくても、TIPはAPPC会話の共有が可能になりました。
3.4.0より前のTIPの機能のどれもAPPC会話を共有することはできません。 ただし、TIPが3.4.0以降で再生成されると、その機能のいずれかがAPPCの会話を共有できます。
大きすぎるTIPのAPPC会話共有
会話共有を使用して、コンパイルするには大きすぎるTIPを回避することができます。 これは'PLS-00123 - package too large to compile
'、またはPL/SQLコンパイルのようなその他の問題の症状によって識別されます。 この場合、元のTIPから削除する関数呼び出しを選択し、新しいTIPを定義する必要があります。
具体的には、どの PGAU DEFINE CALL
文とそれに関連する DEFINE DATA
文を古いPGAU制御ファイル(.ctl
)から1つ以上の新しいPGAU制御ファイルに移動するかを決定する必要があります。 さらに、各新しいTIPを定義する新しいPGAU制御ファイルにどのP GAU DEFINE TRANSACTION
文を含めるべきかを決定する必要があります。
いくつかのPGAU文を考慮する必要があります。PGAU文のリストとその説明については、「表4-4」を参照してください:
表4-4 PGAUのステートメント
文 | 説明 |
---|---|
|
一意である必要があります。 |
|
一意である必要があります。 |
|
新しいTIPが必要な場合にそれぞれ指定され、以前の大きなTIPから新しいTIPに移動した呼び出し定義を参照します。 トランザクション属性は変更されません。 これにより、新しいTIPは、以前の大きなTIPと同じRHTで同じ初期化または終了を実行できます。 以前の大きなTIPの古い |
APPC会話の共有の例
RHT A
、B
、C
の存在を仮定し、RHT A
はメニュー選択を実行し、問合せ機能の場合はRHT B
を呼び出し、選択関数の後の更新の場合はRHT C
を呼び出します。
次のDATA
とCALL
を定義できます:
-
DEFINE DATA
choice ...
-
DEFINE DATA
input ...
-
DEFINE DATA
answer ...
-
DEFINE DATA
record ...
-
DEFINE CALL menu_A callname(pick) parms(choice in);
-
DEFINE CALL query_B callname(query) parms((input in), (answer out));
-
DEFINE CALL update_C callname(update) parms(record in);
-
DEFINE CALL select_C callname(select) parms(record out);
以下のTIPの例を定義することができます:
例1
この例では、APPC会話共有は使用しませんが、RHTs A
、B
、C
の機能を組み合わせて、リリース3.4.0より前に作成された有効なTIP定義です。
DEFINE TRANSACTION rhtABC calls(menu_A, query_B, update_C, select_C) tpname(RHTA);
このTIPにはすべてのデータ定義と呼び出しが含まれており、コンパイルするには大きすぎる可能性があります。 このTIPでは、1つのTIP、rhtABC
のみが存在するため、APPC会話共有は使用されません。 ただし、RHTはリモート・ホストで会話の通常の共有を実行します。 TIPがコンパイルできるほど小さい場合、クライアント・アプリケーションはTIP関数を次のように呼び出します:
rc := rhtABC.rhtABC_init(tranuse); rc := rhtABC.pick(tranuse, choice); rc := rhtABC.query(tranuse, input, answer); rc := rhtABC.update(tranuse, record); rc := rhtABC.select(tranuse, record); rc := rhtABC.rhtABC_term(tranuse);
例2
この例では、RHT A
、B
、およびC
の機能を3つのTIPに分けて、APPC会話共有を使用して一連のTIPを定義する方法を示します:
DEFINE TRANSACTION rhtA calls(menu_A) tpname(RHTA); DEFINE TRANSACTION rhtB calls(query_B) tpname(RHTA); DEFINE TRANSACTION rhtC calls(update_C, select_C) tpname(RHTA);
各TIPには必要なコールとデータだけが含まれ、各TIPは自動的にAPPC会話の共有を実行します。 クライアント・アプリケーションは、以下のようにこれらの関数を呼び出します:
rc := rhtA.rhtA_init(tranuse); rc := rhtA.pick(tranuse, choice); rc := rhtB.query(tranuse, input, answer); rc := rhtC.update(tranuse, record); rc := rhtC.select(tranuse, record); rc := rhtB.rhtB_term(tranuse);
2つの例の唯一のクライアント・アプリケーションの違いは、各TIP呼び出しのスキーマ修飾子にあります。 これは、呼び出される関数が異なるTIPにあり、データベース内に異なるパッケージ名を持つためです。
APPC会話の共有を使用するためには、新しいDEFINE TRANSACTION
文のみが必要でした。 CALL
とDATA
の定義はそのまま使用されていました。 これは、古いTIP rhtABC
がまだ定義されていて、まだコンパイルするには大きすぎる可能性があることを意味します。
例3
サンプル2を実行したが、TIPが大きすぎてコンパイルできないと思われる場合は、次のように試してみてください:
DEFINE TRANSACTION rhtABC calls(menu_A) tpname(RHTA); DEFINE TRANSACTION rhtB calls(query_B) tpname(RHTA); DEFINE TRANSACTION rhtCU calls(update_C) tpname(RHTA); DEFINE TRANSACTION rhtCS calls(select_C) tpname(RHTA);
TIP rhtABC
には3つの機能が削除されているため、コンパイルがよりコンパクトになりました。 TIP rhtB
には1つの機能があり、対応するホスト機能が1つのRHTに残っていても、TIP rhtC
は2つのTIPに分割されています。
クライアント・アプリケーションは、以下のようにこれらの関数を呼び出します:
rc := rhtB.rhtB_init(tranuse); rc := rhtABC.pick(tranuse, choice); rc := rhtB.query(tranuse, input); rc := rhtCU.update(tranuse, record); rc := rhtCS.select(tranuse, record); rc := rhtABC.rhtABC_term(tranuse);
すべてのTIPにinit関数とterm関数が含まれており、DEFINE TRANSACTION
文がすべて同じtpname(RHTA)
を指定しているため、同じリモート・ホスト・トランザクションが常に初期化のために呼び出されるため、初期化には別のTIPが使用されます。
APPC会話の共有の上書きと診断
TIPのデフォルトのオーバーライド・パラメータは、初期化を実行するために呼び出されたTIPのinit関数で処理されます。 APPC会話が確立されると、優先パラメータの更なる共有は必要ありません。 上書きをTIP init関数に渡すだけで何もする必要はありません。
TIP診断パラメータは、所定の会話を共有するすべてのTIP間で共有されます。 実際に、初期化を実行しているTIPの診断をリクエストすると、会話を共有しているすべてのTIPに対して同じ診断がリクエストされます。 会話を共有している複数のTIPから診断をリクエストすることはできません。 アプリケーション・デザイナまたはユーザーは、TIPランタイム・トレース・コントロールをTIP init関数に渡すだけで済みます。
マルチバイト文字セット・サポートによるアプリケーション開発
COBOLは現在、 PIC G
データ型のダブル・バイト文字セット(DBCS)のみをサポートしています。
PGAUは、COBOLII PIC G
データ型をPL/SQL VARCHAR2
変数として処理し、リモート・ホスト・データおよびローカルOracleデータ用に指定されたOracle NLS_LANGUAGE
に従ってデータを自動的に変換するTIPを生成します。
これらのOracle NLS_LANGUAGE
は、リモート・トランザクションを使用してTIPによって交換されるすべてのPIC G
データのデフォルトとして指定できます(DEFINE TRANSACTION
...
REMOTE_MBCS
またはLOCAL_MBCS
を参照)。 任意の個々のPIC G
データ・アイテムのOracle NLS_LANGUAGE
をさらにオーバーライドすることができます(REDEFINE DATA
...
REMOTE
またはLOCAL_LANGUAGE
を参照)。
DBCSデータは、サポートされているDBCS文字セットの任意の組み合わせでエンコードできます。 たとえば、レコード内の各データ・フィールドに異なるコードページを許可するリモート・ホスト・アプリケーションは、Oracle Database Gateway MBCSサポートでサポートされています。
PIC X
アイテムでのREDEFINE DATA ... REMOTE_LANGUAGE
またはLOCAL_LANGUAGE
の使用もサポートされています。 したがって、TIPは、指定されたPIC X
データ・フィールドに対して、残りのPIC X
データ・フィールドに対してデフォルトでSBCS変換に加えて、DBCSまたはMBCS変換を実行できます。 デフォルトのSBCS変換は、DEFINE TRANSACTION... NLS_LANGUAGE
およびローカルOracleのデフォルトLANGUAGE
環境値に従います。
PGAUがTIPを生成すると、PIC G
データ型はPL/SQL VARCHAR2
データ型に変換されます。 TIPによる変換後、受信した'PIC G' VARCHAR2
データ型は、シフト・アウトおよびシフト・イン・メタ文字の削除により最大長以下の長さを持つことができ、送信された'PIC G'
RAWは、必要に応じてシフト・アウトおよびシフト・イン文字を挿入します。リモート・ホストの文字セットが指定されています。
これは、常に既知の固定長であるPIC X
データに対して実行される変換とは異なります。したがって、PIC X
データ・フィールドのTIPでCHAR
データ型が使用されます。 ただし、PIC X
フィールドにDBCSまたはMBCSデータが含まれている場合でも、必要に応じてCHAR
変数が使用され、空白が埋められます。
一部のリモート・ホスト・アプリケーションは、 PIC G
フィールドをPIC X
バイトで囲み、シフト・アウト、メタ文字のシフト・インに使用されます。 そのようなCOBOL定義は次のようになります:
01 MY_RECORD. 05 SO PIC X. 05 MY_SBCS_DATA PIC G(52). 05 SI PIC X.
3つのフィールドはすべて、変換が実行されるときに別々のデータ・アイテムとして定義され、処理されるため、これはPGAUによって正しく処理されません。
適切に処理されるためには、PGAUへの定義入力は次のようにする必要があります:
01 MY_RECORD. 05 MY_MBCS_DATA PIC G(51).
PGAUのREDEFINE DATA
文は、フィールドSO
およびSI
にUSAGE(SKIP)
を指定し、MY_MBCS_DATA
を再定義するために'05 MY_MBCS_DATA PIC G(51).'
に指定することによって、3フィールド定義を1フィールド定義に再定義できます。 3つのREDEFINE
文をPGAU入力制御ファイルに入れることができるため、リモート・ホスト定義を変更する必要はありません。
APPCを使用するための端末指向トランザクションの変更
リモート・トランザクション・プログラムには、APPC会話を開始、通信、および終了するためにマップされたAPPC verbが含まれている必要があります。 ただし、リモート・トランザクション・プログラムが端末指向の場合は、次のオプションを使用できます:
-
端末ロジックをアプリケーションとI/Oロジックから分離することができます。 この分離が達成されると、ゲートウェイ・コールとトランザクション・アプリケーション・ロジックとの間のインタフェースに小さなフロントエンド・リモート・トランザクション・プログラムを書き込むことができます。 たとえば、CICSでは、CICS
LINK
を使用してこの手法を実装します。 -
既存のプログラムを変更して、APPC呼び出しが組み込まれるようにすることができます。 この例では、
PGADB2I
を使用して、次のようにCICSとその関連マップAPPC verbを使用します:-
EXEC CICS
ASSIGN
は、ゲートウェイによって開始された会話を受け入れます。 -
EXEC CICS
RECEIVE
が引数を受け取ります。 -
EXEC CICS
SEND
は結果を終了します。 -
EXEC CICS
RETURN
は会話を終了します。
-
-
端末指向のトランザクションを変更しない場合は、端末指向プログラムとゲートウェイの間に、IBM CorporationのCICS Transaction Server for z/OSなどのAPPC対応インタフェースを挿入できます。
-
IMS/TMでは、既存の変更されていないIMSトランザクションに暗黙のAPPC機能を使用してゲートウェイを使用してアクセスできます。 暗黙のAPPCを使用すると、I/O PCBを使用する標準DLI GU、GN、およびISRT呼び出しは、IMSトランザクションがAPPCを介して呼び出されるときに、適切なAPPC送信または受信呼び出しに自動的に変換されます。
TIPを使用するために必要な特権
実行権限は、TIPまたは手続きの呼び出し元に明示的に付与されなければなりません。 この権限は、ロールを介しては付与できません。
TIPをトレースしたいTIPユーザーは、rtraceおよびptraceプロシージャに対する実行特権を与える必要があります。 詳細については、インストール・ガイドの通信プロトコルに適した章のPGAUの構成を参照してください。
たとえば、Microsoft Windowsでは次のように指定します。
C:\> sqlplus pgaadmin\pw@database_specification_string SQL> grant execute on pgaadmin.purge_trace to tip_user_userid; SQL> grant execute on pgaadmin.read_trace to tip_user_userid;
UNIXベースのシステムの場合:
$ sqlplus pgaadmin/pw@database_specification_string SQL> grant execute on pgaadmin.purge_trace to tip_user_userid; SQL> grant execute on pgaadmin.read_trace to tip_user_userid;
TIPが開発された後、TIPユーザーはTIP所有者によってTIPに対する実行特権を与えられなければなりません。 TIP所有者は通常PGAADMIN
ですが、PGDDDEF
またはPGDDGEN
のロールを付与された別のユーザーになることもできます。
たとえば、Microsoft Windowsでは次のように指定します。
C:\> sqlplus tip_owner\pw@database_specification_string SQL> grant execute on tipname to tip_user_userid;
UNIXベースのシステムの場合:
$ sqlplus tip_owner/pw@database_specification_string SQL> grant execute on tipname to tip_user_userid;
ここで、UTL_PG
は、ゲートウェイUTL_RAW
およびUTL_PG
コンポーネントがインストールされたOracleデータベースのUTL_PG
UTL_PG
識別子です。 これは、TIPが実行されるOracleデータベースと、TIP所有者のユーザーIDからTIPの付与が実行される場所と同じです。
これらの許可を実行するSQLスクリプトは、Microsoft Windowsの場合%ORACLE_HOME%\dg4appc\admin
ディレクトリおよびUNIXベース・システム場合$ORACLE_HOME/dg4appc/admin
ディレクトリにあります。 pgddausr.sql
スクリプトは、単一のTIPユーザーによるパッケージへのプライベート・アクセスの許可を実行します。 プライベート許可が使用される場合、pgddausr.sql
スクリプトは各TIPユーザーのユーザーIDに対して1回実行する必要があります。
これらのスクリプトを実行するには、SQL*Plusを使用して、ユーザーPGAADMIN
としてOracleデータベースに接続します。 SQL*Plusから、pgddausr.sql
スクリプトを、UNIXベースのシステムのMicrosoft Windowsディレクトリまたは$ORACLE_HOME/dg4appc/admin
ディレクトリの%ORACLE_HOME%\dg4appc\admin
ディレクトリから実行します。 スクリプトは、前述のように必要な許可を実行します。 必要なユーザーID、パスワードおよびデータベース指定文字列の入力を求められます。 プライベート許可を使用している場合は、パッケージへのアクセスを必要とするユーザーIDごとにこのステップを繰り返します。
パブリック許可を実行するためのスクリプトは提供されていません。 これを行うには、次のコマンドを発行します:
Microsoft Windowsの場合:
C:\> sqlplus tip_owner\pw@database_specification_string
SQL> grant execute on tipname to PUBLIC;
UNIXベース・システムの場合:
$ sqlplus tip_owner/pw@database_specification_string
SQL> grant execute on tipname to PUBLIC;