7 クライアント・アプリケーションの開発(TCP/IPのみ)
以降のトピックでは、ゲートウェイがIMS ConnectのTCP/IPサポートを使用している場合に、TIPを呼び出してリモート・ホスト・トランザクションを制御する方法について説明します。 また、ゲートウェイ・トランザクションを準備して実行するためのステップも提供します。
前提は次のとおりです。
-
リモート・ホスト・トランザクション(RHT)は既に書かれている
-
RHTに対応するTIPは、「TIPの作成」で説明されているステップを使用して既に定義されています。
-
pg4tcpmap
ツールを使用して、SIDE PROFILE
名、TCP/IPホスト名、ポート番号、およびその他のIMS Connectパラメータを使用して、PGA_TCP_IMSC
マッピング表が作成されました。
トピック:
クライアント・アプリケーションの概要
手順ゲートウェイ管理ユーティリティ(PGAU)は、提供する定義を使用して完全なTIPを生成します。 クライアント・アプリケーションは、リモート・ホスト・トランザクションにアクセスするためにTIPを呼び出すことができます。 「手続き型ゲートウェイ管理ユーティリティ」は、PGAUの使用について詳しく説明しています。
この概要では、TIPを呼び出してリモート・ホスト・トランザクションを制御するために必要な作業について説明します。
ゲートウェイはOracleデータベースからPL/SQLコールを受信し、リモート・トランザクション・プログラムと通信するためにTCP/IPコールを発行します。
以下のアプリケーション・プログラムがこれを可能にします:
-
SIDE PROFILE
の名前とTCP/IPホスト名、ポート番号、およびその他のIMS Connectパラメータとともに、pg4tcpmapツールを使用して入力されたPGA_TCP_IMSC
マッピング表。 -
Transactionインタフェース・パッケージ(TIP)。 TIPは、クライアントとゲートウェイ間の通信を処理し、COBOLとPL/SQL間のデータ型変換を実行するPL/SQLパッケージです。
-
PGAUはあなたのTIP仕様を生成します。 出荷されたサンプルでは、PGAUで生成されたパッケージは
pgtflip.pkb
と呼ばれます。 この生成されたTIPには、リモート・トランザクション・プログラムにマップされる少なくとも3つの関数呼び出しが含まれます:-
pgtflip_init
は、リモート・トランザクション・プログラムとの会話を初期化 -
pgtflip_main
は、リモート・トランザクション・プログラムとアプリケーション・データを交換 -
pgtflip_term
は、リモート・トランザクション・プログラムとの会話を終了
独自のTIPやデバッグを作成する場合は、TIPの詳細については「TIP内部」を参照してください。
-
-
TIPを呼び出すクライアント・アプリケーション。
クライアント・アプリケーションは、入出力引数を持つ3つのTIP関数を呼び出します。 この例では、クライアント・アプリケーションは入力とリモート・トランザクションを渡し、リモート・トランザクションはフリップされた入力を出力として返します。
「表7-1」は、IMS Connect-IMSトランザクションの例を使用して、PL/SQLドライバ、TIP、およびゲートウェイ間の論理フローを示します。
表7-1 IMS Connect-IMSの例のロジック・フロー
クライアント・アプリケーション | Oracle TIP | ゲートウェイとリモート・トランザクション(メインフレームIMS)の間に確立された手順 |
---|---|---|
|
|
ゲートウェイはTCP/IPソケットを発行し、IMS Connectとの会話を開始するために接続します。 |
|
|
ゲートウェイはIMS ConnectにTCP/IP |
|
|
ゲートウェイはTCP/IP |
ゲートウェイを利用してリモート・ホスト・トランザクションとデータを交換するクライアント・アプリケーションは、それ自体のためにいくつかのタスクを実行し、そのためにTIPに他のタスクを実行するよう指示します。 したがって、クライアント・アプリケーションの設計者は、リモート・トランザクションの動作とTIPが交換を容易にする方法を知る必要があります。
以下のセクションでは、リモート・ホスト・トランザクションの動作の概要、この動作がクライアント・アプリケーションによってどのように制御されるか、TIP関数呼び出しとデータ宣言がクライアント・アプリケーションをサポートしてリモート・ホスト・トランザクションを制御する方法について説明します。 これらのセクションでは、クライアント・アプリケーションのために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内で実行する必要があるロジックについて説明します。 Microsoft Windowsの場合%ORACLE_HOME%\dg4appc\demo\IMS
ディレクトリおよびUNIXベース・システムの場合$ORACLE_HOME/dg4appc/demo/IMS
ディレクトリにあるサンプルTIPおよびドライバのファイル pgtflip.pkh
、 pgtflip.pkb
、および pgtflipd.sql
を参照してください。
TIPとリモート・トランザクション・プログラムの通信の確保
リモート・ホストのトランザクション・プログラムとそれに関連するクライアント・アプリケーションのTIPは、 2つの重要な要件に対応している必要があります:
-
トランザクションDATAが定義されている方法に起因するパラメータ・データ型の変換。 PGAUで生成されたTIPがデータ定義に基づいてデータをどのように変換するかについては、「データ型変換」を参照してください。
-
TCP/IPは、トランザクション
CALL
が定義されている方法から生じる同期の送受信です。
これらのDATA
とCALL
の定義は、TRANSACTION
の定義で参照されます。
pg4tcpmap
ツールを使用して、SIDEPROFILE
名がTCP/IPおよびIMS Connect属性にマップされていることを確認してください。
データ通信
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
は、必要なデータ型情報を入力プログラムのデータ定義ファイルから自動的に抽出します。
この例では、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で定義する必要はありません。
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
処理は、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 FLIPMAIN PKGCALL (pgtflip_main) PARMS ((FLIPIN IN),(FLIPOUT OUT));
フレキシブルなコール・シーケンス
各呼び出しで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に定義するには、それぞれ固有のパブリック関数名(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); <-- TCP/IP SEND outfield from remote TP
PGAXFER
RPCは最初に送信するパラメータをチェックしますが、見つからずパラメータを受け取るようになります:
tip_callI( parmI IN); --> TCP/IP 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
文を使用して、この情報を PGA_TCP_IMSC
表の挿入行と照合します。
DEFINE TRANSACTION IMSFLIP CALL (FLIPMAIN) SIDEPROFILE(PGATCP) TPNAME(FLIP) NLS_LANGUAGE("american_america.us7ascii");
クライアント・アプリケーションから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);
ここで、「表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 手続き宣言
項目 | 説明 |
---|---|
|
PL/SQLレコードはTIPと交換され、クライアント・アプリケーション内で使用されます。 |
|
PL/SQLパッケージ(TIP)名がOracleデータベースに格納されているかどうか。 これは、TIP仕様の文 |
|
|
参照可能なユーザー宣言の完全な説明については、tipname
.doc
コンテンツ・ファイルを参照してください。
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP public関数を呼び出します:
rc = tip_call1( tranuse, appl_var, appl_record);
TCP/IP IMS Connectの例では、Microsoft Windowsの%ORACLE_HOME%\dg4appc\demo\IMS
ディレクトリに、UNIXベースのシステムの$ORACLE_HOME/dg4appc/demo/IMS
ディレクトリに配置されているPL/SQLドライバ pgtflipd.sql
はクライアント・アプリケーションであり、次の宣言が含まれています:
... ... 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 */ ... ...
会話の初期化
の呼び出しは、会話を初期化するためにいくつかの目的を果たします:
-
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(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;
トランザクション・インスタンス・パラメータ
この トランザクション・インスタンス番号(例ではtranuse
)は、後続のTIP交換および終了機能に渡されなければなりません。 それは、TCP/IP会話(したがって、リモート・トランザクション・プログラムの反復)がデータを送信または通信終了するゲートウェイを識別します。
単一のクライアント・アプリケーションが、同じリモート・トランザクション・プログラムまたは複数の異なるリモート・トランザクション・プログラムの複数のインスタンスを同時に制御する可能性があります。 トランザクション・インスタンス番号は、クライアント・アプリケーション・コールをゲートウェイを介して意図されたリモート・トランザクション・プログラムにルーティングするためのTIPのメカニズムです。
各アクティブ・トランザクションのトランザクション・インスタンス番号を保存し、そのトランザクションのために呼び出される各TIP関数に正しいものを渡すのはクライアント・アプリケーションの責任です。
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP初期化関数を呼び出します。 次に例を示します。
... ... trannum INTEGER := 0;/* transaction usage number*/ ... ... BEGIN rc := pgtflip.pgtflip_init(trannum); ... ...
TIP初期化のオーバーライド
前述の例では、クライアント・アプリケーションはリモート・トランザクション・プログラム名、ネットワーク接続、またはセキュリティ情報を指定していないことに注意してください。 TIPはそのような情報を内部的にデフォルトとしてコード化しており、クライアント・アプリケーションは選択されたリモート・トランザクション・プログラムに対して適切なTIPを単に呼び出すだけです。 ただし、クライアント・アプリケーションは、オプションでTIPのデフォルトを上書きしてセキュリティ情報を提供することもできます。
上書きを必要としないクライアント・アプリケーションを変更する必要はありません。
リモート・ホスト・トランザクションがPG DDで定義されている場合、DEFINE TRANSACTION
文は、デフォルトのOLTPおよびネットワーク識別属性を指定しました。これらの属性はオーバーライドできます:
-
TPname
-
サイド・プロファイル
DEFINE TRANSACTION
文の詳細については、「手続き型ゲートウェイ管理ユーティリティ」の"DEFINE TRANSACTION"を参照してください。
これらのPG DD定義のトランザクション属性は、デフォルトとしてTIPに生成され、TIP初期化時にオーバーライドできます。 これにより、テスト・トランザクションまたはシステムで使用できる1つのTIPの使用が容易になり、後で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 ... ...
TIP内で、上書き属性の構文上の問題がチェックされ、ゲートウェイ・サーバーに渡されます。
データの交換
クライアント・アプリケーションは、以前のtip_init
呼び出しから返されたトランザクション・インスタンス番号を渡して、影響を受けるリモート・トランザクション・プログラムを識別し、リモート・トランザクション・プログラムと交換されるクライアント・アプリケーション・データ・パラメータを識別する必要があります。
このIMS Connectの照会の例では、従業員番号を渡して従業員レコードを受け取っています:
rc = pgtflip.pgtflip_main(trannum, /* transfer data */ mesgin, /* input parameter */ mesgout); /* output parameter*/
会話を終了
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP終了関数を呼び出します。 次に例を示します。
... ... term := 1; /* indicate term called */ rc := pgtflip.pgtflip_term(trannum,0); /* terminate normally */ ... ...
トランザクションを終了するためにトランザクション・インスタンス番号がTIP終了コールに渡された後、またはリモート・トランザクション・プログラムが異常終了した後、その特定のトランザクション・インスタンス番号を忘れてしまう可能性があります。
エラー処理
クライアント・アプリケーションには、クライアント・アプリケーションが終了する前にアクティブな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言語リファレンス」を参照してください。
実行権限の付与
TIPは標準のPL/SQLパッケージであり、クライアント・アプリケーションからTIPを呼び出すユーザーに実行権限を与える必要があります。 この例では、pgtflip
パッケージのexecuteをユーザーSCOTT
に付与します:
GRANT EXECUTE ON PGTFLIP TO SCOTT
詳細については、「Oracle Database管理者ガイド」を参照してください。
PG4TCPMAPの呼び出し
TCP/IPを使用してゲートウェイ上で会話を行うために、PGAUを変更する必要はありません。 PGAUのAPPC形式を使用しますが、pg4tcpmap
ツールを使用してパラメータをTCP/IPにマップします。
DEFINE TRANSACTION
パラメータを TCP/IPを使用してマップするには、アプリケーションを実行する前にPGA_TCP_IMSC
表内に有効な入力がなければなりません。 マッピング・ツールの設定と使用については、「PG4TCPMAPコマンド(TCP/IPのみ)」を参照してください。
アプリケーションの実行
クライアント・アプリケーションを実行する前に、ホストへの接続が確立され、受信パートナが使用可能であることを確認してください。 この例では、PL/SQLドライバPGTFLIPD
を使用してIMS/IMS Connect照会を実行します。 このクライアント・アプリケーションを実行するには、SQL*Plusから次のように入力します:
set serveroutput on execute pgtflipd('hello');
マルチバイト文字セット・サポートによるアプリケーション開発
COBOLは現在、PIC Gデータ型用のダブル・バイト文字セット(DBCS)のみをサポートしています。
PGAUは、IBM VS 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' VARCHAR2s
は、シフト・アウトおよびシフト・イン・メタ文字の削除により最大長以下の長さを持つことができ、送信された'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_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)
を指定し、MY_MBCS_DATA
を再定義するために'05 MY_MBCS_DATA PIC G(51).'
に指定することによって、3フィールド定義を1フィールド定義に再定義できます。 3つのREDEFINE
文をPGAU入力制御ファイルに入れることができるため、リモート・ホスト定義を変更する必要はありません。
TIPを使用するために必要な特権
実行権限は、TIPまたは手続きの呼び出し元に明示的に付与されなければなりません。 この権限は、ロールを介しては付与できません。
TIPをトレースしたいTIPユーザーは、rtraceおよびptraceプロシージャに対する実行特権を与える必要があります。 詳細については、インストール・ガイドおよび「Oracle Database開発ガイド」の通信プロトコルに適した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;
database_specification_string
は、ゲートウェイUTL_RAW
およびUTL_PG
コンポーネントがインストールされたOracleデータベースの Oracle Net識別子です。 これは、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から、UNIXベースのシステムのMicrosoft Windowsディレクトリまたは$ORACLE_HOME/dg4appc/admin
ディレクトリの%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;