7 クライアント・アプリケーションの開発(TCP/IPのみ)
の次のトピックでは、ゲートウェイでIMS ConnectのTCP/IPサポートが使用されている場合に、TIPをコールし、リモート・ホスト・トランザクションを制御する方法について説明します。 また、ゲートウェイ・トランザクションを準備して実行するためのステップも提供します。
前提は次のとおりです。
-
リモート・ホスト・トランザクション(RHT)はすでに書き込まれています
-
RHTに対応するTIPは、「ヒントの作成」で説明されているステップを使用してすでに定義されています。
-
pg4tcpmapツールを使用して、SIDE PROFILE名、TCP/IPホスト名、ポート番号およびその他のIMS接続パラメータを指定して、PGA_TCP_IMSCマッピング表が移入されています。
トピック:
7.1 クライアント・アプリケーションの概要
プロシージャ・ゲートウェイ管理ユーティリティ( PGAU)は、指定した定義を使用して完全なヒントを生成します。 クライアント・アプリケーションは、TIPをコールしてリモート・ホスト・トランザクションにアクセスできます。 「プロシージャ・ゲートウェイ管理ユーティリティ」では、PGAUの使用について詳しく説明します。
この概要では、TIPを呼び出してリモート・ホスト・トランザクションを制御するために実行する必要がある操作について説明します。
ゲートウェイは、 OracleデータベースからPL/SQLコールを受信し、TCP/IPコールを発行してリモート・トランザクション・プログラムと通信します。
次のアプリケーション・プログラムによって、これが可能になります:
-
pg4tcpmapツールを使用して、
SIDE PROFILE名、およびTCP/IPホスト名、ポート番号およびその他のIMS接続パラメータを使用して移入されたPGA_TCP_IMSCマッピング表。 -
トランザクション・インタフェース・パッケージ(ヒント)。 TIPは、クライアントとゲートウェイ間の通信を処理し、COBOLとPL/SQL間でデータ型変換を実行するP L/SQLパッケージです。
-
PGAUによってTIP仕様が生成されます。 付属のサンプルでは、PGAUで生成されたパッケージを
pgtflip.pkbと呼びます。 この生成されたヒントには、リモート・トランザクション・プログラムにマップする3つ以上の関数コールが含まれています:-
pgtflip_initは、リモート・トランザクション・プログラムとの会話を初期化 -
pgtflip_mainは、アプリケーション・データをリモート・トランザクション・プログラムと交換 -
pgtflip_termは、リモート・トランザクション・プログラムとの会話を終了
独自のTIPまたはデバッグを記述する場合は、「ヒント内部」を参照してください。
-
-
TIPを呼び出すクライアント・アプリケーション。
クライアント・アプリケーションは、入力引数と出力引数を使用して3つのTIP関数をコールします。 この例では、クライアント・アプリケーションが入力を渡し、リモート・トランザクションがフリップした入力を出力として返送します。
「表7-1」は、IMS Connect-IMSトランザクションの例を使用した、PL/SQLドライバ、TIPおよびゲートウェイ間のロジック・フローを示しています。
表7-1 IMS Connect-IMSの論理フローの例
| クライアント・アプリケーション | Oracleのヒント | ゲートウェイとリモート・トランザクション(メインフレームIMS)の間に確立されたプロシージャ |
|---|---|---|
|
|
|
Gatewayは、TCP/IPソケットを発行し、IMS Connectとの対話を開始するために接続します。 |
|
|
|
ゲートウェイは、IMS ConnectにTCP/IP |
|
|
|
ゲートウェイがTCP/IP |
ゲートウェイを利用してリモート・ホスト・トランザクションとデータを交換するクライアント・アプリケーションは、それ自体でいくつかのタスクを実行し、そのかわりに他のタスクを実行するようにTIPに指示します。 したがって、クライアント・アプリケーション設計者は、リモート・トランザクションの動作とTIPによる交換の促進方法を理解する必要があります。
次の各項では、リモート・ホスト・トランザクション動作の概要、クライアント・アプリケーションによるこの動作の制御方法、およびTIP関数コールとデータ宣言がクライアント・アプリケーションをサポートしてリモート・ホスト・トランザクションを制御する方法について説明します。 これらのセクションでは、TIPがクライアント・アプリケーションに対して何をするか、およびTIPがリモート・ホスト・トランザクションとデータを交換する方法に関するバックグラウンド情報も提供します。
7.2 クライアント・アプリケーションの準備
クライアント・アプリケーションの実行を準備するには、リモート・ホスト・トランザクション要件を理解してから、次のステップを実行します:
7.2.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言語リファレンス」を参照してください。 次の説明では、ヒント内で実行する必要があるロジックについて説明します。 Microsoft Windowsの%ORACLE_HOME%\dg4appc\demo\IMSディレクトリおよびUNIXベースのシステムの$ORACLE_HOME/dg4appc/demo/IMSディレクトリにある、ファイル pgtflip.pkh、 pgtflip.pkbおよび pgtflipd.sqlにあるサンプルTIPおよびドライバを参照してください。
7.3 ヒントおよびリモート・トランザクション・プログラムの対応の確認
リモート・ホスト・トランザクション・プログラムとそれに関連するクライアント・アプリケーションとのTIPは、の2つの主要な要件に対応している必要があります:
-
トランザクションDATAの定義方法によるパラメータ・データ型変換。 PGAUで生成されたTIPがデータ定義に基づいてどのようにデータを変換するかについては、「データ型の変換」を参照してください。
-
TCP/IP送信/受信同期。これは、トランザクション
CALLの定義方法の結果です。
これらのDATAおよびCALL定義は、参照によってTRANSACTION定義に含まれます。
pg4tcpmapツールを使用して、SIDEPROFILE名がTCP/IP属性およびIMS Connect属性にマップされていることを確認します。
7.3.1 DATA対応
リモート・ホスト・トランザクションの言語でプログラムされたデータ定義を使用して、 PGAU DEFINE DATAコマンドは、 PGAU GENERATEに必要な情報を PG DDに格納し、実行するTIP関数ロジックを作成します:
-
受信側リモート・ホスト・トランザクションによって提供されるPL/SQL
INパラメータからのすべてのデータ変換 -
受信側のリモート・ホスト・トランザクションで予期される形式へのすべてのバッファリング
-
送信側リモート・ホスト・トランザクションによって提供される形式からのすべてのデータ・アン・バッファリング
-
送信側リモート・ホスト・トランザクションによって提供されるPL/SQL
OUTパラメータへのすべてのデータ変換
PGAUは、リモート・ホスト・トランザクション・プログラムに含まれるデータ定義から変換およびバッファリング・ロジックを生成するために必要な情報を決定します。 PGAU DEFINE DATAは、COBOLコピー・ブックなどのファイルからこの情報を読み取り、スクリプトからストリーム内で読み取り、繰り返し使用するためにPG DDに保存します。 Gateway管理者は、これらの定義ファイルをリモート・ホストから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は、入力プログラムのデータ定義ファイルから必要なデータ型情報を自動的に抽出します。
この例では、FLIPINおよびFLIPOUTが交換される引数です。
PGTFLIP_MAIN(trannum,FLIPIN,FLIPOUT)
したがって、次の各パラメータに対してPGAU DEFINE DATA文を発行する必要があります:
DEFINE DATA FLIPIN
PLSDNAME (FLIPIN)
USAGE (PASS)
LANGUAGE (IBMVSCOBOLII)
(
01 MSGIN PIC X(20).
);
DEFINE DATA FLIPOUT
PLSDNAME (flipout)
USAGE (PASS)
LANGUAGE (IBMVSCOBOLII)
(
01 MSGOUT PIC X(20).
);
trannum引数には定義は必要ありません。 これはAPPC会話識別子であり、PGAUでの定義は必要ありません。
7.3.2 CALL対応
TCP/IP send()とreceive()を同期する必要性は、リモート・トランザクション・プログラムがデータ・パラメータの入力を予期するときに、データ・パラメータを読み取るためにTCP/IP receive()を発行することを意味します。 したがって、TIPにより、ゲートウェイはTCP/IP send()を発行して、データ・パラメータをリモート・トランザクション・プログラムに書き込む必要があります。 また、TIPを使用すると、リモート・トランザクション・プログラムがTCP/IP send()を発行したときに、ゲートウェイがTCP/IP 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 FLIPMAIN
PKGCALL (pgtflip_main)
PARMS ((FLIPIN IN),(FLIPOUT OUT));7.3.2.1 柔軟なコール順序
TIPと各コールのゲートウェイ間で交換されるデータ・パラメータの数は、リモート・トランザクション・プログラムのSEND/RECEIVEリクエストが満たされているかぎり、ユーザーの判断によって異なる場合があります。 たとえば、リモート・トランザクション・プログラムのデータ交換順序は次のようになります:
TCP/IP SEND 5 fields (field1-field5) TCP/IP RECEIVE 1 fields (field6) TCP/IP SEND 1 field (field7) TCP/IP RECEIVE 3 fields (field8 - field10)
TIP/アプリケーション・コールの順序は次のようになります:
tip_call1(parm1 OUT, <-- TCP/IP SEND field1 from remote TP
parm2 OUT, <-- TCP/IP SEND field2 from remote TP
parm3 OUT); <-- TCP/IP SEND field3 from remote TP
tip_call2(parm4 OUT, <-- TCP/IP SEND field4 from remote TP
parm5 OUT); <-- TCP/IP SEND field5 from remote TP
tip_call3(parm6 IN OUT); --> TCP/IP RECEIVE field6 in remote TP
<-- TCP/IP SEND field7 from remote TP
tip_call4(parm8 IN, --> TCP/IP RECEIVE field8 into remote TP
parm9 IN, --> TCP/IP RECEIVE field9 into remote TP
parm10 IN); --> TCP/IP RECEIVE field10 into remote TP
これら4つのパブリック関数をTIPに定義するには、4つのPGAU DEFINE CALL文を発行し、それぞれに一意のパブリック関数名(tip_callx)と交換するデータ・パラメータ・リストを指定する必要があります。 データ・アイテムは、DEFINE DATAを使用して定義されると、任意のモード(IN、OUTまたはIN OUT)で複数のコールで参照できます。 たとえば、parm6のかわりにparm5を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関数コール間の対応を、ユーザーに最も適した方法で定義できます。
7.3.2.2 コール対応オーダーの制限
各TIPパブリック関数は、最初にすべてのINパラメータを送信してから、OUT p パラメータを受け取ります。 したがって、1つのフィールドを送信して1つのフィールドを受信するリモート・トランザクション・プログラムは、個別のTIPコールに対応している必要があります。
たとえば:
tip_callO( parmO OUT); <-- TCP/IP SEND outfield from remote TP
PGAXFER RPCは、最初に送信するパラメータをチェックしますが、何も検出されず、パラメータの受信に進みます:
tip_callI( parmI IN); --> TCP/IP RECEIVE infield to remote TP
PGAXFER RPCは、受信するパラメータを送信してチェックするパラメータを処理しますが、何も検出して完了しません。したがって、INパラメータがパラメータ・リスト内の位置に関係なく最初に処理されるため、OUTパラメータとINパラメータが続く単一のTIPパブリック関数は機能しません。
7.3.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 文を使用して、この情報を PGA_TCP_IMSC表の挿入された行と照合します。
DEFINE TRANSACTION IMSFLIP
CALL (FLIPMAIN)
SIDEPROFILE(PGATCP)
TPNAME(FLIP)
NLS_LANGUAGE("american_america.us7ascii");7.4 クライアント・アプリケーションからのヒントの呼出し
ヒントを作成したら、クライアント・アプリケーションをTIPとインタフェースするように記述する必要があります。 TIP関数を呼び出すクライアント・アプリケーションには、次の5つの論理セクションが含まれている必要があります:
-
TIP変数の宣言
-
会話の初期化
-
データの交換
-
会話の終了
-
エラー処理
7.4.1 ヒント変数の宣言
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);
ここで、「表7-2」は各パラメータの説明を示します:
表7-2 関数宣言
| パラメータ | 説明 |
|---|---|
|
|
パッケージ仕様部で定義されているTIP関数名。 |
|
|
このTIPコールがデータを交換する会話を識別するTIP init関数から返されるリモート・トランザクション・インスタンス・パラメータ。 |
|
|
|
|
|
PL/SQLアトミック・データ型です。 |
|
|
リモート・トランザクション・プログラム・レコード・フィールドに対応するPL/SQLレコード・フィールドです。 |
クライアント・アプリケーションでは、PL/SQLアトミック・データ型は、TIP関数定義内の対応する引数のまったく同じデータ型として定義する必要があります。 BEGINコマンドの前に、クライアント・アプリケーションで次の内容をコーディングする必要があります:
appl_var pls_type1; /* declare appl variable for .... */
TIPデータ型を再定義する必要はありません。 これらは、クライアント・アプリケーション内でローカルに宣言する必要があり、BEGINの前にクライアント・アプリケーションに表示されます:
appl_record tipname.tran_rectype; /* declare appl record */
「表7-3」は、各プロシージャ宣言の意味を示します:
表7-3 プロシージャ宣言
| 項目 | 説明 |
|---|---|
|
|
TIPと交換され、クライアント・アプリケーション内で使用されるPL/SQLレコードです。 |
|
|
Oracleデータベースに格納されているPL/SQLパッケージ(TIP)名です。 これは、TIP仕様の文 |
|
|
|
参照できるユーザー宣言の詳細は、tipname .docコンテンツ・ファイルを参照してください。
クライアント・アプリケーションは、TIPパブリック関数をローカルPL/SQL関数であるかのようにコールします:
rc = tip_call1( tranuse,
appl_var,
appl_record);
TCP/IP IMS Connectの例では、PL/SQLドライバの pgtflipd.sql(はMicrosoft Windowsの%ORACLE_HOME%\dg4appc\demo\IMSディレクトリにあり、UNIXベースのシステムの$ORACLE_HOME/dg4appc/demo/IMSディレクトリにあります)がクライアント・アプリケーションであり、次の宣言が含まれています:
... ... CREATE or REPLACE PROCEDURE pgtflipd(mesgin IN CHAR) IS trannum INTEGER :=0 /* transaction usage number */ mesgout VARCHAR2(254); /* the output parameter */ rc INTEGER :=0 /* PGA RPC return codes */ term INTEGER :=0; /* 1 if pgtflip_term called */ ... ...
7.4.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(2000), /* Transaction Program */
transync BINARY_INTEGER, /* RESERVED */
trannls VARCHAR2(50), /* RESERVED */
oltpname VARCHAR2(2000), /* Logical Unit */
oltpmode VARCHAR2(2000), /* LOG Mode Entry */
netaddr VARCHAR2(2000), /* Side Profile */
tracetag VARCHAR2(2000), /* gateway trace idtag */
FUNCTION pgtflip_init( /* init standard */
tranuse IN OUT BINARY_INTEGER)
RETURN INTEGER;
FUNCTION pgtflip_init( /* init override */
tranuse IN OUT BINARY_INTEGER,
override IN override_Typ)
RETURN INTEGER;
FUNCTION pgtflip_init( /* init diagnostic */
tranuse IN OUT BNARY_INTEGER,
tipdiag IN CHAR)
RETURN INTEGER;
FUNCTION pgtflip_init( /* init over-diag */
tranuse IN OUT BINARY_INTEGER,
override IN override_Typ,
tipdiag IN CHAR)
RETURN INTEGER;
7.4.2.1 トランザクション・インスタンス・パラメータ
この トランザクション・インスタンス番号(tranuseの例を参照)は、後続のTIP交換および終了関数に渡す必要があります。 これは、 TCP/IPが対話するゲートウェイ(つまり、リモート・トランザクション・プログラムの反復)を識別し、データが転送されるか通信が終了します。
1つのクライアント・アプリケーションで、同じリモート・トランザクション・プログラムの複数のインスタンスまたは複数の異なるリモート・トランザクション・プログラムのすべてを同時に制御できます。 トランザクション・インスタンス番号は、ゲートウェイを介したクライアント・アプリケーション・コールを意図したリモート・トランザクション・プログラムにルーティングするためのTIPのメカニズムです。
クライアント・アプリケーションは、アクティブな各トランザクションのトランザクション・インスタンス番号を保存し、そのトランザクションに対してコールされた各TIP機能に正しい番号を渡す必要があります。
クライアント・アプリケーションは、TIP初期化関数をローカルのPL/SQL関数であるかのようにコールします。 たとえば:
... ... trannum INTEGER := 0;/* transaction usage number*/ ... ... BEGIN rc := pgtflip.pgtflip_init(trannum); ... ...
7.4.2.2 TIP初期化の上書き
前述の例では、クライアント・アプリケーションはリモート・トランザクション・プログラム名、ネットワーク接続またはセキュリティ情報を指定していません。 TIPには、このような情報がデフォルトとして内部的にコーディングされており、クライアント・アプリケーションは、選択したリモート・トランザクション・プログラムに適したTIPをコールするだけです。 ただし、クライアント・アプリケーションはオプションで一部のTIPデフォルトをオーバーライドし、セキュリティ情報を提供できます。
オーバーライドを必要としないクライアント・アプリケーションを変更する必要はありません。
PG DDでリモート・ホスト・トランザクションが定義されている場合、DEFINE TRANSACTION文では、オーバーライド可能な特定のデフォルトのOLTPおよびネットワーク識別属性が指定されています:
-
TPname
-
サイド・プロファイル
DEFINE TRANSACTION文の詳細は、「プロシージャ・ゲートウェイ管理ユーティリティ」の" DEFINE TRANSACTION "を参照してください。
これらのPG DD定義トランザクション属性は、デフォルトとしてTIPに生成され、 TIP初期化時にオーバーライドできます。 これにより、テスト・トランザクションまたはシステムで使用できる1つのヒントの使用が容易になり、後でTIPを再生成することなく本番トランザクションまたはシステムで使用できます。
override_Typレコード・データ型は、クライアント・アプリケーションでオーバーライドできる様々なトランザクション属性を示します。 現在サポートされている バージョンは次のとおりです:
-
trannameを設定して、DEFINE TRANSACTION文のTPNAMEパラメータで指定された値をオーバーライドできます -
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 (IMS Connect SYNCLEVEL)およびtrannls (グローバリゼーション・サポート文字セット)は、オーバーライド・レコード・データ型で定義されますが、将来の使用のために予約されています。 RHT SYNCLEVELおよびグローバリゼーション・サポート名はオーバーライドできません。
クライアント・アプリケーションは、次の理由により、TIP初期化時のデフォルト属性をオーバーライドすることがあります:
-
別のバージョンのRHTを起動する(テストではなく本番など)
-
RHTを含むOLTPのロケーションを変更する(移行またはバックアップ構成への切替えによってOLTPが移動された場合)
オーバーライドが必要なクライアント・アプリケーションは、オーバーライドと初期化パラメータの任意の組合せを使用でき、TIPを再生成したり、パラメータをオーバーライドしないアプリケーションに影響を与えることなく、いつでも組合せを変更できます。
TIPのデフォルトをオーバーライドするには、追加のクライアント・アプリケーション・レコード変数をoverride_Typデータ型として宣言し、値をオーバーライド・サブフィールドに割り当て、オーバーライド・レコード変数をクライアント・アプリケーションからのTIP初期化コールで渡す必要があります。 たとえば:
... ... my_overrides pgtflip.override_Typ; -- declaration ... ... my_overrides.oltpname := 'IVTNO'; -- swap to production IMS my_overrides.tranname := 'IVTNV'; -- new transaction name BEGIN rc := pgtflip.pgtflip_init(trannum,my_overrides); -- init ... ...
ヒント内では、オーバーライド属性は構文の問題がないかチェックされ、ゲートウェイ・サーバーに渡されます。
7.5 データの交換
クライアント・アプリケーションは、前のtip_initコールから返されたトランザクション・インスタンス番号を渡して、影響を受けるリモート・トランザクション・プログラムを識別し、リモート・トランザクション・プログラムと交換されるクライアント・アプリケーション・データ・パラメータを識別する必要があります。
このIMS Connect照会の例では、従業員番号を渡し、従業員レコードを返送します:
rc = pgtflip.pgtflip_main(trannum, /* transfer data */
mesgin, /* input parameter */
mesgout); /* output parameter*/7.5.1 会話の終了
クライアント・アプリケーションは、TIP終了関数をローカルのPL/SQL関数であるかのようにコールします。 たとえば:
... ... term := 1; /* indicate term called */ rc := pgtflip.pgtflip_term(trannum,0); /* terminate normally */ ... ...
トランザクションを終了するためにTIP終了コールでトランザクション・インスタンス番号が渡された後、またはリモート・トランザクション・プログラムが異常終了した後、その特定のトランザクション・インスタンス番号が忘れられることがあります。
7.5.2 エラー処理
クライアント・アプリケーションには、クライアント・アプリケーションが終了する前に、アクティブなTCP/IP会話をクリーンアップできる例外ハンドラが含まれている必要があります。 pgtflipd.sqlで提供されているサンプル・クライアント・アプリケーションには、例外処理の例が含まれています。
ゲートウェイ例外は、PGA-20900からPGA-20999、PGA-22000からPGA 22099の範囲でレポートされます。 例外が発生した場合は、TIP初期化関数への以前の呼び出しによって開始されたアクティブな会話に対して、TIP終了関数を呼び出す必要があります。
たとえば:
EXCEPTION WHEN OTHERS THEN IF term = 0 THEN /* terminate function not called yet */ rc := pgtflip.pgtflip_term(trannum,1); /*terminate abnormally*/ END IF; RAISE;
リモート・トランザクションには、IMS一時ストレージ・キュー領域へのデバッグ情報の書込みなど、エラー処理およびデバッグの規定も含まれる必要があります。 Oracle例外のインターセプトおよび処理方法の詳細は、「Oracle Database PL/SQL言語リファレンス」を参照してください。
7.5.3 実行権限の付与
TIPは標準の PL/SQLパッケージであり、クライアント・アプリケーションからTIPをコールするユーザーに実行権限を付与する必要があります。 この例では、pgtflipパッケージに対する実行をユーザーSCOTTに付与します:
GRANT EXECUTE ON PGTFLIP TO SCOTT
詳細は、「Oracle Database管理者ガイド」を参照してください。
7.6 PG4TCPMAPの呼出し
TCP/IPを使用してゲートウェイで会話を行うために、PGAUを変更する必要はありません。 PGAUのAPPC形式を使用しますが、pg4tcpmapツールを使用してパラメータをTCP/IPにマップします。
TCP/IPを使用してDEFINE TRANSACTIONパラメータをマップするには、アプリケーションを実行する前に、PGA_TCP_IMSC表内に有効な入力が必要です。 マッピング・ツールの設定および使用の詳細は、「PG4TCPMAPコマンド(TCP/IPのみ)」を参照してください。
7.7 アプリケーションの実行
クライアント・アプリケーションを実行する前に、ホストへの接続が確立され、受信側パートナが使用可能であることを確認します。 この例では、PL/SQLドライバPGTFLIPDを使用して、IMS/IMS Connect照会を実行します。 このクライアント・アプリケーションを実行するには、SQL*Plusから次のように入力します:
set serveroutput on
execute pgtflipd('hello');7.8 マルチバイト文字セットのサポートによるアプリケーション開発
COBOLは、現在、 PIC Gデータ型のダブル・バイト文字セット( DBCS)のみをサポートしています。
PGAUは、IBM VS COBOLII PIC Gデータ型をPL/SQL VARCHAR2変数として処理し、リモート・ホスト・データおよびローカルOracleデータに指定されたOracle NLS_LANGUAGEに従ってデータを自動的に変換するヒントを生成します。
これらの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' VARCHAR2sは、シフト・アウトおよびシフト・イン・メタ文字の削除により最大長より短い長さにすることができ、送信された'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_MBCS_DATA PIC G(50). 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入力制御ファイルに配置できるため、リモート・ホストの定義を変更する必要はありません。
7.9 ヒントを使用するために必要な権限
実行権限は、TIPまたはプロシージャのコール元に明示的に付与する必要があります。 この権限は、ロールを介しては付与できません。
TIPをトレースするTIPユーザーには、rtraceおよびptraceプロシージャの実行権限を付与する必要があります。 詳細は、インストール・ガイドの通信プロトコルに適した「PGAUの構成」セクションおよび「Oracle Database開発ガイド」を参照してください。
たとえば:
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スクリプトは、UNIXベースのシステムのディレクトリにあるMicrosoft Windowsおよび$ORACLE_HOME/dg4appc/adminの%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;