Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


CALL ステートメント

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-'                                      

ID-1リテラル-1
リテラル-1 は英数字リテラルでなければなりません。ID-1 は、その値をプログラム名にできる USAGE DISPLAY を指定して記述された英数字、英字、または数字データ項目でなければなりません。

プログラム名の形成の規則は、PGMNAME コンパイラー・オプションによって異なります。詳細については、 PROGRAM-ID 段落のプログラム名の説明を参照してください。また、Enterprise COBOL プログラミング・ガイド」の PGMNAME コンパイラー・オプションの説明も参照してください。

ID-1 をウィンドウ表示日付フィールドにすることはできません。

使用上の注意: CALL ステートメントには、クラスまたはメソッドの名前を指定しないでください。

プロシージャー・ポインター-1
USAGE IS PROCEDURE-POINTER で定義し、有効なプログラムの入り口点に設定する必要があります。 そのようにしないと、CALL ステートメントの結果は未定義となります。

プログラムが COBOL によって取り消されたか、 PL/I または C で解放されたか、またはアセンブラーによって削除された後は、 そのプログラムの入り口点に設定されていたプロシージャー・ポインターは、無効になります。

関数ポインター-1
USAGE IS FUNCTION-POINTER で定義し、有効な関数またはプログラムの入り口点に設定する必要があります。 そのようにしないと、CALL ステートメントの結果は未定義となります。

プログラムが COBOL でキャンセルされるか、PL/I または C で解放されるか、またはアセンブラーで削除されると、 その関数またはプログラムの入り口点に設定されていた関数ポインターは、すべて無効になります。

呼び出されるサブプログラムに入るときに、手続き部の最初から入る場合は、リテラル-1 または ID-1 の内容には、呼び出されるサブプログラムのプログラム名を指定しなければなりません。

呼び出されるサブプログラムに入る際に、ENTRY ステートメントから入るときには、リテラル-1 またはID-1 の内容は、呼び出されるサブプログラムの ENTRY ステートメント中に指定された名前と同じにしなければなりません。

コンパイラーが、複数プログラム内で検出されるプログラム名への呼び出しをどのように解決するかについては、プログラム名の命名規則を参照してください。

USING 句

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 句

パラメーターに対して BY REFERENCE 句が明示的または暗黙的に指定された場合、 呼び出し側プログラム内の対応するデータ項目は、呼び出されるプログラムのデータ項目と同じストレージ域を占めます。

ID-2
データ部内の任意のレベルのデータ項目にできます。ID-2 を関数 ID にすることはできません。

リンケージ・セクションまたはファイル・セクションで定義する場合は、 CALL ステートメントを呼び出す前に、ID-2 をアドレス可能にしておく必要があります。 これを行うには、SET ADDRESS OF ID-2 TO pointer または PROCEDURE/ENTRY USING のいずれかをコーディングします。

ファイル名-1
QSAM ファイルのファイル名。CALL ステートメントでファイル名を使用する方法 については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
ADDRESS OFID-2
ID-2 は、リンケージ・セクションの中に定義されたレベル 01 またはレベル 77 の項目である必要があります。
OMITTED
引数がなにも渡されないことを示します。

BY CONTENT 句

パラメーターに対して BY CONTENT 句が明示的または暗黙的に指定された場合、 CALL ステートメントの USING 句で参照されたとき、 呼び出されるプログラムはこのパラメーターの値を変更することはできません。しかし、 呼び出されるプログラムは、その手続き部のヘッダーにある対応するデータ名によって 参照されるデータ項目の値を変更することは可能です。呼び出されるプログラム内のパラメーターを変更しても、 呼び出し側プログラム内の対応する引数には影響ありません。

ID-3
データ部内の任意のレベルのデータ項目にできます。ID-3 は関数 ID にはできません。

リンケージ・セクションまたはファイル・セクションで定義されている場合は、 すでに CALL ステートメントを呼び出す前に、ID-3 をアドレス可能にしておく必要があります。これを行うには、 以下のいずれかをコーディングします。

  • SET ADDRESS OF identifier-3 TO pointer
  • PROCEDURE DIVISION USING
  • ENTRY . . . USING
リテラル-2
以下のようになります。
  • 英数字リテラル
  • 形象定数 (ALL リテラル または NULL/NULLS を除く)
  • DBCS リテラル
  • 国別リテラル
LENGTH OF 特殊レジスター
LENGTH OF 特殊レジスターの詳細については、LENGTH OFを参照してください。
ADDRESS OFID-3
ID-3 は、リンケージ・セクション、作業用ストレージ・セクション、またはローカル・ストレージ・セクションで定義された 66 または 88 を除いたレベルのデータ項目である必要があります。
OMITTED
引数がなにも渡されないことを示します。

英数字リテラルの場合、呼び出されるサブプログラムでは、 パラメーターを 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 VALUE 句は、別の BY REFERENCE または BY CONTENT 句によってオーバーライドされるまで、後続のすべての引数に適用されます。

ある引数に BY VALUE 句が指定されているか、 または暗黙指定されている場合は、送り出しデータ項目への参照ではなく、 その引数の値が渡されます。 呼び出されるプログラムは BY VALUE 引数に対応する仮パラメーターを修正できますが、 呼び出されるプログラムは送り出しデータ項目の一時コピーにアクセス権を持っているため、 そのような変更は、この引数には適用されません。

BY VALUE 引数は主として非 COBOL プログラム (C など) との通信向けですが、COBOL 相互間の呼び出しにも使用できます。その場合は、CALL USING 句および、手続き部 USING 句内の対応する仮パラメーター内の両方の引数に、BY VALUE を指定または暗黙指定しなければなりません。

ID-4
データ部内の基本データ項目にしなければなりません。これは、次のいずれかでなければなりません。
  • バイナリー (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 特殊レジスター (バイナリー使用の場合)
ADDRESS OF ID-4
ID-4 は、リンケージ・セクション、作業用ストレージ・セクション、またはローカル・ストレージ・セクションで定義された 66 または 88 を除いたレベルのデータ項目である必要があります。
LENGTH OF 特殊レジスター
BY VALUE によって渡される LENGTH OF 特殊レジスターは、 PIC 9(9) バイナリーとして扱われます。 LENGTH OF 特殊レジスターの詳細については、LENGTH OFを参照してください。
リテラル-3
以下のいずれかにする必要があります。
  • 数字リテラル
  • 形象定数 ZERO
  • 1 文字の英数字リテラル
  • 1 文字の国別リテラル
  • シンボリック文字
  • 1 バイトの形象定数
    • SPACE
    • QUOTE
    • HIGH-VALUE
    • LOW-VALUE

ZERO は数値として扱われます。フルワード・バイナリーの 0 が渡されます。

ID-3 は、固定点数字リテラルである場合、9 以下の桁の精度でなければなりません。その場合は、フルワードのバイナリー表記のリテラル値が渡されます。

リテラル-3 が浮動小数点数字リテラルである場合は、 8 バイトの内部浮動小数点 (COMP-2) 表記の値が渡されます。

リテラル-3 は DBCS リテラルであってはいけません。

RETURNING 句

ID-5
データ部に定義された任意のデータ項目を指定できる RETURNING データ項目です。呼び出されるプログラムの戻り値は暗黙的に ID-5 に保管されます。

COBOL、C、または C のリンケージ規則を使用するその他のプログラミング言語で作成した関数への呼び出しとして、 RETURNING 句を指定することができます。 COBOL サブプログラムへの CALL に RETURNING 句を指定する場合は、次のようになります。

  • 呼び出されるサブプログラムでは、その手続き部のヘッダーに RETURNING 句を指定していなければなりません。
  • ID-5 およびそのターゲット・プログラム内での対応する手続き部 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 句

例外条件は、呼び出されたサブプログラムを使用可能にできないときに起こります。そのときは、次の 2 つの処置のどちらかが行われます。

  1. ON EXCEPTION 句が指定されている場合は、制御は 命令ステートメント-1 に移ります。 次いで、命令ステートメント-1 に指定された各ステートメントの規則に従って、 実行が継続されます。明示的な制御の移動を起こすプロシージャーのブランチ・ステートメントや条件ステートメントが 実行された場合は、制御はそのステートメントの規則に従って移されます。 それ以外の場合は、命令ステートメント-1 の実行が完了すると、 制御は CALL ステートメントの終わりに移され、NOT ON EXCEPTION 句が指定されている場合はそれが無視されます。
  2. 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 ステートメントとも使用できます。

詳しくは、範囲区切りステートメントを参照してください。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)