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