unloadOnExit

unloadOnExit プロパティーは、呼び出し先プログラムの終了後にそれをアンロードするかどうかを指定します。有効な値は YES または NO です。

unloadOnExit プロパティーには、以下の制約事項があります。
  • このプロパティーは、以下の場所でのみ使用します。
    • BasicProgram ステレオタイプまたは TextUIProgram ステレオタイプを持つプログラム内で exit program 文と組み合わせて使用
    • BasicProgram ステレオタイプまたは TextUIProgram ステレオタイプを持つプログラムに対し、プログラム・レベルで使用

    プログラム・レベルとステートメント・レベルの両方でこのプロパティーを指定した場合は、ステートメント・レベルが優先されます。このトピックの『例』を参照してください。

  • このプロパティーは呼び出し先プログラムのみに影響を与えます。ローカル呼び出し を行う場合を除き、EGL ではこのプロパティーを無視します。ローカルであると見なされるためには、 呼び出しが次のすべての条件を満たす必要があります。
    • 両方のプログラムが同じ言語で生成されている。
    • 両方のプログラムを同じシステムで実行する。
    • リンケージ・オプション・パーツを指定していないか、callLink 要素の type プロパティーに localCall が設定されているかのいずれか。

    Java™ 生成の場合、callLink 要素の linkType プロパティーが LIBRARY に設定されている場合には、unloadOnExit プロパティーには効果はありません。

unloadOnExit プロパティーに NO を設定すると、以下の 結果がもたらされます。
  • 呼び出し先プログラムがメモリー内に残ります。
  • そのプログラムが作成したすべての SQL 結果セットおよび準備済みステートメントは、オープンされたままになります。
  • そのプログラムを再度呼び出すと、ビルド記述子オプション initNonIODataOnCall および initIORecordsOnCall により、プログラム内のグローバル・データを初期化し直すかどうかが制御されます。
unloadOnExit プロパティーに YES を設定すると、以下の 結果がもたらされます。
  • そのプログラム用に割り振られたすべてのメモリーが解放されます。
  • そのプログラムが作成したすべての SQL 結果セットおよび準備済みステートメントがクローズされます。ただし、プログラムが Java またはデバッガーで実行されており、localSqlScope プロパティーに NO が設定されている場合を除きます。
  • そのプログラムを再度呼び出すと、新規コピーが作成されます。

プログラムをアンロードしたときに、そのプログラムが呼び出した他のプログラムはアンロードされません。各プログラムは個別にアンロードまたは保持されます。

保持されたプログラムは、その後の呼び出し後にアンロードされるまでか、実行単位が終了するまで保持されます。transfer to transaction 文によって実行単位が 終了されます。したがって、unloadOnExit プロパティーの値がオーバーライドされます。 保持されたプログラムは transfer to program 文の後まで保持されます。

以下の要素は、単一の実行単位に含まれるすべてのプログラムで共有されます。 したがって、呼び出し先プログラムがアンロードされたときに影響を受けません。
  • ファイル
  • メッセージ・キュー
  • データベース接続
  • DataTable
  • ライブラリー

DL/I プログラムが持つスケジュール済み PSB は一度に 1 つです。この PSB は、 任意の数のプログラムによって共有されます。呼び出し先プログラムのアンロードは、PSB に 影響しません。PSB は依然としてスケジュール済みです。

プログラムが使用するフォームは、グローバル・データであると見なされます。 そのフォームは、呼び出し先プログラムが保持されている間保持され、呼び出し先プログラムがアンロードされるときに破棄されます。

アンロードは、コミットもロールバックも意味しません。

再帰的プログラム呼び出し

COBOL では、再帰的プログラム呼び出しはサポートされていません。

Java では、以下の例に示すような状態の場合を除き、 再帰的ローカル呼び出しをサポートしています。
  1. ProgramA が ProgramB を直接または間接的に呼び出します。
  2. ProgramB が復帰し、保持されます。
  3. ProgramA が ProgramB を再度呼び出します。
  4. ProgramB が直接または間接的に ProgramB 自体を呼び出します。

この例では、最後の call 文が原因で InvocationException がスローされます。したがって、 ローカルの呼び出し先 Java プログラムが復帰し保持されているときは、同時にアクティブにできるそのプログラムのコピーは 1 つのみです。ただし、後でアンロードすることができます。

unloadOnExit プロパティーには、以下の値があります。
YES
プログラム用のすべてのメモリーを解放します。これには SQL 結果セットを含みます。 この値は Java 生成の場合のデフォルトです。デバッグ目的の場合は、「呼び出されたプログラムは、デフォルトで、リターン時にリソースを解放する」設定を設定します。EGL デバッガーの設定の変更を参照してください。
NO
呼び出し先プログラムをメモリー内に保持します。これには、SQL 結果セットおよび その他のすべての変数を含みます。この値は COBOL 生成の場合のデフォルトです。

次の例では、リカバリー不能エラーが発生しなければ、プログラムが呼び出し元に制御権を戻した後、そのプログラムはメモリー内に保持されます。

Program custProcess1 type basicProgram (custNum INT) {unloadOnExit = NO}

  ...

  if(myErrorCode == TERM_ERROR)
    exit program {unloadOnExit = YES};
  end
end