CALL ステートメントは、 あるオブジェクト・プログラムからその実行単位内の別のオブジェクト・プログラムに制御を移します。
CALL ステートメントが入ったプログラムは呼び出し側プログラムであり、 CALL ステートメント内で識別されるプログラムは、呼び出されるサブプログラムです。 呼び出されるプログラムに CALL ステートメントを入れることはできますが、直接的または間接的にそれ自体 を呼び出す CALL ステートメントを実行できるのは、RECURSIVE 節で定義されたプログラムだけです。
フォーマット >>-CALL--+-ID-1-------------------------+-----------------------> +-リテラル-1-------------------+ +-プロシージャー・ポインター-1--+ '-関数ポインター-1-------------' >--+--------------------------------------------------------------------+--> | .---------------------------------------------------------. | | | .--------------------------. | | | V V | | | '-USING----+-+-------------------+----+-+------------+--ID-2-+-+-+-+-' | '-+----+--REFERENCE-' | '-ADDRESS OF-' | | | '-BY-' +-ファイル名-1----------+ | | '-OMITTED--------------' | | .--------------------------. | | V | | +-+----+--CONTENT----+-+------------+--ID-3-+-+-------+ | '-BY-' | +-ADDRESS OF-+ | | | | '-LENGTH OF--' | | | +-リテラル-2------------+ | | '-OMITTED--------------' | | .--------------------------. | | V | | '-+----+--VALUE----+-+------------+--ID-4-+-+---------' '-BY-' | +-ADDRESS OF-+ | | '-LENGTH OF--' | '-リテラル-3------------' >--+-----------------+--| 例外句 |--+----------+--------------->< '-RETURNING--ID-5-' '-END-CALL-' 例外句 |--+-----------------------------------------------------------+--| +-+-----------------------------------------+--| 非例外句 |-+ | '-+----+--EXCEPTION--命令ステートメント-1---' | | '-ON-' | '-+----+--OVERFLOW--命令ステートメント-3-------------------' '-ON-' 非例外句 |--+----------------------------------------------+-------------| '-NOT--+----+--EXCEPTION--命令ステートメント-2---' '-ON-'
プログラム名の形成の規則は、PGMNAME コンパイラー・オプションによって異なります。詳細については、 PROGRAM-ID 段落のプログラム名の説明を参照してください。また、「Enterprise COBOL プログラミング・ガイド」の PGMNAME コンパイラー・オプションの説明も参照してください。
ID-1 をウィンドウ表示日付フィールドにすることはできません。
使用上の注意: CALL ステートメントには、クラスまたはメソッドの名前を指定しないでください。
プログラムが COBOL によって取り消されたか、 PL/I または C で解放されたか、またはアセンブラーによって削除された後は、 そのプログラムの入り口点に設定されていたプロシージャー・ポインターは、無効になります。
プログラムが COBOL でキャンセルされるか、PL/I または C で解放されるか、またはアセンブラーで削除されると、 その関数またはプログラムの入り口点に設定されていた関数ポインターは、すべて無効になります。
呼び出されるサブプログラムに入るときに、手続き部の最初から入る場合は、リテラル-1 または ID-1 の内容には、呼び出されるサブプログラムのプログラム名を指定しなければなりません。
呼び出されるサブプログラムに入る際に、ENTRY ステートメントから入るときには、リテラル-1 またはID-1 の内容は、呼び出されるサブプログラムの ENTRY ステートメント中に指定された名前と同じにしなければなりません。
コンパイラーが、複数プログラム内で検出されるプログラム名への呼び出しをどのように解決するかについては、プログラム名の命名規則を参照してください。
USING 句は、ターゲット・プログラムに渡される引数を指定します。
USING 句を CALL ステートメントに入れるのは、手続き部のヘッダー、または呼び出されるプログラムが実行される ENTRY ステートメント内に USING 句がある場合だけにしてください。各 USING 句内のオペランドの数は同じでなければなりません。
USING 句の詳細については、手続き部のヘッダーを参照してください。
CALL ステートメントの USING 句でオペランドを指定する順序、および 呼び出されるサブプログラムの手続き部のヘッダーまたは ENTRY ステートメント内での対応する USING 句でオペランドを 指定する順序によって、呼び出し側プログラムと呼び出されるプログラムで使用されるオペランドの間の対応関係が決まります。この対応は、位置によるものです。
CALL ステートメントの USING 句で参照されるパラメーターの値は、 その CALL ステートメントが実行された時点で、 呼び出されるサブプログラムに対して使用可能になります。 呼び出されるプログラム中のデータ項目の記述は、 呼び出し側プログラム中の対応するデータ項目の記述と同じ文字位置の数で記述しなければなりません。
BY CONTENT 句、BY REFERENCE 句、および BY VALUE 句は、別の BY CONTENT 句、BY REFERENCE 句、または BY VALUE 句が現れるまで、それぞれの後に続くパラメーターに適用されます。また、BY CONTENT 句、BY REFERENCE 句、または BY VALUE 句を最初のパラメーターより前に指定しないと、BY REFERENCE 句が想定されます。
パラメーターに対して BY REFERENCE 句が明示的または暗黙的に指定された場合、 呼び出し側プログラム内の対応するデータ項目は、呼び出されるプログラムのデータ項目と同じストレージ域を占めます。
リンケージ・セクションまたはファイル・セクションで定義する場合は、 CALL ステートメントを呼び出す前に、ID-2 をアドレス可能にしておく必要があります。 これを行うには、SET ADDRESS OF ID-2 TO pointer または PROCEDURE/ENTRY USING のいずれかをコーディングします。
パラメーターに対して BY CONTENT 句が明示的または暗黙的に指定された場合、 CALL ステートメントの USING 句で参照されたとき、 呼び出されるプログラムはこのパラメーターの値を変更することはできません。しかし、 呼び出されるプログラムは、その手続き部のヘッダーにある対応するデータ名によって 参照されるデータ項目の値を変更することは可能です。呼び出されるプログラム内のパラメーターを変更しても、 呼び出し側プログラム内の対応する引数には影響ありません。
リンケージ・セクションまたはファイル・セクションで定義されている場合は、 すでに CALL ステートメントを呼び出す前に、ID-3 をアドレス可能にしておく必要があります。これを行うには、 以下のいずれかをコーディングします。
英数字リテラルの場合、呼び出されるサブプログラムでは、 パラメーターを PIC X(n) USAGE DISPLAY と記述するようにします。この場合、n は、リテラル内の文字の数です。
DBCS リテラルの場合、呼び出されるサブプログラムでは、USAGE DISPLAY-1 を暗黙的または明示的に指定して、パラメーターを PIC G(n) USAGE DISPLAY-1、または PIC N(n) と記述するようにします。この場合、n はリテラルの長さです。
国別リテラルの場合、呼び出されるサブプログラムでは、USAGE NATIONAL を暗黙的または明示的に指定して、 パラメーターを PIC N(n) と記述するようにします。 この場合、n はリテラルの長さです。
BY VALUE 句は、別の BY REFERENCE または BY CONTENT 句によってオーバーライドされるまで、後続のすべての引数に適用されます。
ある引数に BY VALUE 句が指定されているか、 または暗黙指定されている場合は、送り出しデータ項目への参照ではなく、 その引数の値が渡されます。 呼び出されるプログラムは BY VALUE 引数に対応する仮パラメーターを修正できますが、 呼び出されるプログラムは送り出しデータ項目の一時コピーにアクセス権を持っているため、 そのような変更は、この引数には適用されません。
BY VALUE 引数は主として非 COBOL プログラム (C など) との通信向けですが、COBOL 相互間の呼び出しにも使用できます。その場合は、CALL USING 句および、手続き部 USING 句内の対応する仮パラメーター内の両方の引数に、BY VALUE を指定または暗黙指定しなければなりません。
以下のものも、BY VALUE によって渡されます。
ZERO は数値として扱われます。フルワード・バイナリーの 0 が渡されます。
ID-3 は、固定点数字リテラルである場合、9 以下の桁の精度でなければなりません。その場合は、フルワードのバイナリー表記のリテラル値が渡されます。
リテラル-3 が浮動小数点数字リテラルである場合は、 8 バイトの内部浮動小数点 (COMP-2) 表記の値が渡されます。
リテラル-3 は DBCS リテラルであってはいけません。
COBOL、C、または C のリンケージ規則を使用するその他のプログラミング言語で作成した関数への呼び出しとして、 RETURNING 句を指定することができます。 COBOL サブプログラムへの CALL に RETURNING 句を指定する場合は、次のようになります。
ターゲットが戻されるときは、ID-6 が INDEX、POINTER、FUNCTION-POINTER、PROCEDURE-POINTER、または OBJECT REFERENCE の場合、SET ステートメントの規則を使用して、その戻り値が ID-5 に割り当てられま す。 ID-5 がその他の USAGE の場合、MOVE ステートメントの規則が使用されます。
CALL... RETURNING データ項目は、出力専用パラメーターです。 呼び出されるプログラムに入った時点で、PROCEDURE DIVISION RETURNING データ項目の初期状態の値は未定義であり予測不可能です。 呼び出されるプログラムの PROCEDURE DIVISION RETURNING データ項目を初期化してから、 値を参照するようにしてください。 呼び出されるプログラムから戻る時点で呼び出し側プログラムに戻される値は、 PROCEDURE DIVISION RETURNING の最終的な値です。
例外またはオーバーフローが起きても、ID-5 は変更されません。ID-5 は、参照変更にすることはできません。
RETURN-CODE 特殊レジスターは、 RETURNING 句が入った CALL ステートメントを実行しても設定されません。
例外条件は、呼び出されたサブプログラムを使用可能にできないときに起こります。そのときは、次の 2 つの処置のどちらかが行われます。
例外条件が起こらなければ (呼び出されたサブプログラムが使用可能であれば)、 制御は呼び出されたプログラムに移されます。呼び出されるプログラムから制御が戻ると、次のものに制御が移されます。
制御が命令ステートメント-2 に移された場合、命令ステートメント-2 に指定された各ステートメントの規則に従って、実行が継続されます。 明示的な制御の移動を起こすプロシージャーのブランチ・ステートメントや条件ステートメントが 実行された場合は、制御はそのステートメントの規則に従って移されます。 それ以外の場合は、命令ステートメント-2 の実行が完了すると、 制御は CALL ステートメントの終わりに移されます。
この明示的範囲終了符号は、CALL ステートメントの範囲を区切るために使用されます。END-CALL を使用すると、 条件付き CALL ステートメントを別の条件付きステートメントにネストすることができます。 END-CALL は、命令 CALL ステートメントとも使用できます。
詳しくは、範囲区切りステートメントを参照してください。