このドキュメントでは、Natural リモートプロシージャコール(RPC)機能を使用するときに注意する必要がある制限および制約事項について説明します。
RPC でサブプログラムを実行する場合、ローカル実行とは次のような異なる点があります。
ユーザー ID を除いて、次の例のように、ユーザーコンテキストはサーバーセッションへは転送されません。
全クライアントセッションパラメータは変更されないので、サーバー側の実行に影響しません。
クライアント側でオープンされているトランザクションをサーバーによってクローズすることはできません。逆の場合も同様です。
クライアントレポート処理およびワークファイル処理は、サーバー側で継続できません。逆の場合も同様です。
Natural スタックの処理も継続できません。
*USER
以外のシステム変数は、クライアントからサーバー側へ転送できません。
エラー状況でのパラメータ処理は異なります。
ローカル実行中にエラーが発生すると、パラメータは "call by reference"(参照渡し)経由で渡されるので、それまでに実行された全パラメータ修正は反映されます。
リモート実行中にエラーが発生すると、全パラメータは変更なしのままです。
サブプログラムのパラメータデータエリアに可変オカレンス数(1:V
表記)が含まれている場合、このサブプログラムを呼び出すためにスタブを使用できません。 スタブは固定オカレンス数の配列定義だけをサポートするので、コールからコールへオカレンス数を変更することはできません。
スタブサブプログラムを使用する必要がある場合、例えば、同じプログラムで EntireX RPC サーバーを呼び出す場合には、Natural クライアント側で X-array を使用する必要があります。 X-array を使用すると、スタブサブプログラムを使用するときでも、コールからコールへオカレンス数を変更できます。 この場合、クライアント側の X-array は、サーバー側の(固定の)可変配列に渡されます。 サーバープログラムはコールごとに変化するオカレンス数を受け取る可能性がありますが、オカレンス数を変更できないため、可変配列は固定されます。
X-array は、リモート CALLNAT
ステートメント実行のパラメータリストでサポートされています。 サーバーは、オカレンス数を増減する場合があります。
多次元配列の場合、配列のすべての次元が拡張可能である必要があります。
下限は拡張可能であってはいけません。つまり、拡張可能な上限のみが許可されます。
一定の限度を持つ配列を含む X-group 配列または X-array を含むグループ配列を使用する場合、スタブサブプログラムを使用する必要があります。 スタブサブプログラムを生成する場合、スタブ生成画面でグループ構造を定義する必要があります。
例:
01 X-Group-Array (/1:*) 02 Array (A10/1:10) * 01 Group-Array (/1:10) 02 X-Array (A10/1:*)
グループ配列または X-group 配列がリモート CALLNAT
ステートメント実行のパラメータリスト内にあり、スタブサブプログラムが使用される場合、次の制限があります。
クライアント Natural オブジェクトからスタブサブプログラムに渡されるグループ配列および X-Group 配列は連続している必要があります。 したがって、すべての次元に対してアスタリスク(*)表記を使用することによって、常に完全な配列をスタブサブプログラムに渡すことを強くお勧めします。 また、クライアント Natural プログラム、スタブサブプログラム、およびサーバープログラムで同一のデータ定義を使用することも強くお勧めします。
RPC サーバー側のサブプログラムの DEFINE DATA PARAMETER
エリア内のグループ配列のストレージレイアウトは、構文に関して必ずしも同一ではありません。 グループ配列内のフィールドを再定義したり、グループ配列を 3GL プログラムに渡したりしないでください。 これらの処理が必要な場合は、グループ配列を DEFINE DATA LOCAL
エリア内の同じレイアウトのグループ配列にコピーし、このローカルグループ配列を 3GL プログラムへのコールで使用します。
リモート CALLNAT
ステートメント実行によって EntireX RPC サーバーを呼び出す場合、スタブサブプログラムを使用することを強くお勧めします。 EntireX RPC サーバーで呼び出すサブプログラムの IDL(Interface Definition
Language)定義にグループ構造が含まれている場合、スタブサブプログラムが必要です。 この場合、[Stub Generation]画面でスタブ生成中に同じグループ構造を定義するか、EntireX IDL ファイルからスタブサブプログラムを生成する必要があります(Windows のみ)。
サブタスキング環境で VSAM データセットにアクセスしたり、VSAM データセットをリージョン間で共有したりする場合、必要となる共有オプションを考慮する必要があります。 例えば、1 つのアドレススペースで VSAM データセットにレコードが挿入され、別のアドレススペースで同じ
VSAM データセットが読み取られる場合、SHAREOPTIONS 2
の代わりにリージョン間 SHAREOPTIONS 4
を設定して、バッファ無効化を強制する必要がある場合があります。 そうしないと、新しく挿入されたレコードが検出されない場合があります。
レコードレベル共有(RLS)の使用も考慮する必要があります。
詳細については、関連する IBM の VSAM ドキュメントを参照してください。
いくつかの Natural ステートメントは、次の例のように、Natural RPC のコンテキストで使用したときに異なる動作をすることがあります。
ステートメント | 説明 |
---|---|
OPEN CONVERSATION CLOSE CONVERSATION |
サーバー上で実行した場合は、これらのステートメントはクライアントセッションには影響しません。 サーバー自身が(エージェントとしての)他のサーバーに対するクライアントとして動作するときは、これらのステートメントは 2 番目のサーバー上の会話にのみ影響します。 |
PASSW |
パスワード設定はサーバー側でのみアクティブなままとなり、他ユーザーによる後続の実行に対してもアクティブなままとなります。 |
SET CONTROL SET GLOBALS SET KEY SET TIME SET WINDOW |
呼び出し元に設定は返されません。 |
STACK |
すべてのスタックデータは、実行後に解放されます。 |
STOP TERMINATE |
これらのステートメントは、クライアントセッションを停止しません。 Natural RPC サーバーを終了する方法については、「Natural RPC サーバーの終了」を参照してください。 |
現在の Natural バージョンでは、RPC との次のステートメントの組み合わせは理論的には可能ですが、予期しない結果を引き起こすためお勧めしません。
ステートメント | 説明 |
---|---|
TERMINATE |
会話が開いている状態に関係なく、サーバーを終了します。 |
FETCH RUN STOP |
これらのステートメントを使用すると、CALLNAT コンテキストの消失を引き起こします。
例外: |
INPUT |
Natural スタックからではなくファイルから読み取る場合、入力データ値は予測できません。 |