4 クライアント・アプリケーションの開発(SNAのみ)
次のセクションでは、TIPを呼び出してリモート・ホスト・トランザクションを制御する方法について説明します。 また、ゲートウェイ・トランザクションを準備して実行するためのステップも提供します。 前提は次のとおりです。
-
リモート・ホスト・トランザクション(RHT)はすでに書き込まれています
-
RHTに対応するヒントは、「ヒントの作成」で説明されているステップを使用してすでに定義されています
ノート:
ゲートウェイでIMS ConnectのTCP/IPサポートを使用している場合、TIPのコールおよびリモート・ホスト・トランザクションの制御の詳細は、「クライアント・アプリケーション開発(TCP/IPのみ)」を参照してください。
トピック:
4.1 クライアント・アプリケーションの概要
プロシージャ・ゲートウェイ管理ユーティリティ( PGAU)は、指定した定義を使用して完全なヒントを生成します。 クライアント・アプリケーションは、TIPをコールしてリモート・ホスト・トランザクションにアクセスできます。 「プロシージャ・ゲートウェイ管理ユーティリティ」では、PGAUの使用について詳しく説明します。
この概要では、TIPを呼び出してリモート・ホスト・トランザクションを制御するために実行する必要がある操作について説明します。
ゲートウェイは、 OracleデータベースからPL/SQLコールを受信し、APPCコールを発行してリモート・トランザクション・プログラムと通信します。 次の3つのアプリケーション・プログラムによって、これが可能になります:
-
APPC対応リモート・ホスト・トランザクション・プログラム
-
トランザクション・インタフェース・パッケージまたはヒント。 TIPは、クライアントとゲートウェイ間の通信を処理し、COBOLとPL/SQL間でデータ型変換を実行するP L/SQLパッケージです。
PGAUは、 TIP仕様を生成します。 付属のサンプルでは、PGAUで生成されたパッケージを
pgadb2i.pkb
と呼びます。 この生成されたヒントには、リモート・トランザクション・プログラムにマップする3つ以上の関数コールが含まれています:-
pgadb2i_init
は、リモート・トランザクション・プログラムとの会話を初期化 -
pgadb2i_main
は、アプリケーション・データをリモート・トランザクション・プログラムと交換 -
pgadb2i_term
は、リモート・トランザクション・プログラムとの会話を終了
独自のTIPまたはデバッグを記述する場合は、「ヒント内部」を参照してください。
-
-
TIPを呼び出すクライアント・アプリケーション。
クライアント・アプリケーションは、入力引数と出力引数を使用して3つのTIP関数をコールします。 この例では、クライアント・アプリケーションは
empno
、従業員番号をリモート・トランザクションに渡し、リモート・トランザクションはemprec
を従業員レコードに戻します。
「表4-1」は、CICS-DB2トランザクションの例を使用した、PL/SQLドライバ、TIPおよびゲートウェイ間のロジック・フローを示しています。
表4-1 CICSのロジック・フロー-DB2の例
クライアント・アプリケーション | Oracleのヒント | ゲートウェイとリモート・トランザクション(メインフレーム)の間に確立されたプロシージャ |
---|---|---|
|
|
ゲートウェイは制御ブロックを設定し、APPC |
|
|
ゲートウェイはAPPC |
|
|
ゲートウェイは制御ブロックをクリーンアップします。 |
ゲートウェイを利用してリモート・ホスト・トランザクションとデータを交換するクライアント・アプリケーションは、それ自体でいくつかのタスクを実行し、そのかわりに他のタスクを実行するようにTIPに指示します。 したがって、クライアント・アプリケーション設計者は、リモート・トランザクションの動作とTIPによる交換の促進方法を理解する必要があります。
次の各項では、リモート・ホスト・トランザクション動作の概要、クライアント・アプリケーションによるこの動作の制御方法、およびTIP関数コールとデータ宣言がクライアント・アプリケーションをサポートしてリモート・ホスト・トランザクションを制御する方法について説明します。 これらのセクションでは、TIPがクライアント・アプリケーションに対して何をするか、およびTIPがリモート・ホスト・トランザクションとデータを交換する方法に関するバックグラウンド情報も提供します。
4.3 リモート・ホストのトランザクション要件について
リモート・ホスト・トランザクション・プログラム(RTP)を参照して、次を確認します:
-
様々なクライアント・アプリケーションでTIPコールに必要なPL/SQLパラメータ
-
コールが実行される順序
コールされるリモート・ホスト・トランザクション・プログラム(RTP)機能と、各コールで交換されるデータを識別します。 次に、次を定義し、PG DDに格納します:
-
DEFINE DATA
-
DEFINE CALL
-
DEFINE TRANSACTION
特定の定義ステップおよびTIPの実際の作成および生成については、「ヒントの作成」を参照してください。
4.3.1 TIPコンテンツと目的
PGAUで生成されたTIPの内容には、リモート・ホスト・トランザクションで使用可能なコールおよび交換されたデータが反映されます。 この内容を理解することは、TIPを呼び出すクライアント・アプリケーションを設計およびデバッグする際に役立ちます。
TIPは PL/SQLパッケージで、それに応じて の2つのセクションがあります:
-
次を含むパッケージ仕様:
-
パブリック関数のプロトタイプとパラメータ、および
-
-
次のものを含むパッケージ本文:
-
プライベート関数および内部制御変数
-
パブリック・ファンクション
-
最後のパブリック機能に続くパッケージの初期化。
-
ヒントの目的は、許可されるすべてのリモート・トランザクション・プログラム相互作用に対してPL/SQL呼出し可能なパブリック関数を提供することです。 リモート・トランザクション・プログラム相互作用は、1つ以上の PGAXFER
RPCコールを介したデータ交換の論理的関連グループです。 これは概念的には、複数のフィールドが入力され、Enterキーが押され、複数のフィールドがユーザーに返される画面またはメニューの相互作用と似ています。 アナロジをさらに継承:
-
ユーザーがTIPまたはクライアント・アプリケーションに変更される場合があります
-
入力するフィールドは、TIP関数コールの
IN
パラメータです -
返されるフィールドは、TIP関数コールの
OUT
パラメータです -
画面またはメニューは、
IN
パラメータとOUT
パラメータのグループです -
押されたEnterキーは、
PGAXFER
リモート・プロシージャ・コール(RPC)に似ています
トランザクション・コールを構成するパラメータの実際のグループ化は、ユーザーによって定義されます。 ゲートウェイは、リモート・トランザクション・プログラムがTIP関数コールのコレクションに対応する方法に制限を設けず、各コールには多数のIN
およびOUT
パラメータがあります。
PGAユーザーは、通常、リモート・トランザクション・プログラムごとに1つのヒントを持ちます。 TIP関数呼び出しのグループ化方法、および各呼び出しで交換されるデータ・パラメータは、リモート・トランザクション・プログラムのサイズ、複雑さ、および動作によって異なります。
PL/SQLパッケージがどのように機能するかについては、Oracleの「Oracle Database PL/SQL言語リファレンス」を参照してください。 次の説明では、ヒント内で実行する必要があるロジックについて説明します。 UNIXベースのシステムのMicrosoft Windowsまたは$ORACLE_HOME/dg4appc/demo/CICS
ディレクトリ(ファイル pgadb2i.pkh
、 pgadb2i.pkb
および pgadb2id.sql
)については、%ORACLE_HOME%\dg4appc\demo\CICS
ディレクトリで提供されているサンプルTIPおよびドライバを参照してください。
4.3.2 リモート・ホストのトランザクション・タイプ
データベース・ゲートウェイ・アプリケーションのパースペクティブでは、主に3つのタイプのリモート・ホスト・トランザクションがあります:
-
ワンショット
-
persistent
-
multi-conversational
4.3.2.1 ワン・ショット・トランザクション
1つの従業員番号を受け取り、従業員レコードを返す単純なリモート・トランザクション・プログラムには、1つのコールを提供するヒントがあり、従業員番号をIN
パラメータとして渡し、従業員レコードをOUT
パラメータとして返します。 これとすべてのヒントでは、さらに2つの関数コールを提供する必要があります:
-
リモート・トランザクション・プログラムのinit関数呼び出し
-
リモート・トランザクション・プログラム終了関数呼び出し
最も単純なTIPには、tip_init
、tip_main
、tip_term
などの3つのパブリック関数があります。
クライアント・アプリケーションは、tip_init
、tip_main
およびtip_term
を連続してコールします。 リモート・サイトでの対応するアクティビティは、リモート・トランザクション・プログラムの開始、データ交換およびリモート・トランザクション・プログラムの終了です。
リモート・トランザクション・プログラムは、ゲートウェイから終了シグナルを受信する前に自身を終了することもできます。 このシーケンスは通常どおりで、ゲートウェイ・ロジックによって通常どおり処理されます。 このようなリモート・トランザクション・プログラムは、ワン・ショットと呼ばれます。
4.3.2.2 永続トランザクション
より複雑なリモート・トランザクション・プログラムには、2つの動作モードがあります: INQUIRY
またはレポート・モード、およびUPDATE
モード。 これらのモードには、2つのTIPデータ転送関数コールを含めることができます: 1つはINQUIRY
、もう1つはUPDATE
です。 このようなヒントには、5つのパブリック機能がある場合があります。 たとえば:
-
これにより、リモート・トランザクション・プログラムとの通信が初期化されます。
-
これはモード選択パラメータを受け入れ、トランザクション・プログラムを照会モードまたは更新モードにします。
-
特定の従業員番号の従業員レコードを返します。
-
これは、指定された従業員番号の従業員レコードを受け入れます。
-
これにより、リモート・トランザクション・プログラムとの通信が終了します。
クライアント・アプリケーションは、tip_init
、tip_mode
の順にコールしてリモート・トランザクション・プログラムを照会モードにし、その後、従業員レコードをスキャンして、属性の組合せ(クライアント・アプリケーションとエンド・ユーザー)を検索します。 照会コールの一部のパラメータは、更新モードの変更を通知するように設定され、クライアント・アプリケーションはtip_updt
をコールしてレコードを更新します。 クライアント・アプリケーションは、最終的にtip_term
をコールしてリモート・トランザクション・プログラムを終了します。
リモート・サイトでの対応するアクティビティは次のとおりです:
-
リモート・トランザクション・プログラムの開始
-
モード選択交換
-
ループ読取りレコード
-
更新モードに切り替え
-
レコードを1つ更新
-
リモート・トランザクション・プログラム終了
このようなリモート・トランザクション・プログラムは、終了するようにシグナルが送られるまで相互作用するため、永続と呼ばれます。
リモート・トランザクション・プログラムは、照会モードに戻ることを許可し、プロセス全体を無期限に繰り返すように記述できます。
4.3.2.3 複数会話型トランザクション
クライアント・アプリケーションは、あるトランザクション(tran_A
)から情報を取得し、その後、別のトランザクション(tran_B
)から情報を記述または参照する必要がある場合があります。 これは、適切に記述されたクライアント・アプリケーションと、tran_A
およびtran_B
のヒントを使用して可能です。 実際、任意の数のトランザクションが単一のクライアント・アプリケーションによって同時に制御される場合があります。 クライアント・アプリケーションが各トランザクションからデータを取得し、それをローカルOracleデータベースに統合するか、Oracle Formで表示すると、すべてのトランザクションが読取り専用になる可能性があります。
また、トランザクションは、クライアント・アプリケーションによって提供された入力選択に応じて、異なるモードで操作したり、異なるサービスを実行できます。 たとえば、tran_C
の1つのインスタンスは1つのサービスを実行でき、tran_C
の2番目のインスタンスは2番目のサービスを実行します。 tran_C
の各インスタンスは、クライアント・アプリケーションとの独自の対話を持ち、実行されるサービスの性質に応じて、各インスタンス独自の動作(ワン・ショットまたは永続)を持つことができます。
4.4 各リモート・ホスト・トランザクションのカスタマイズされたヒント
各リモート・ホスト・システムには、ユーザーがコールする可能性のある数百のリモート・トランザクション・プログラム(RTP)がある場合があります。 各リモート・トランザクション・プログラムは異なるため、異なるデータを渡し、異なる機能を実行します。 したがって、ユーザーと各リモート・トランザクション・プログラム間のインタフェースは、各リモート・トランザクション・プログラムに対するユーザーの要件に合わせて専門化され、カスタマイズされる必要があります。 トランザクション・インタフェース・パッケージは、このカスタマイズされたインタフェースを提供します。
例
リモート・サイトには、従業員データベースまたは他のファイルシステムの従業員情報を管理するトランザクション・プログラムがあるとします。 リモート・ホストでのリモート・トランザクション・プログラムの名前は、従業員トラッキングのEMPT
です。 EMPT
は、照会機能と更新機能の両方を提供し、これらのEMPT
機能にアクセスして使用するには、異なるOracleユーザーが必要です。
EMPT
の照会専用の使用に制限されているユーザーもあれば、更新要件があるユーザーもあります。 Oracleユーザーのクライアント・アプリケーションをサポートするために、少なくとも3つの可能なヒントが存在する可能性があります:
-
EMP_MGMT
:EMPT
リモート・トランザクション・プログラムのすべての機能へのアクセスを提供します。 -
EMP_UPDT
:EMPT
リモート・トランザクション・プログラムの更新関数のみにアクセスします。 -
EMP_INQR
:EMPT
リモート・トランザクション・プログラムのルックアップ関数のみにアクセスします。
これらのヒントへのエンド・ユーザー・アクセスは、Oracle権限によって制御されます。 リモート・ホストによって、エンドユーザーに追加のセキュリティが課される場合があります。
また、各TIPは、リモート・トランザクション・プログラム(EMPT
)の名前と、EMPT
とのAPPC対話を確立するのに十分なネットワーク情報をその中にエンコードしています。
4.5 クライアント・アプリケーションの要件
TIPを使用して、クライアント・アプリケーションはリモート・ホスト・トランザクションに対応し、制御する必要があります。 内容は次のとおりです。
-
クライアント・アプリケーションの初期化
-
ユーザー入力および出力
-
TIP初期化関数を使用したリモート・ホスト・トランザクション初期化(オーバーライドあり/なし)
-
TIPユーザー機能を使用したリモート・ホスト・トランザクション制御とデータ交換
-
TIP終了関数を使用したリモート・ホスト・トランザクション終了
前述の3つのステップは、リモート・ホスト・トランザクションの要件によって異なります。
-
例外処理
-
クライアント・アプリケーションの終了
ワン・ショット・リモート・ホスト・トランザクション・クライアント・アプリケーションでは、次のことが必要です:
-
交換するRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 このような変数のPL/SQLデータ型は、各RHTに対応するTIPですでに定義されており、クライアント・アプリケーションは宣言でTIPデータ型のみを参照する必要があります。 詳細は、「ヒント変数の宣言」も参照してください。 これらの変数の正確な使用方法の詳細は、特定のヒント/RHTのTIPコンテンツ・ドキュメント・ファイルも参照してください。
-
TIP初期化関数を使用してRHTを初期化します。 TIPは、ゲートウェイ・サーバーに対し、デフォルトのRHT識別パラメータ(RHTがPG DDで定義され、生成時にTIP内でエンコードされた場合に指定)を指定するか、TIP初期化関数が呼び出されたときにユーザーまたはクライアント・アプリケーションによって提供されるRHT識別パラメータをオーバーライドして、目的のRHTとの対話を初期化するように指示します。 詳細は、「会話の初期化」および「TIP初期化の上書き」を参照してください。
-
TIPユーザー関数(1回の呼び出し)を使用して、RHTとデータを交換します。 前に説明したように、ワン・ショット・リモート・ホスト・トランザクションは単一のデータ交換のみに対応し、その交換が完了すると、RHTは単独で終了します。 したがって、クライアント・アプリケーションは、ユーザー定義のTIP関数への単一のコールを実行してデータ交換を行うだけで済みます。
このコールの正確な構文については、
%ORACLE_HOME%\dg4appc\demo\CICS\
(Microsoft Windows)または$ORACLE_HOME/dg4appc/demo/CICS/
(UNIXベース・システム)のTIPコンテンツ・ドキュメント・ファイルを参照してください。クライアント・アプリケーションは、TIP関数コールをコールする前に、値を
IN
またはIN OUT
パラメータ値に初期化する必要があります。 これらは、交換するRHT/TIPデータ型を宣言したときと同じ変数です。すべてのTIP関数コールは、
0
リターン・コード値を返し、返されたすべてのユーザー・ゲートウェイ・データ値を関数パラメータで交換します。 例外条件は必要に応じて発生し、例外ハンドラでインターセプトできます。TIP関数コールから戻ると、クライアント・アプリケーションは、
IN OUT
またはOUT
パラメータ値を分析および操作できます。 これらは、交換するRHT/TIPデータ型を宣言したときと同じ変数です。TIPによるリモート・ホスト・データの様々なタイプおよびフォーマットの変換方法の詳細は、「データ型の変換」を参照してください。
-
TIP終了関数を使用してRHTを終了します。 アクセスされるRHTのタイプに関係なく、TIP terminate関数を呼び出して、RHTとの会話をクリーンアップして終了します。 ワン・ショットRHTとの会話は、RHTが終了する前にゲートウェイ・サーバーから終了できます。 TIPもクリーンアップを実行する必要があります。 クリーンアップは、クライアント・アプリケーションの終了リクエストでのみ実行されます。
クライアント・アプリケーションは、通常または中止された終了をリクエストできます。
詳細は、 「会話の終了」を参照してください。
永続リモート・ホスト・トランザクション・クライアント・アプリケーションでは、次のことが必要です:
-
交換するRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 このような変数のPL/SQLデータ型は、各RHTに対応するTIPですでに定義されています。クライアント・アプリケーションは、その宣言でTIPデータ型のみを参照する必要があります。 詳細は、「ヒント変数の宣言」を参照してください。 これらの変数の正確な使用方法の詳細は、特定のヒント/RHTのTIPコンテンツ・ドキュメント・ファイルも参照してください。
-
TIP初期化関数を使用してRHTを初期化します。 TIPは、ゲートウェイ・サーバーに対し、デフォルトのRHT識別パラメータ(RHTがPG DDで定義され、生成時にTIP内でエンコードされた場合に指定)を指定するか、TIP初期化関数が呼び出されたときにユーザーまたはクライアント・アプリケーションによって提供されるRHT識別パラメータをオーバーライドして、目的のRHTとの対話を初期化するように指示します。 詳細は、「会話の初期化」および「TIP初期化の上書き」を参照してください。
-
TIPユーザー関数を使用してRHTとデータを繰り返し交換します。 継続的または反復的な制御シーケンスを提供または要求するリモート・ホスト・トランザクションは、RHTが対話型ユーザーまたはほかの制御プログラムによって操作されるのと同じ方法で、クライアント・アプリケーションによって制御されるべきです。 TIPサーバーとゲートウェイ・サーバーの仲介はRHT動作を変更しません。代わりに、TIPで定義されたさまざまな関数呼び出しを使用して、その動作の制御をクライアント・アプリケーションに拡張します。
永続的なRHTは、1つ以上のTIP関数呼び出しで制御できます。 RHTは、たとえば、会話が明示的に終了するまで、すべての入力の出力をループして返すように設計できます。 または、TIP関数が
OUT
パラメータのみを持つ複数の交換で結果を実行および返す操作の数またはリストを入力として受け入れるように設計されている場合があります。永続的なRHTは対話型でもあり、各出力は以前の入力選択によって指定され、対話がクライアント・アプリケーションによって明示的に終了された場合にのみ終了します。
クライアント・アプリケーションで使用可能なTIP関数コールとその固有の構文は、特定のTIP/RHTのTIPコンテンツ・ドキュメント・ファイルに記載されています。
RHTがTIP
IN
パラメータを解釈し、TIPOUT
パラメータを返す方法は、RHTから決定するか、RHTプログラマによって説明する必要があります。 TIPは、クライアント・アプリケーションのRHTの制御を容易にするための関数呼び出しと交換されたパラメータ・データ型を提供し、RHTが実行する一連の操作に制限や前提条件は課しません。 TIPは、RHTがPG DDで受け入れるように定義された呼び出しとデータ・パラメータをクライアント・アプリケーションに提供します。 -
TIP終了関数を使用してRHTを終了します。 アクセスされるRHTのタイプに関係なく、TIP terminate関数を呼び出して、RHTとの会話をクリーンアップして終了します。 永続的なRHTとの会話は、RHTが終了する前にゲートウェイ・サーバーから終了するか、RHTがすでに終了している可能性があります。 TIPはクリーンアップも実行する必要があり、このクリーンアップはクライアント・アプリケーションの終了リクエストでのみ実行されます。
クライアント・アプリケーションは、通常または中止された終了をリクエストできます。
詳細は、「会話の終了」を参照してください。
複数会話型リモート・ホスト・トランザクション・クライアント・アプリケーションでは、次のことが必要です:
-
交換するRHT/TIPデータ型を宣言します。 すべてのクライアント・アプリケーションは、TIPを使用してRHTと交換される変数を宣言する必要があります。 このような変数のPL/SQLデータ型は、各RHTに対応するTIPですでに定義されており、クライアント・アプリケーションは宣言でTIPデータ型のみを参照する必要があります。 詳細は、「ヒント変数の宣言」を参照してください。 これらの変数の正確な使用方法の詳細は、特定のヒント/RHTのTIPコンテンツ・ドキュメント・ファイルも参照してください。
-
TIP初期化関数を使用して、関連する各RHTを初期化します。 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と、起動されたRHTに対応するTIPおよび
tranuse
値を追跡する必要があります。 -
-
TIPユーザー関数を使用して、各RHTとデータを交換します。RHTがワン・ショットまたは永続の場合は、1回または繰り返しを使用します。 クライアント・アプリケーション・ロジックは、RHTを対話的に操作するユーザーと同様に、適切なRHT操作に従って、許可されたステップに従ってRHTを順序付けする必要があります。
クライアント・アプリケーション・ロジックは、RHT間結果分析または必要なデータ転送も実行する必要があります。 すべてのTIPは相互に分離して実行されます。
別のRHTへの入力として意図されたあるRHTからの出力は、クライアント・アプリケーションで最初のRHTから
IN
またはIN OUT
パラメータとして受信し、クライアント・アプリケーションから2番目のRHTにIN
またはIN OUT
パラメータとして送信する必要があります。 TIPからRHTへのすべての関数呼び出しはクライアント・アプリケーションによって実行され、交換されるデータ・パラメータはクライアント・アプリケーションによって変数として宣言されている必要があります。 TIPには、クライアント・アプリケーションに必要なデータ型定義とRHT関数呼び出しの両方が用意されています。TIP関数呼び出しの正確な構文および交換されるパラメータ・データ型の定義については、各TIP/RHTのTIPコンテンツ・ドキュメント・ファイルを参照してください。
-
TIP終了関数を使用して、初期化された各RHT を終了します。 RHTを終了するには、RHTとその会話を終了し、TIPクリーンアップを開始するために、対応するTIP終了関数を呼び出す必要があります。 終了するRHTは、そのTIPスキーマ名(データ交換関数コールと同じスキーマ)と、同じRHTの複数のインスタンスが終了するときの
tranuse
値によって指定されます。RHTとそれに対応するTIPは、クライアント・アプリケーションで必要な任意の順序で終了できるため、初期化される順序と同じ順序で終了する必要はありません。
ノート:
さまざまなTIPデータ交換変数関数の呼び出しの具体的な構文は、特定のRHTのPG DDで以前に定義した構文と同じであり、TIPコンテンツ・ドキュメント・ファイル (
tipname.doc
)またはTIPの生成時に生成されたTIP仕様ファイルを調べることで調べることができます。 アクセス中のRHTのTIPがまだ生成されていない場合は、「ヒントの作成」および「DATA対応」、「CALL対応」および「TRANSACTION対応」を参照してください。 ただし、必要に応じてクライアント・アプリケーション参照ドキュメントを使用できるように、先にヒントを定義して生成することをお勧めします。
4.6 ヒントおよびリモート・トランザクション・プログラムの対応の確認
リモート・ホスト・トランザクション・プログラムとそれに関連するクライアント・アプリケーションとのTIPは、の2つの主要な要件に対応している必要があります:
-
パラメータ・データ型変換。これは、トランザクション
DATA
の定義方法の結果です。 PGAUで生成されたTIPがデータ定義に基づいてどのようにデータを変換するかについては、「データ型の変換」を参照してください。 -
APPCの送信/受信の同期。トランザクション
CALL
の定義方法による結果です
これらのDATA
およびCALL
定義は、参照によってTRANSACTION
定義に含まれます。
4.6.1 DATA対応
リモート・ホスト・トランザクションの言語でプログラムされたデータ定義を使用して、 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ロジックをヒントに生成します。 詳細は、「プロシージャ・ゲートウェイ管理ユーティリティ」の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での定義は必要ありません。
4.6.2 CALL対応
APPC SEND
およびRECEIVE
を同期する必要性は、リモート・トランザクション・プログラムがデータ・パラメータの入力を想定すると、データ・パラメータを読み取るためにAPPC RECEIVE
を発行することを意味します。 したがって、TIPにより、ゲートウェイがAPPC SEND
を発行して、データ・パラメータをリモート・トランザクション・プログラムに書き込む必要があります。 また、リモート・トランザクション・プログラムがAPPC SEND
を発行すると、TIPによってゲートウェイがAPPC RECEIVE
を発行する必要があります。
PGAUのDEFINE CALL
文は、生成されたTIPがクライアント・アプリケーションによってどのようにコールされるか、およびそのコールでリモート・ホスト・トランザクションと交換されるデータ・パラメータを指定します。 各PGAUのDEFINE CALL
文では、TIP関数の名前、1つ以上のデータ・パラメータ、および各データ・パラメータのIN/OUT
モードを指定できます。 データ・パラメータは、PGAUのDEFINE DATA
文を使用して事前に定義しておく必要があります。 詳細は、「プロシージャ・ゲートウェイ管理ユーティリティ」の" DEFINE CALL "および「管理ユーティリティの例」の「PGAU DEFINE CALL文の例」を参照してください。
PGAU DEFINE CALL
処理では、指定した情報がPG DDに格納され、後でPGAU GENERATE
によって使用されます。 次に、PGAU GENERATE
によって、TIPパッケージ仕様部に次のものが作成されます:
-
CALL
で指定されたDATA
定義ごとにPL/SQLパラメータを使用して定義された各CALL
のパブリックPL/SQL関数の宣言 -
パブリックPL/SQLデータ・パラメータの宣言
クライアント・アプリケーションは、PGAU DEFINE CALL
文で指定された関数名およびパラメータ・リストを使用して、TIPパブリック関数をPL/SQL関数コールとしてコールします。 クライアント・アプリケーションでは、TIPパブリック・データ・パラメータと同じデータ型のプライベート変数を参照によって宣言して、クライアント・アプリケーション内でのデータの受渡しと処理を容易にし、PGAU GENERATE
によって作成された宣言を共有することもできます。
この例では、TIPパブリック関数を定義するために、次のPGAU DEFINE CALL
文を発行する必要があります:
DEFINE CALL DB2IMAIN PKGCALL (pgadb2i_main) PARMS ((empno IN),(emprec OUT));
4.6.2.1 柔軟なコール順序
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に定義するには、4つのPGAU DEFINE CALL
文を発行し、それぞれに一意のパブリック関数名(tip_callx
)と交換するデータ・パラメータ・リストを指定する必要があります。 データ・アイテムは、DEFINE DATA
を使用して定義されると、任意のモード(IN
、OUT
または IN OUT
)で複数のコールで参照できます。 たとえば、parm5
は、parm6
のかわりに2回目に使用できます。 これは、同じデータが両方のインスタンスで交換され、 tip_call2
のTIPおよびアプリケーションに受信され、tip_call4
のリモート・ホストに返される(場合によっては更新される)ことを意味します。
また、リモート・トランザクション・プログラムの最初の5つの書込みフィールドは、tip_call1
およびtip_call2
という2つの個別のTIP関数コールによって読み取られます。 これは、それぞれ1つのOUT
パラメータの5つのTIP関数コール、または5つのOUT
パラメータを持つ1つのTIP関数コールでも同様に実現できます。 次に、リモート・トランザクション・プログラムの最初の読取りフィールド(field6
)と後続の書込みフィールド(field7
)は、単一のIN OUT
パラメータ(parm6
)を持つ単一のTIP関数コール(tip_call3
)に対応します。
この単一の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つのパラメータを渡し、もう一方の呼び出しで2つのパラメータをどちらの順序でも渡すこともできます。 この柔軟性により、ユーザーは、リモート・トランザクション・プログラムの操作とTIP関数コール間の対応を、ユーザーに最も適した方法で定義できます。
4.6.2.2 コール対応オーダーの制限
各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は、受信するパラメータを送信してチェックするパラメータを処理しますが、何も検出して完了しません。したがって、IN
パラメータがパラメータ・リスト内の位置に関係なく最初に処理されるため、OUT
パラメータとIN
パラメータが続く単一のTIPパブリック関数は機能しません。
4.6.3 TRANSACTION対応
リモート・ホスト・トランザクションは、PGAU DEFINE TRANSACTION
文で定義され、トランザクションがサポートする以前のCALL
の定義への参照が追加されます。
次のようなリモート・ホスト・トランザクション属性を指定します:
-
トランザクションIDまたは名前
-
ネットワーク・アドレスまたはロケーション
-
システム・タイプ(IBM370など)
-
リモート・ホストのOracle National Language
ノート:
PL/SQLパッケージ名は、トランザクションの定義時に指定されます。これは、TIPが参照される名前と、TIPに含まれるパブリック関数がコールする名前です。 各パブリック関数は、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");
4.7 クライアント・アプリケーションからのヒントの呼出し
ヒントを作成したら、クライアント・アプリケーションをTIPとインタフェースするように記述する必要があります。 TIP関数を呼び出すクライアント・アプリケーションには、次の5つの論理セクションが含まれている必要があります:
-
TIP変数の宣言
-
会話の初期化
-
データの交換
-
会話の終了
-
エラー処理
4.7.1 ヒント変数の宣言
tipname.doc
ファイルのユーザー宣言セクションには、必要な宣言が記載されています。
TIP関数へのコールで PL/SQLパラメータを渡す場合、クライアント・アプリケーションは、TIPの仕様セクションで定義されているものとまったく同じPL/SQLデータ型をTIP関数引数に使用する必要があります。 たとえば、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データ型を再定義する必要はありません。 これらは、クライアント・アプリケーション内でlocally
を宣言する必要があり、BEGIN
の前にクライアント・アプリケーションに表示されます:
appl_record tipname.tran_rectype; /* declare appl record */
「表4-3」は、コマンドライン引数を示します:
表4-3 コマンド行引数
項目 | 説明 |
---|---|
|
パッケージ仕様部で定義されているTIP関数名。 |
|
このTIPコールがデータを交換する会話を識別するTIP init関数から返されるリモート・トランザクション・インスタンス・パラメータ。 |
|
|
参照できるユーザー宣言の詳細は、tipname
.doc
コンテンツ・ファイルを参照してください。
クライアント・アプリケーションは、TIPパブリック関数をローカルPL/SQL関数であるかのようにコールします:
rc = tip_call1( tranuse, appl_var, appl_record);
CICS-DB2照会の例では、PL/SQLドライバpgadb2id.sql
(は%ORACLE_HOME%\dg4appc\demo\CICS
ディレクトリ(Microsoft Windows)および$ORACLE_HOME/dg4appc/demo/CICS
ディレクトリ(UNIXベース・システム)にあります)がクライアント・アプリケーションであり、次の宣言が含まれています:
... ... 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 */ ... ...
4.7.2 会話の初期化
-
PL/SQLパッケージ(TIP)をロードし、TIP初期化セクションでプログラムされた初期化ロジックを実行します。
-
TIP init関数が
PGAINIT
リモート・プロシージャ・コール(RPC)を呼び出すようにするには、リモート・トランザクション・プログラム(RTP)との通信を確立し、トランザクション・インスタンス番号をアプリケーションに返します。
オプションで、会話を初期化するコールを使用して、次のことができます:
-
デフォルトのRHT/OLTP識別情報、ネットワーク・アドレス属性、および対話セキュリティのユーザーIDとパスワードをオーバーライドします。
-
TIPが生成する診断トレースを指定します。 診断トレースの詳細は、「トラブルシューティング」を参照してください。
PGAUで生成されたTIPは、クライアント・アプリケーションが呼び出すことができる4つの異なる初期化関数を提供します。 これらは、すべて同じ名前を持つオーバーロードされた関数ですが、渡されるパラメータのタイプによって異なります。
3つの初期化パラメータが渡されます:
-
RHT会話識別用のトランザクション・インスタンス番号。
tranuse
パラメータは、すべてのTIP初期化に必要です。 -
TIP実行時診断制御のTIP診断フラグ。
tipdiag
パラメータはオプションです。 TIP診断の詳細は、「トラブルシューティング」を参照してください。 -
OLTPおよびネットワーク属性をオーバーライドするためのヒントのデフォルト・オーバーライド。
override
パラメータはオプションです。
次の4つの機能は、ヒント・コンテンツ・ドキュメント・ファイルに表示される可能性があるため、表示されます。 クライアント・アプリケーションの使用例は後述します。
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;
4.7.2.1 トランザクション・インスタンス・パラメータ
このトランザクション・インスタンス番号(tranuse
の例を参照)は、後続のTIP交換および終了関数に渡す必要があります。 APPCが対話するゲートウェイ(つまり、リモート・トランザクション・プログラムの反復)を識別し、データが転送されるか通信が終了します。
1つのクライアント・アプリケーションで、同じリモート・トランザクション・プログラムの複数のインスタンスまたは複数の異なるリモート・トランザクション・プログラムのすべてを同時に制御できます。 トランザクション・インスタンス番号は、ゲートウェイを介したクライアント・アプリケーション・コールを意図したリモート・トランザクション・プログラムにルーティングするためのTIPのメカニズムです。
クライアント・アプリケーションは、アクティブな各トランザクションのトランザクション・インスタンス番号を保存し、そのトランザクションに対してコールされた各TIP機能に正しい番号を渡す必要があります。
クライアント・アプリケーションは、TIP初期化関数をローカルのPL/SQL関数であるかのようにコールします。 たとえば:
... ... tranuse INTEGER := 0;/* transaction usage number*/ ... ... BEGIN rc := pgadb2i.pgadb2i_init(tranuse); ... ...
4.7.2.2 TIP初期化の上書き
前述の例では、クライアント・アプリケーションはリモート・トランザクション・プログラム名、ネットワーク接続またはセキュリティ情報を指定していません。 TIPには、このような情報がデフォルトとして内部的にコーディングされており、クライアント・アプリケーションは、選択したリモート・トランザクション・プログラムに適したTIPをコールするだけです。 ただし、クライアント・アプリケーションはオプションで一部のTIPデフォルトをオーバーライドし、セキュリティ情報を提供できます。
オーバーライドを必要としないクライアント・アプリケーションを変更する必要はありません。
PG DDでリモート・ホスト・トランザクションが定義されている場合、DEFINE TRANSACTION
文では、オーバーライド可能な特定のデフォルトのOLTPおよびネットワーク識別属性が指定されています:
-
TPname
-
LUname
-
LOGMODE
-
Side Profile
DEFINE TRANSACTION
文の詳細は、「プロシージャ・ゲートウェイ管理ユーティリティ」の" DEFINE TRANSACTION "を参照してください。
これらのPG DD定義トランザクション属性は、デフォルトとしてTIPに生成され、 TIP初期化時にオーバーライドできます。 これにより、テスト・トランザクションまたはシステムで使用できる1つのヒントの使用が容易になり、後で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 ... ...
ヒント内では、オーバーライド属性は構文の問題がないかチェックされ、ゲートウェイ・サーバーに渡されます。
4.8 データの交換
クライアント・アプリケーションは、前のtip_init
コールから返されたトランザクション・インスタンス番号を渡して、影響を受けるリモート・トランザクション・プログラムを識別し、リモート・トランザクション・プログラムと交換されるクライアント・アプリケーション・データ・パラメータを識別する必要があります。
このCICS-DB2照会の例では、従業員番号を渡し、従業員レコードを受け取ります:
rc = pgadb2i.pgadb2i_main(tranuse, /* transfer data */ empno, /* employee number */ DCLEMP); /* return employee record*/
4.8.1 会話の終了
クライアント・アプリケーションは、TIP終了関数をローカルのPL/SQL関数であるかのようにコールします。 たとえば:
... ... term := 1; /* indicate term called* */ rc := pgadb2i.pgadb2i_term(tranuse,0); /* terminate normally */ ... ...
トランザクションを終了するためにTIP終了コールでトランザクション・インスタンス番号が渡された後、またはリモート・トランザクション・プログラムが異常終了した後、その特定のトランザクション・インスタンス番号が忘れられることがあります。
4.8.2 エラー処理
クライアント・アプリケーションには、クライアント・アプリケーションが終了する前に、アクティブな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言語リファレンス」を参照してください。
4.8.3 実行権限の付与
TIPは標準の PL/SQLパッケージであり、クライアント・アプリケーションからTIPをコールするユーザーに実行権限を付与する必要があります。 この例では、PGADB2I
パッケージに対する実行をユーザーSCOTT
に付与します:
GRANT EXECUTE ON PGADB2I TO SCOTT
詳細は、「Oracle Database管理者ガイド」を参照してください。
4.9 アプリケーションの実行
クライアント・アプリケーションを実行する前に、ホストへの接続が確立され、受信側パートナが使用可能であることを確認します。 この例では、PL/SQLドライバDB2IDRIV
を使用してCICS-DB2照会を実行します。 このクライアント・アプリケーションを実行するには、SQL*Plusから次のように入力します:
set serveroutput on
execute DB2IDRIV('nnnnnn')
;
4.10 APPC会話共有
複数のTIPは、同じ会話を共有している1つ以上のリモート・ホスト・トランザクション(RHT)と、同じAPPC会話を共有できます。 この機能には、次の2つの利点があります:
-
会話の制御を渡すことに依存する既存のRHTは、Oracle Database Gateway for APPCでサポートされています。
-
それ以外の場合、PL/SQLコンパイルには大きすぎるTIPを複数の小さなTIPに分けることができ、それぞれにユーザー定義関数が少なくなるため、RHTを変更することなく、クライアント・アプリケーションに同じ関数呼び出しとデータ定義のセットが提供されます。
4.10.1 APPC会話共有の概念
IMSなどのメインフレームOLTPでは、トランザクションが別のトランザクションを呼び出すときに渡すことによって、トランザクションが単一のAPPC会話を共有できます。 RHTは、コール、入力および出力を含む単一のトランザクションとしてPGAUに定義され、PGAUは、その特定のRHTに対応する初期化、転送および終了関数を含む単一のTIPを生成します。
すべてのTIPに生成されたロジックによって、TIPは次のいずれかが可能になります:
-
init関数が呼び出されたときに新しい会話を開始する場合、または
-
ユーザー定義の関数が呼び出されたときに既存の会話のデータを転送する場合、または
-
「term」関数が呼び出されたときに既存の会話を終了します。
APPC会話は、複数のTIPによって共有および管理されるリソースとして扱われます。 TIPがAPPC会話の唯一のユーザーになる必要はありません。
3.4.0以降で生成されたヒントは、次のサービスの組合せのいずれかを実行できます:
-
開始
-
開始および転送
-
開始、転送および終了(標準操作)
-
transfer
-
転送および終了
-
終了
-
開始および終了(他のTIPが転送を実行することを前提としています)
単一のAPPC会話は、次の方法で共有できます:
-
1つのヒントから複数のRHTへ
-
複数のTIPから1つのRHTへ
-
複数のTIPから複数のRHTへ
APPC対話共有がない場合、クライアント・アプリケーションが呼び出す必要があるすべてのRHTのすべての関数とデータを含む単一のTIPを定義する必要があります。 RHTのスーパーセットを使用してTIPを作成すると、多くの場合、そのようなTIPはPL/SQLがコンパイルするには大きすぎます。
逆に、APPC対話共有では、各RHT (または複数の異なるデータ交換操作を実行するRHTに対する各RHTデータ交換)を1つのTIPで定義できます。このTIPは、PL/SQLコンパイル制限を小さくし、超える可能性は低くなります。
4.10.2 APPC会話共有使用状況
APPCの会話共有は、3.4.0以降で生成されたすべてのTIPで自動的に使用可能になります。 3.4.0がAPPC会話共有に参加できるようになる前に生成されたヒントはありません。 3.4.0の前に生成されたヒントは、PGAU 3.4.0を使用して再生成するか、APPCの会話共有に参加する必要があります。 PGAUは上方互換性があり、再生成されたTIP本文(tipname
.pkb
)のみが再コンパイルされる場合、再生成は透過的であるべきです。 TIP仕様も再コンパイルされる場合、クライアント・アプリケーションも再コンパイルする必要があります。 詳細は、「ヒント内部」を参照してください。
TIPの定義と生成は、第1章 、2、and 3で前述したように行われます。 追加のオプションやパラメータを指定する必要はありません。
APPCの会話共有のランタイム使用は、クライアント・アプリケーションの制御下にあります。 これは、会話を共有するいずれかのTIPのinit関数をコールし、それぞれが目的の順序でコールされるときに、他のTIP関数に返されたtranuse
値を渡すだけで実現されます。 すべてのTIPが同じDEFINE TRANSACTION TPNAME
またはSIDEPROFILE
値で定義されていれば、任意のTIP init関数を使用できます。 TPNAME
またはSIDEPROFILE
値は、初期化するRHTを指定します。
会話を初期化するためにAPPC会話共有対応TIPのinit関数がコールされると、戻されるtranuse
値は、会話共有が有効であることを示します。 他のTIPで関数をコールするときに同じtranuse
値を渡すことによって、関連するすべてのTIPがバージョン3.4.0以降で生成された場合、他のTIPは、すでに初期化されている同じ会話で転送を実行します。
4.10.3 APPC会話共有TIP互換性
データベース・ゲートウェイの3.4.0以降で生成されたヒントでは、tranuse
には3.4.0より前のヒントとは異なる値が使用されます。 3.4.0より前のヒントを使用して会話を初期化し、そのtranuse
値を3.4.0以降で生成されたヒントに渡すと、次の例外が発生します:
ORA-20704 PGA_TIP: tranuse value cannot be shared
ただし、3.4.0より前で生成されたTIPでは、共有会話の異なるtranuse
値が検出されないため、予期しないエラーが発生する可能性があります。
ノート:
共有会話でコールされるすべてのヒントは、3.4.0以降で生成されている必要があります。
3.4.0がAPPC会話共有に参加できるようになる前に生成されたヒントはありません。
tranuse
値は、3.4.0より前のリリースと3.4.0以降のリリースでは互換性がありません。 これは、次の理由で問題になることはありません: 3.4.0の前に、TIPで定義されているすべてのRHT関数をそのTIP関数を介してコールする必要があり、その同じTIPのinit関数を最初にコールして会話を初期化する必要がありました。 tranuse
値は、初期化したTIPに対してのみ有効でした。 したがって、プログラミングを変更しないかぎり、既存のアプリケーションでtranuse
値を誤って混在させることはできません。
3.4.0より前のヒントおよびクライアント・アプリケーションは、変更せずに引き続き使用でき、古いクライアント・アプリケーションは、変更せずに新しい3.4.0以降のヒントをコールできます。 これは、古いTIP本文が再生成され、コンパイルされるときに実現されます。古いクライアント・アプリケーションが変更されていなくても、TIPはAPPC会話共有に対応するようになりました。
3.4.0より前のTIPのどの関数もAPPC会話を共有できません。 ただし、3.4.0以降でTIPが再生成されると、そのどの関数でもAPPC会話を共有できます。
4.10.4 大きすぎるヒントのAPPC会話共有
会話共有を使用すると、コンパイルするには大きすぎるヒントを回避できます。 これは、PLS-00123 - package too large to compile
、またはPL/SQLコンパイル・ハングなど、その他の問題症状によって識別されます。 この場合、前のヒントから削除して新しいヒントに定義する関数コールを選択する必要があります。
具体的には、古いPGAU制御ファイル(.ctl
)から1つ以上の新しいPGAU制御ファイルに、どの PGAU DEFINE CALL
文および関連する DEFINE DATA
文を移動するかを決定する必要があります。 また、新しい各TIPを定義する各PGAU制御ファイルに含めるP GAU DEFINE TRANSACTION
文を決定する必要があります。
PGAU文をいくつか検討する必要があります。PGAU文とその説明のリストは、「表4-4」を参照してください:
表4-4 PGAU文
文 | 説明 |
---|---|
|
一意である必要があります。 これらは、 |
|
一意である必要があります。 これらは、 |
|
新しいTIPごとに指定され、以前の大きなTIPから新しい小さなTIPに移動されたコール定義を参照します。 トランザクション属性は変更されません。 これにより、新しいTIPは、以前の大きなTIPと同じRHTで同じ初期化または終了を実行できます。 (以前の大きなTIPの)古い |
4.10.5 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);
次の例のヒントを定義できます:
例1
この例では、APPCの会話共有は使用しませんが、リリース3.4.0より前に作成された有効なTIP定義で、RHT A
、B
およびC
の関数を組み合せます。
DEFINE TRANSACTION rhtABC calls(menu_A, query_B, update_C, select_C) tpname(RHTA);
このヒントには、すべてのデータ定義およびコールが含まれており、コンパイルするには大きすぎる可能性があります。 このヒントでは、TIP rhtABC
が1つしかないため、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
この例では、APPC会話共有を使用して一連のTIPを定義し、RHT A
、B
、およびC
の関数を3つの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コールのスキーマ修飾子にあります。 これは、呼び出される関数が、データベース内で異なるパッケージ名を持つ別のヒントにあるためです。
APPCの会話共有を利用するには、新しいDEFINE TRANSACTION
文のみが必要でした。 CALL
およびDATA
定義はそのまま使用されていました。 つまり、古いヒントrhtABC
は、そのまま定義されており、コンパイルするにはまだ大きすぎる可能性があります。
例3
Sample 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)
を指定しているため、同じリモート・ホスト・トランザクションが常に初期化のためにコールされます。
4.10.6 APPC会話共有のオーバーライドおよび診断
TIPデフォルト・オーバーライド・パラメータは、初期化を実行するためにコールされたTIP init関数で処理されます。 APPCの会話が確立されると、オーバーライドするパラメータの共有はこれ以上必要ありません。 オーバーライドをTIP init関数に渡す以外に何もする必要はありません。
ヒント診断パラメータは、特定の会話を共有するすべてのヒント間で共有されます。 事実上、初期化を実行するTIPの診断をリクエストすると、会話を共有するすべてのTIPの同じ診断がリクエストされます。 会話の複数の共有の1つのヒントからのみ診断をリクエストすることはできません。 アプリケーション・デザイナまたはユーザーは、TIPランタイム・トレース・コントロールをTIP init関数に渡す必要があります。
4.11 マルチバイト文字セットのサポートによるアプリケーション開発
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
データ・フィールドに対してDBCSまたはMBCS変換を実行でき、残りのPIC X
データ・フィールドに対してデフォルトでSBCS変換を実行できます。 デフォルトの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 X
バイトの PIC G
フィールドがカッコで囲まれています。 このような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)
を指定し、'05 MY_MBCS_DATA PIC G(51).'
を指定してMY_MBCS_DATA
を再定義することで、3フィールド定義を1フィールド定義に再定義できます。 3つのREDEFINE
文をPGAU入力制御ファイルに配置できるため、リモート・ホストの定義を変更する必要はありません。
4.12 APPCを使用するためのターミナル指向トランザクションの変更
リモート・トランザクション・プログラムには、APPC会話を開始、通信および終了するために、マップされたAPPC動詞が含まれている必要があります。 ただし、リモート・トランザクション・プログラムが端末指向の場合、次のオプションを使用できます:
-
端末ロジックをアプリケーションおよびI/Oロジックから分離できます。 この分離が実現されると、ゲートウェイ・コールとトランザクション・アプリケーション・ロジック間のインタフェースに小さなフロントエンド・リモート・トランザクション・プログラムを記述できます。 たとえば、CICSでは、CICS
LINK
を使用してこの手法を実装します。 -
APPCコールが埋め込まれるように、既存のプログラムを変更できます。 例の
PGADB2I
では、CICSおよびそれに関連付けられたマップされたAPPC動詞を次のように使用します:-
EXEC CICS
ASSIGN
は、ゲートウェイによって開始された会話を受け入れます。 -
EXEC CICS
RECEIVE
が引数を受け取ります。 -
EXEC CICS
SEND
は結果を終了します。 -
EXEC CICS
RETURN
は会話を終了します。
-
-
端末指向のトランザクションを変更しない場合は、端末指向のプログラムとゲートウェイの間に、IBM CorporationのFEPI for CICS Transaction Server for z/OSなどのAPPC対応のインタフェースを挿入できます。
-
IMS/TMでは、暗黙的なAPPC機能を使用して、既存の未変更のIMSトランザクションにゲートウェイを使用してアクセスできます。 暗黙的なAPPCでは、I/O PCBを使用する標準のDLI GU、GNおよびISRTコールは、APPCを介してIMSトランザクションが呼び出されると、適切なAPPC送信または受信コールに自動的に変換されます。
4.13 ヒントを使用するために必要な権限
実行権限は、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所有者は通常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;
ここで、 database_specification_string
は、ゲートウェイUTL_RAW
およびUTL_PG
コンポーネントがインストールされたOracleデータベースの Oracle Net識別子です。 これは、TIPが実行され、TIPに対する権限付与がTIP所有者ユーザーIDから実行されるOracleデータベースと同じです。
これらの権限付与を実行するためのSQLスクリプトは、Microsoft Windowsの%ORACLE_HOME%\dg4appc\admin
ディレクトリおよびUNIXベースのシステムの$ORACLE_HOME/dg4appc/admin
ディレクトリにあります。 pgddausr.sql
スクリプトは、単一のTIPユーザーによるパッケージへのプライベート・アクセスの権限付与を実行します。 プライベート権限を使用する場合は、TIPユーザーのユーザーIDごとにpgddausr.sql
スクリプトを1回実行する必要があります。
これらのスクリプトを実行するには、SQL*Plusを使用して、ユーザーPGAADMIN
としてOracleデータベースに接続します。 SQL*Plusから、Microsoft Windowsの%ORACLE_HOME%\dg4appc\admin
ディレクトリまたはUNIXベースのシステムの$ORACLE_HOME/dg4appc/admin
ディレクトリからpgddausr.sql
スクリプトを実行します。 スクリプトは前述のように必要な許可を実行します。 必要なユーザー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;