CALL(呼び出し)文は、実行単位中で他の実行用プログラムに制御を移させる。
対象とする実行用プログラムの手続きを、番地を指定することによって、間接的に呼ぶことができる。データとデータへのポインターと手続きへのポインターを、パラメーターとして呼び出し先のプログラムに引き渡したり、呼び出し先のプログラムから返してもらったりできる。パラメーター受渡し方式を制御することによって、COBOL以外の言語で書かれたプログラム手続きを呼ぶことができる。
呼ぶばれたCOBOLプログラムは、再帰属性を持っていれば、再帰的に自分を呼ぶことができる。
星印(*)の付いている構文規則はCALL文およびCHAIN文に共通である。それらの規則を「CALL文」または「CHAIN文」に適用するさいには、「CALL文」または「CHAIN文」を読むべきである。
または各国語型データ項目
として定義しなければならない。
定数-2、
および定数-3
は英数字定数、
または各国文字定数
局所記憶節、
通信節、連絡節のいずれかにデータ項目として定義されていなければならず、レベル01またはレベル77のデータ項目、
または基本項目
または任意の集団項目
一意名-2は、ファクトリオブジェクトまたはインスタンスオブジェクトの作業場所節またはファイル節で定義されてはならない。
呼び名は特殊名段落中に定義しなければならない。その方法の詳細については、環境部の章の特殊名段落特殊名段落節を参照。また、ランタイム環境においてサポートされている呼び出し方式の詳細については、COBOLのシステムのマニュアルを参照。
局所記憶節または作業場所節
レベル01またはレベル77のデータ項目、
またはその他のレベルのデータ項目
星印(*)の付いている構文規則はCALL文およびCHAIN文に共通である。それらの規則を「CALL文」または「CHAIN文」に適用するさいには、「CALL文」または「CHAIN文」を読むべきである。
または呼ばれる手続きの名前である。
CALL文を含むプログラムは呼ぶプログラムである。呼び出し先のプログラムがCOBOLプログラムである場合、定数-1、または一意名-1によって参照されるデータ項目の内容はプログラム名であって、呼び出し先のプログラムのプログラム名段落に記述されているものでなければならない(見出し部の章のプログラム名段落プログラム名段落節を参照。特に大文字と小文字の区別について)。
あるいは、定数-1、または一意名-1によって参照されるデータ項目の内容は入口名であって、呼び出し先のプログラムのENTRY文中に記述されているものでなければならない。しかも、呼び出し先のプログラムはすでに呼び出されており、その後で取り消されていてはならない。別の方法として、呼び出し先のプログラムの名前はそのプログラムの実行プログラム用のコードが収められているファイルを指す名前であってもよい。2つのCALL文の間でまたはCALL文とCANCEL文の間で同じファイルを指す別の名前を指定した場合にどのような結果になるかは、オペレーティング システムによって異なる。呼ばれたプログラム、プログラム ファイル、あるいはライブラリ ファイル中に保持されているプログラムと指定された名前の照�
方法の詳細については、インターフェイスに関するCOBOLシステムのマニュアルを参照。
呼び出し先のプログラムがCOBOLプログラムではない場合のプログラム名または手続き名の構成に関する規則が、インターフェイスに関するCOBOLシステムのマニュアルに記載されている。
ON EXCEPTION指定
は、指定されていても無視され、制御はCALL文の末尾に移される。
あるいは、NOT ON EXCEPTION指令が指定されていると、制御は無条件文-2に移される。制御が無条件文-2に移されると、その無条件文-2の中に指定されている各文に関する規則に従って、プログラムの実行が続けられる。制御の明示移行を引き起こす手続き分岐文または条件文が実行されると、その文に関する手続きに従って制御が移される。これ以外の場合は、無条件文-2の実行が終了すると制御はCALL文の末尾に移される。
CALL文に指定されたプログラムがメモリーにロードされていないか、動的なロードに利用できないか、あるいは動的なロードに利用できるがメモリーに十分な空き領域がない場合には、その時点ではそのプログラムを実行可能にすることはできない。その場合、下記の2つのうちのどちらかの措置が取られる。
またはON EXCEPTION
指定がある場合には、無条件文-1に制御が移される。それから、無条件文-1に指定されている各文の規則に応じて、処理が続行される。制御を明示的に移す手続き分岐または条件文が実行されると、その文の規則に応じて制御が移される。それ以外の場合には、無条件文-1の実行が完了すると、CALL文の最後に制御が移され、
NOT ON EXCEPTION指定はあっても無視される。
実行単位中の開かれているファイルに関して、明示的なCLOSE文なしにプログラムの実行が停止され、ランタイム エラーが表示される。
実行単位内の2つ以上のプログラムに、同じプログラム名をもたせることができる。呼ぶプログラム内でこのようなプログラム名を参照したとき、どちらのプログラムを指すかは、プログラム名の範囲の適用規則に従う。COBOL言語の概念の章のプログラム名の規則節を参照。たとえば、CALL文の中に指定されたプログラム名と同じ名前のプログラムが、実行単位中に2つあるとする。
この例で、使用される仕組みは、下記のとおり。
呼ばれたプログラムがCOBOLプログラムでない場合、実行単位の中で最初に呼ばれたときにだけ初期状態に置かれる。このようなプログラムの取り消しは効果がない。
それ以外の場合に呼ばれたときは、呼び出し先のプログラムおよびその中に直接的または間接的に含まれる各プログラムの状態は、前回に呼ばれたときのままである。COBOL以外の言語の処理系の中には、意味合いが違っているものがある。可能な場合には、インターフェイスに関するCOBOLシステムのマニュアルに、その詳細が記載されている。
またはENTRY文
の中にUSING指定がある場合にのみ、CALL文にUSING指定が含められる。その場合、各USING指定内の作用対象の数は同じでなければならない。
作用対象の数が同じである必要はない。
またはCHAIN文
のUSING指定、および呼び出し先のプログラムの手続き部の見出し
または呼び出し先のプログラムがCOBOLでない場合はENTRY文またはパラメーター リスト
またはCHAIN文
USING指定の中の最初の作用対象が呼び出し先のプログラムのUSNIG指定またはパラメーター リストの最初の作用対象に対応し、それらの2番目同士が対応する、などとなる。
両方の作用対象の数が異なるために、完全には対応がとれないことがある。その場合、対応する相手がなくて残っている作用対象がCALL文またはCHAIN文の側にある場合、それらは無視される。残っている作用対象が手続き部の見出しまたはENTRY文またはパラメーター リストの側にある場合、それらは呼び出し先のプログラムの中で参照されてはならない。位置による対応は、呼び名によって暗黙的に示される呼び出し方式によって変わることがある。
指標名の場合は、そのような対応関係は確立されない。呼ぶプログラムと呼び出し先のプログラムの指標名は常に別々の指標を参照する。
明示的または
暗黙的に指定すると、実行用プログラムは、呼び出し先のプログラム中の対応するデータ項目が、呼ぶプログラム中のデータ項目と同じ記憶領域を占めるかのように動作する。 呼び出し先のプログラム中のデータ項目のデータ記述には、呼ぶプログラム中の対応するデータ項目と同じ文字数を指定する。
BY REFERENCE ADDRESS OF指定を明示的または暗黙的に指定すると、プログラムの動作は次のようになる。具体的には、USAGE POINTERを用いて追加のデータ項目が指定され、「SET データ項目 TO ADDRESS OF 一意名-3」文によって取得された値がBY REFERENCEによってそのデータ項目に渡されたかのように動作する。
一意名-3が連絡節にあってそのレベル番号か01または77以外であるか、または作業場所節にある場合、そのデータ項目がBY CONTENTによって渡され、一意名-3の番地を呼ばれるサブプログラムによっては変更できないことに等しい。
「BY REFERENCE 一意名-2」を明示的または暗黙的に指定すると、オブジェクト プログラムは定数-2を定数-3のために記述されたものとして処理する。
パラメーターに関してBY CONTENT指定を明示的または暗黙的に指定すると、オブジェクト プログラムの動作は次のようになる。具体的には、追加のデータ項目が宣言され、そのデータ項目がBY REFERENCE指定の中でパラメーターとして使用されるかのように動作する。一意名-4を指定すると、追加データ項目の暗黙的なデータ記述とその内容の両方が、一意名-4のものと同じとなる。一意名-3を指定すると、追加データ項目の暗黙的なデータ記述は、サイズと内容が一意名-3と同じ英数字データ項目に等しくなる。「LENGTH OF 一意名-5」を指定すると、追加データ項目のデータ記述は、形式がPIC S9 (n) USAGE COMPとなる。ここで、nの値は9以上である。このデータ記述により、使用しているCOBOLシステムで処理可能なデータ項目の最大
サイズが定義される。追加データ項目の内容は、一意名-5に割り当てられた記憶領域のバイト数に設定される。
一意名-6が指定され、BINARY、COMP-4、COMP-5、およびCOMP-Xのいずれかである場合は、追加データ項目のデータ記述とその内容の両方が、一意名-6のものと同じとなる。整数-1を指定すると、追加データ項目のデータ記述は、一意名-6のデータ記述と同じとなる。ただし、その用途はCOMP-5となる。追加データ項目の内容は、COMP-5である一意名-6の内容と同じとなる。この変換と形式により、非COBOLプログラムの呼び出しが容易となる。
上記以外で、一意名-6が指定された場合は、暗黙的に指定された追加データ項目のデータ記述とその内容が、一意名-6のものと同じとなる。
整数-1を指定すると、追加データ項目のデータ記述は符号付き数字項目 USAGE COMP-5と同じとなる。この数字項目は、整数-2が指定された場合は、その値により示されるバイト数で記憶される。それ以外の場合は、システム領域のサイズ(典型的な例は、システム上のPOINTERのサイズ)で記憶される。
LENGTH OF 一意名-7を指定した場合は、追加データ項目のデータ記述はPIC S9(n) USAGE COMP-5と同じとなる。ここで、n の値は 9 以上で、COBOLシステムのデータ項目の最大長を保持できるサイズのデータ項目を定義する。追加データ項目の内容は、一意名-7に割り当てられた記憶用バイト数に設定される。
呼び出し先のプログラムがCOBOLプログラムの場合、CALL文のBY VALUE指定中の各パラメーターに対応するパラメーターを、手続き部見出しのUSING指定で宣言しなければならない。この対応するパラメーターにも、BY VALUE指定が明示的または暗黙的に指定されているものとする。
上記の、CALL文の結果として生成された追加データ項目は、この対応するパラメーターとは以下のようま関係を持つ。
追加データ項目が、BINARY、COMP-4、COMP-5、またはCOMP-XからCOMP-5への変換の対象であった場合、呼ぶプログラム中にある対応するパラメーターのデータ記述は、追加データ項目のデータ記述と同じでなければならない。ただし、対応するパラメーターの用途は、BINARY、COMP-4、COMP-5、およびCOMP-Xのどれでもよい。呼ぶCOBOLプログラムへの記述の際に、追加データ項目の用途 COMP-5から、呼ぶプログラム中の対応するパラメーターの用途への変換が実行される。
追加データ項目がCOMP-5への変換の対象でなかった場合、呼び出し先のプログラム中の各パラメーターのデータ記述は、対応する追加データ項目のデータ記述と同じでなければならない。これは、追加データ項目に対し、呼び出し先のプログラム中の対応するパラメーターと一致させるための変換、拡張、および切り捨てのいずれも行われないことを意味する。
呼び出し先のプログラムがCOBOLプログラムでない場合、追加データ項目のサイズはシステム領域の最大サイズ(典型的な例は、システム上のPOINTERのサイズ)を超えないものとする。そうでない場合は、システムが壊滅的に破壊される可能性がある。
システム領域のサイズ(通常はシステム上のPOINTERのサイズ)は、COBOLシステムの外で決定され、戻り値が取りうる最大値の制約要因となる。ただし、戻り値がシステム領域の最大サイズに満たないことがある。制御が戻された後で、呼んだプログラムで戻り値を利用できるようになる。それは、暗黙的に特殊なレジスタであるRETURN-CODEに収められていることもあれば、GIVING指定に指定したデータ項目に明示的に収められていることもある。
呼ぶプログラムが再帰属性を持っていない限り、
呼ばれたプログラム呼ばれたプログラムは、呼んだプログラムを直接的または間接的に呼ぶCALL文を実行しない。
またはUSAGE PROCEDURE-POINTER
が明示的または暗黙的に指定されており、呼び出し先のプログラム中のデータ項目、
または手続き
の番地から当初に導出された値は、その呼ばれたプログラムに対してCANCEL文が実行された後では無効になるので、使用してはならない。
およびBY VALUE指定
は、別のBY CONTENT指定、BY REFERENCE指定、
またはBY VALUE指定
が出現するまで、その後に続くパラメーターすべてについて有効である。
最初のパラメーターの前にBY CONTENT、BY REFERENCE、
およびBY VALUE
のどの指定もない場合、BY REFERENCE指定が使用されているものとする。