CALL ステートメント
CALL ステートメントは、実行単位内のプログラム間で制御を移動します。
CALL ステートメントが入ったプログラムは呼び出し側プログラムであり、 CALL ステートメント内で識別されるプログラムは、呼び出されるサブプログラムです。 呼び出し先プログラムには CALL ステートメントを含めることができます。ただし、直接または間接に自分自身を呼び出す CALL ステートメントを実行できるのは、RECURSIVE 節を指定して定義されたプログラムだけです。
- identifier-1, literal-1
- リテラル-1 は英数字リテラルでなければなりません。 ID-1 は、その値をプログラム名にできる USAGE DISPLAY を指定して記述された英数字、英字、または数字データ項目でなければなりません。
プログラム名の形成の規則は、PGMNAME コンパイラー・オプションによって異なります。 詳細は、'プログラムID段落のプログラム名の議論と、' PGMNAME を'エンタープライズCOBOLプログラミングガイド.説明を参照のこと。
の値が' literal-1 の値が ' Java.java-class-name-1.java-static-method-name-1 'である場合、その呼び出しはクラス名 ' java-class-name-1 ' でメソッド名 ' java-static-method-name-1. 詳細については、 COBOLからの静的Javaメソッドの呼び出しを参照のこと。
使用上の注意: CALL ステートメントには、クラスまたはメソッドの名前を指定しないでください。
- procedure-pointer-1
- USAGE IS PROCEDURE-POINTER で定義し、有効なプログラムの入り口点に設定する必要があります。
そのようにしないと、CALL ステートメントの結果は未定義となります。
プログラムが COBOL によって取り消されたか、 PL/I または C で解放されたか、またはアセンブラーによって削除された後は、 そのプログラムの入り口点に設定されていたプロシージャー・ポインターは、無効になります。
- function-pointer-1
- USAGE IS FUNCTION-POINTER で定義し、有効な関数またはプログラムの入り口点に設定する必要があります。
そのようにしないと、CALL ステートメントの結果は未定義となります。
プログラムが COBOL でキャンセルされるか、PL/I または C で解放されるか、またはアセンブラーで削除されると、 その関数またはプログラムの入り口点に設定されていた関数ポインターは、すべて無効になります。
呼び出されるサブプログラムに入るときに、PROCEDURE DIVISION の最初から入る場合は、リテラル-1 または ID-1 の内容には、呼び出されるサブプログラムのプログラム名を指定しなければなりません。
呼び出されるサブプログラムに入る際に、ENTRY ステートメントから入るときには、リテラル-1 またはID-1 の内容は、呼び出されるサブプログラムの ENTRY ステートメント中に指定された名前と同じにしなければなりません。
AMODE 64 に関する考慮事項
AMODE 64 COBOLプログラムでは、静的呼び出しと動的呼び出しの両方が、他のAMODE 64言語環境®適合プログラムの呼び出しをサポートする。
AMODE 64 COBOL プログラムは、Language Environment に準拠していないプログラムによって呼び出すことはできません。 ファイル名を使用した CALL は、LP(64) ではサポートされません。 LOAD を使用した後で LP(64) COBOL サブプログラムのエントリー・ポイントへのブランチを使用するアセンブラー・プログラムは動作しません。 代わりに、LE マクロ CEEFETCH を使用して AMODE 64 COBOL プログラムをフェッチし、呼び出します。
パラメーターを渡すときの規則は XPLINK です。
AS FIXED LENGTH 句は、LP(64) でコンパイルされたプログラムでは現在サポートされていません。
AMODE 31とAMODE 64のサポートが混在する環境でのダイナミック・コールの使用については、 『Enterprise COBOL Programming Guide 』の「 AMODE 31プログラムとAMODE 64プログラム間のダイナミック・コール 」を参照してください。
USING 句
USING 句は、ターゲット・プログラムに渡される引数を指定します。
USING 句を CALL ステートメントに入れるのは、PROCEDURE DIVISION のヘッダー、または呼び出されるプログラムが実行される ENTRY ステートメント内に USING 句がある場合だけにしてください。 ただし、PROCEDURE DIVISION USING文でOPTIONALが使用されているか、CALL USING文でOMITTEDが使用されている場合を除く。
USINGフレーズの詳細については、 PROCEDURE DIVISIONヘッダーを参照のこと。
CALL ステートメントの USING 句でオペランドを指定する順序、および 呼び出されるサブプログラムの PROCEDURE DIVISION のヘッダーまたは 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 句
パラメーターに対して BY REFERENCE 句が明示的または暗黙的に指定された場合、 呼び出し側プログラム内の対応するデータ項目は、呼び出されるプログラムのデータ項目と同じストレージ域を占めます。
- identifier-2
- DATA DIVISION 内の任意のレベルのデータ項目にできます。 ID-2 を関数 ID にすることはできません。注: identifier-22は、AS FIXED LENGTH句が指定されている場合のみ、動的長さのエレメンタリー項目とすることができる。
LINKAGE SECTION または FILE SECTION で定義する場合は、 CALL ステートメントを呼び出す前に、ID-2 をアドレス可能にしておく必要があります。 これを行うには、
SET ADDRESS OF identifier-2 TO pointerまたはPROCEDURE/ENTRY USINGのいずれかをコーディングします。 - file-name-1
- QSAMファイルのファイル名。 CALL文でのfile-nameの使い方については、'エンタープライズCOBOLプログラミングガイドの' データの受け渡し を参照のこと。 この句は AMODE 64 (LP (64)) ではサポートされません。
- ADDRESS of identifier-2
- ID-2 は、LINKAGE SECTION の中に定義されたレベル 01 またはレベル 77 の項目である必要があります。
- OMITTED
- 引数がなにも渡されないことを示します。注: OMITTEDという最後のパラメータが余分にあると仮定される。 呼び出されたプログラムのOMITTEDクラステストを使ってテストすることができる。 これにより、共有サブプログラムにパラメーターを追加することができる。
AS FIXED LENGTH 句
AS FIXED LENGTH 句が指定されている場合、対応するデータ項目は動的長基本項目でなければなりません。
- integer-4
- 整数-4の値は、クラス英数字やクラス国別の項目の文字数、またはクラス UTF-8 の項目のバイト数を表します。整数-4は、 0 より大きい整数でなければならず、動的長基本項目の LIMIT 句で暗黙または指定された値より小さい値でなければなりません。
項目がクラス英数字、国別、または UTF-8 である場合、埋め込み文字は、それぞれ EBCDIC ブランク、 UTF-16 ブランク、または UTF-8 ブランクです。
AS FIXED LENGTH 句が指定されている場合、動的長基本項目のアドレスは、長さが integer-4 の英数字、国別、または UTF-8 の同等の固定長クラス・データ項目の場合と同様に、呼び出し先に渡されます。 integer-4 が動的長基本項目の現行長より大きい場合、その項目は拡張されて、いずれかの integer-4 文字数まで右側にブランクが埋め込まれます。 CALL ステートメントの実行後、動的長基本項目の現行長は、CALL ステートメントの実行前と同じ長さのままになります。
動的長基本項目パラメーターに対して BY CONTENT 句を指定または暗黙指定するときには、AS FIXED LENGTH 句を指定する必要があります。
BY CONTENT 句
パラメーターに対して BY CONTENT 句が明示的または暗黙的に指定された場合、 CALL ステートメントの USING 句で参照されたとき、 呼び出されるプログラムはこのパラメーターの値を変更することはできません。しかし、 呼び出されるプログラムは、その PROCEDURE DIVISION のヘッダーにある対応するデータ名によって 参照されるデータ項目の値を変更することは可能です。 呼び出されるプログラム内のパラメーターを変更しても、 呼び出し側プログラム内の対応する引数には影響ありません。
- identifier-3
- DATA DIVISION 内の任意のレベルのデータ項目にできます。 ID-3 を関数 ID または無制限グループにすることはできません。
LINKAGE SECTION または FILE SECTION で定義されている場合は、 すでに CALL ステートメントを呼び出す前に、ID-3 をアドレス可能にしておく必要があります。 それには、 以下の句のいずれかをコーディングします。
SET ADDRESS OF identifier-3 TO pointerPROCEDURE DIVISION USINGENTRY USING
- literal-2
- 以下のようになります。
- 英数字リテラル
- 形象定数 (ALL リテラル または NULL/NULLS を除く)
- DBCS リテラル
- 国別リテラル
- LENGTH OF 特殊レジスター
- LENGTH OF 特殊レジスタについては、 LENGTH OF を参照のこと。
- ADDRESS OFID-3
- ID-3 は、LINKAGE SECTION、WORKING-STORAGE SECTION、または LOCAL-STORAGE SECTION で定義された 66 または 88 を除いたレベルのデータ項目である必要があります。
- OMITTED
- 引数がなにも渡されないことを示します。
英数字リテラルの場合、呼び出されるサブプログラムはパラメーターを PIC X(n)
USAGE DISPLAYとして記述する必要があります。ここで、 n はリテラル内の文字数です。
DBCS リテラルの場合、呼び出されるサブプログラムは、パラメーターを PIC G(n)
USAGE DISPLAY-1として記述するか、 PIC N(n) 暗黙的または明示的な USAGE を指定して DISPLAY-1 記述する必要があります。ここで、 n はリテラルの長さです。
国別リテラルの場合、呼び出されるサブプログラムは、暗黙的または明示的な USAGE NATIONAL を使用して、パラメーターを PIC N(n) として記述する必要があります。ここで、 n はリテラルの長さです。
BY VALUE 句
BY VALUE 句は、別の BY REFERENCE または BY CONTENT 句によってオーバーライドされるまで、後続のすべての引数に適用されます。
ある引数に BY VALUE 句が指定されているか、 または暗黙指定されている場合は、送り出しデータ項目への参照ではなく、 その引数の値が渡されます。 呼び出されるプログラムは BY VALUE 引数に対応する仮パラメーターを修正できますが、 呼び出されるプログラムは送り出しデータ項目の一時コピーにアクセス権を持っているため、 そのような変更は、この引数には適用されません。
BY VALUE 引数は主として非 COBOL プログラム (C など) との通信向けですが、COBOL 相互間の呼び出しにも使用できます。 その場合は、CALL USING 句および、PROCEDURE DIVISION USING 句内の対応する仮パラメーター内の両方の引数に、BY VALUE を指定または暗黙指定しなければなりません。
- identifier-4
- DATA DIVISION 内の基本データ項目にしなければなりません。 これは、以下の項目のいずれかでなければなりません。
- バイナリー (USAGE BINARY、COMP、COMP-4、または COMP-5)
- 浮動小数点 (USAGE COMP-1 または COMP-2)
- 関数ポインター (USAGE FUNCTION-POINTER)
- ポインター (USAGE POINTER)
- プロシージャー・ポインター (USAGE PROCEDURE-POINTER)
- オブジェクト・リファレンス (USAGE OBJECT REFERENCE)
- 1 つの 1 バイトの英数字文字 (PIC X や PIC A など)
- 1 つの国別文字 (PIC N)、国別カテゴリーの基本データ項目として記述されます。
以下の項目も、BY VALUE によって渡されます。
- USAGE DISPLAY の参照変更項目および長さ 1
- USAGE NATIONAL の参照変更項目および長さ 1
- SHIFT-IN および SHIFT-OUT 特殊レジスター
- LINAGE-COUNTER 特殊レジスター (USAGE BINARY の場合)
- ADDRESS OF ID-4
- ID-4 は、LINKAGE SECTION、WORKING-STORAGE SECTION、または LOCAL-STORAGE SECTION で定義された 66 または 88 を除いたレベルのデータ項目である必要があります。
- LENGTH OF 特殊レジスター
- BY VALUE によって渡される LENGTH OF 特殊レジスターは、PIC 9 (9) バイナリーとして扱われます。 LENGTH OF 特殊レジスタについては、 LENGTH OF を参照のこと。
- literal-3
- 以下のいずれかのタイプでなければなりません。
- 数字リテラル
- 形象定数 ZERO
- 1 文字の英数字リテラル
- 1 文字の国別リテラル
- シンボリック文字
- 1 バイトの形象定数
- SPACE
- QUOTE
- HIGH-VALUE
- LOW-VALUE
ZERO は数値として扱われます。 フルワード・バイナリーの 0 が渡されます。
ID-3 は、固定点数字リテラルである場合、9 以下の桁の精度でなければなりません。 その場合は、フルワードのバイナリー表記のリテラル値が渡されます。
リテラル-3 が浮動小数点数字リテラルである場合は、 8 バイトの内部浮動小数点 (COMP-2) 表記の値が渡されます。
リテラル-3 は DBCS リテラルであってはいけません。
RETURNING 句
- identifier-5
- DATA DIVISION に定義された任意のデータ項目を指定できる RETURNING データ項目です。 呼び出されるプログラムの戻り値は暗黙的に ID-5 に保管されます。
COBOL、C、または C のリンケージ規約を使用するその他のプログラミング言語で作成した関数への呼び出しとして、 RETURNING 句を指定することができます。 COBOL サブプログラムへの CALL に RETURNING 句を指定する場合は、次のようになります。
- 呼び出されるサブプログラムでは、その PROCEDURE DIVISION のヘッダーに RETURNING 句を指定していなければなりません。
- ID-5 およびそのターゲット・プログラム内での対応する PROCEDURE
DIVISION RETURNING ID には、
同じ PICTURE、 USAGE、 SIGN、 SYNCHRONIZE、 JUSTIFIED、
および BLANK WHEN ZERO 句が指定されていなければなりません (ただし、
DECIMAL POINT IS COMMA 節により、PICTURE 節の通貨記号は違う指定が可能であり、
またピリオドとコンマは交換可能という点は除きます)。
ターゲットが戻されるときは、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 ステートメントを実行しても設定されません。
ON EXCEPTION 句
- CALL文のターゲットが'Java.java-class-name.java-static-method-name 'という形式のリテラルで、JNI関数 ExceptionOccurred によって判断される呼び出しのいずれかの部分でJava例外が発生した場合。
- 呼び出されたサブプログラムが利用できない場合。
- ON EXCEPTION 句が指定されている場合は、制御は 命令ステートメント-1 に移ります。 で指定された各ステートメントのルールに従って実行が続けられる。 imperative-statement-1. 明示的な制御の移動を起こすプロシージャーのブランチ・ステートメントや条件ステートメントが 実行された場合は、制御はそのステートメントの規則に従って移されます。 それ以外の場合は、命令ステートメント-1 の実行が完了すると、 制御は CALL ステートメントの終わりに移され、NOT ON EXCEPTION 句が指定されている場合はそれが無視されます。
- ON EXCEPTION 句が CALL ステートメント内に指定されていないと、NOT ON EXCEPTION 句が指定されている場合はそれが無視されます。
NOT ON EXCEPTION 句
例外条件が発生しなければ、制御はコールされたプログラムに移される。 呼び出されるプログラムから制御が戻ると、次のものに制御が移されます。
- 命令ステートメント-2。ただし、NOT ON EXCEPTION 句が指定されている場合。
- その他の場合は、CALL ステートメントの終わり (ただし ON EXCEPTION 句が指定されていれば、それは無視されます)。
制御が命令ステートメント-2 に移された場合、命令ステートメント-2 に指定された各ステートメントの規則に従って、実行が継続されます。 明示的な制御の移動を起こすプロシージャーのブランチ・ステートメントや条件ステートメントが 実行された場合は、制御はそのステートメントの規則に従って移されます。 それ以外の場合は、命令ステートメント-2 の実行が完了すると、 制御は CALL ステートメントの終わりに移されます。
ON OVERFLOW 句
ON OVERFLOW 句を使うと、ON EXCEPTION 句と同じ結果が得られます。
END-CALL 句
この明示的範囲終了符号は、CALL ステートメントの有効範囲を区切るために使用されます。 END-CALL を使用すると、 条件付き CALL ステートメントを別の条件付きステートメントにネストすることができます。 END-CALL は命令 CALL ステートメントでも使用できます。
詳しくは、 スコープの区切りステートメントを参照のこと。
非 OO COBOL/Java 相互運用性のための COBOL と Java データ型のマッピング
Java と相互運用する非 OO COBOL アプリケーションのコンパイル、リンク、および実行 ( Enterprise COBOL プログラミング ガイド )
cjbuild ユーティリティを実行して Java スタブ プログラムの DLL を構築する ( Enterprise COBOL プログラミング ガイド )
JAVAIOP ( エンタープライズ COBOL プログラミング ガイド )
PARMCHECK ( エンタープライズ COBOL プログラミング ガイド )
