7 クライアント・アプリケーションの開発(TCP/IPのみ)
以降のトピックでは、ゲートウェイがIMS ConnectのTCP/IPサポートを使用している場合に、TIPを呼び出してリモート・ホスト・トランザクションを制御する方法について説明します。 また、ゲートウェイ・トランザクションを準備して実行するためのステップも提供します。
前提は次のとおりです。
-
リモート・ホスト・トランザクション(RHT)は既に書かれている
-
RHTに対応するTIPは、「TIPの作成」で説明されているステップを使用して既に定義されています。
-
pg4tcpmapツールを使用して、SIDE PROFILE名、TCP/IPホスト名、ポート番号、およびその他のIMS Connectパラメータを使用して、PGA_TCP_IMSCマッピング表が作成されました。
トピック:
7.1 クライアント・アプリケーションの概要
手順ゲートウェイ管理ユーティリティ(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がリモート・ホスト・トランザクションとのデータ交換を呼び出す方法についてのバックグラウンド情報も提供します。
7.2 クライアント・アプリケーションの準備
クライアント・アプリケーションの実行を準備するには、リモート・ホストのトランザクション要件を理解してから、次のステップを実行する必要があります:
7.2.1 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を参照してください。
7.3 TIPとリモート・トランザクション・プログラムの通信の確保
リモート・ホストのトランザクション・プログラムとそれに関連するクライアント・アプリケーションのTIPは、 2つの重要な要件に対応している必要があります:
-
トランザクションDATAが定義されている方法に起因するパラメータ・データ型の変換。 PGAUで生成されたTIPがデータ定義に基づいてデータをどのように変換するかについては、「データ型変換」を参照してください。
-
TCP/IPは、トランザクション
CALLが定義されている方法から生じる同期の送受信です。
これらのDATAとCALLの定義は、TRANSACTIONの定義で参照されます。
pg4tcpmapツールを使用して、SIDEPROFILE名がTCP/IPおよびIMS Connect属性にマップされていることを確認してください。
7.3.1 データ通信
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で定義する必要はありません。
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処理は、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));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に定義するには、それぞれ固有のパブリック関数名(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機能コールとの間の対応関係を定義することができます。
7.3.2.2 連絡文書のオーダー制限を呼び出す
各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パラメータが最初に処理されるためです。
7.3.3 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");7.4 クライアント・アプリケーションからTIPを呼び出す
TIPが作成されたら、クライアント・アプリケーションをTIPとのインタフェースに書き込む必要があります。 TIP関数を呼び出すクライアント・アプリケーションには、5つの論理セクションが含まれている必要があります:
-
TIP変数を宣言
-
会話を初期化
-
データの交換
-
会話を終了
-
エラー処理
7.4.1 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 */ ... ...
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診断については、「トラブルシューティング」を参照してください。 -
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;
7.4.2.1 トランザクション・インスタンス・パラメータ
この トランザクション・インスタンス番号(例ではtranuse)は、後続のTIP交換および終了機能に渡されなければなりません。 それは、TCP/IP会話(したがって、リモート・トランザクション・プログラムの反復)がデータを送信または通信終了するゲートウェイを識別します。
単一のクライアント・アプリケーションが、同じリモート・トランザクション・プログラムまたは複数の異なるリモート・トランザクション・プログラムの複数のインスタンスを同時に制御する可能性があります。 トランザクション・インスタンス番号は、クライアント・アプリケーション・コールをゲートウェイを介して意図されたリモート・トランザクション・プログラムにルーティングするためのTIPのメカニズムです。
各アクティブ・トランザクションのトランザクション・インスタンス番号を保存し、そのトランザクションのために呼び出される各TIP関数に正しいものを渡すのはクライアント・アプリケーションの責任です。
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP初期化関数を呼び出します。 次に例を示します。
... ... 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の使用が容易になり、後で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内で、上書き属性の構文上の問題がチェックされ、ゲートウェイ・サーバーに渡されます。
7.5 データの交換
クライアント・アプリケーションは、以前のtip_init呼び出しから返されたトランザクション・インスタンス番号を渡して、影響を受けるリモート・トランザクション・プログラムを識別し、リモート・トランザクション・プログラムと交換されるクライアント・アプリケーション・データ・パラメータを識別する必要があります。
このIMS Connectの照会の例では、従業員番号を渡して従業員レコードを受け取っています:
rc = pgtflip.pgtflip_main(trannum, /* transfer data */
mesgin, /* input parameter */
mesgout); /* output parameter*/7.5.1 会話を終了
クライアント・アプリケーションは、ローカルのPL/SQL関数のようにTIP終了関数を呼び出します。 次に例を示します。
... ... 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パッケージのexecuteをユーザーSCOTTに付与します:
GRANT EXECUTE ON PGTFLIP TO SCOTT
詳細については、「Oracle Database管理者ガイド」を参照してください。
7.6 PG4TCPMAPの呼び出し
TCP/IPを使用してゲートウェイ上で会話を行うために、PGAUを変更する必要はありません。 PGAUのAPPC形式を使用しますが、pg4tcpmapツールを使用してパラメータをTCP/IPにマップします。
DEFINE TRANSACTIONパラメータを TCP/IPを使用してマップするには、アプリケーションを実行する前に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に従ってデータを自動的に変換する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入力制御ファイルに入れることができるため、リモート・ホスト定義を変更する必要はありません。
7.9 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;