1. CALL

CALLステートメントは、プログラムの実行中に特定のプログラムから別のプログラムにプログラムの制御を移します。CALLステートメントを使用して別のプログラムを呼び出すプログラムを呼び出し側プログラムといい、それに対応されるのが、呼び出されるプログラムです。

呼び出されるプログラムもCALLステートメントを使用して別のプログラムを呼び出すことができます。ただし、直接または間接的に自身のプログラムを呼び出すためには、RECURSIVE節で定義されたプログラムである必要があります。

figure pd call
Figure 1. CALLステートメントの形式
figure pd exception phrases
Figure 2. CALLステートメントの形式 : 例外句
figure pd not exception phrase
Figure 3. CALLステートメントの形式 : 非例外句

以下は、ステートメントの各設定項目についての説明です。

  • identifier-1、literal-1

    • identifier-1は、プログラム名を指定できるように英数字、英数または数字で宣言されている必要があります。

    • identifier-1は、ウィンドウ日付フィールドになれません。literal-1の場合は英数字リテラルでなければなりません。

    • USAGE TYPEは、DISPLAY形式である必要があります。

    • 呼び出されるプログラムを手続き部の最初から実行する場合は、literal-1またはidentifier-1のデータ値には、呼び出されるプログラムの識別部門に定義したプログラム名を指定しなければなりません。

      手続き部の最初ではなく、ENTRYステートメントに指定された特定の部分から実行する場合は、呼び出されるプログラムのENTRYステートメントに宣言した名前を指定する必要があります。

  • procedure-pointer-1、function-pointer-1

    • 有効なプログラム・エントリー・ポイントを有するデータ項目である必要があります。

  • USING句

    • USING句は、呼び出されるプログラムに渡される引数を指定します。呼び出されるプログラムの手続き部またはENTRYステートメントの引数の数と、USING句の引数の数は同じである必要があり、引数の順序どおり渡されます。USING句で宣言された引数の値は、呼び出されるプログラムの実行中にのみ有効です。

    • BY CONTENT句、BY REFERENCE句、BY VALUE句は、別のBY CONTENT句、BY REFERENCE句、BY VALUE句が現れるまでのみ適用されます。BY CONTENT句、BY VALUE句が存在しない場合は、デフォルトとしてBY REFENCE句が想定されます。

  • BY REFERENCE句

    • BY REFERENCE句は、呼び出し側プログラムからデータ項目のコピーではなく、データ項目のアドレスの値を引数として渡します。したがって、呼び出されるプログラムから呼び出し側プログラムへ渡した引数の値を変更すると、呼び出されるプログラムの終了後にも変更された状態で残ることになります。

    • 以下の項目を設定します。

      項目 説明

      identifier-2

      データ部で定義された任意のレベルのデータ項目にすることができます。

      file-name-1

      QSAMファイルのファイル名です。

      ADDRESS OF identifier-2

      identifier-2は、LINKAGEセクションで定義されたレベル01またはレベル77のデータ項目である必要があります。

      OMITTED

      データ項目を引数として渡さないことを意味します。

  • BY CONTENT句

    • BY CONTENT句は、呼び出し側プログラムから呼び出されるプログラムへ引数を渡すとき、一時ストレージにコピーしてから値を渡します。したがって、呼び出されるプログラムで引数を変更しても、呼び出し側プログラムのデータは変更されません。

    • 以下の項目を設定します。

      項目 説明

      identifier-3

      データ部で定義された任意のレベルのデータ項目に指定することができます

      literal-2

      英数字リテラル、表意定数、DBCSリテラルに指定することができます。

      LENGTH OF 特殊レジスター

      LENGTH OF 特殊レジスターの詳細については、COBOLワードの特殊レジスター(Special Register)のLENGTH OFを参照してください。

      ADDRESS of identifier-3

      identifier-3は、LINKAGEセクション、WORKING-STORAGEセクション、LOCAL-STORAGEセクションで定義したレベル66またはレベル88でないデータ項目である必要があります。

      OMITTED

      データ項目を引数として渡さないことを意味します。

  • BY VALUE句

    • BY VALUE句は、呼び出し側プログラムから呼び出されるプログラムにデータの値自体を引数として渡します。したがって、呼び出されるプログラムで引数を変更しても、呼び出し側プログラムのデータは変更されません。

    • BY VALUE句は、COBOLプログラムと非COBOLプログラム(C言語など)とのインターフェースのために適用されましたが、COBOLプログラムとCOBOLプログラムの間にも使用することができます。

    • 以下の項目を設定します。

      項目 説明

      identifier-4

      データ部で定義された基本データ項目である必要があります。

      以下のいずれかにすることができます。

      • バイナリ(USAGE BINARY、COMP、COMP-4、COMP-5)

      • 浮動小数点(USAGE COMP-1、COMP-2)

      • 関数ポインター(USAGE FUNCTION-POINTER)

      • ポインター(USAGE POINTER)

      • プロシージャ・ポインター(USAGE PROCEDURE-POINTER)

      • 1バイトの英数字文字(PIC XまたはPIC Aなど)

      BY VALUE句が使用される場合、以下の項目も可能です。

      • USAGE DISPLAYの参照変更項目と長さ1

      • SHIFT-INとSHIFT-OUT特殊レジスター

      • LINAGE-COUNTER特殊レジスター(USAGE BINARYの場合)

      ADDRESS OF identifier-4

      LINKAGEセクション、WORKING-STORAGEセクション、LOCAL-STORAGEセクションで宣言したレベル66、レベル88でないデータ項目である必要があります。

      LENGTH OF 特殊レジスター

      LENGTH OF 特殊レジスターが使用されると、BY VALUEはPIC 9(9)バイナリとして指定されます。

      literal-3

      以下のいずれかにする必要があります。

      • 数字リテラル

      • 表意定数ZERO

      • 1文字の英数字リテラル

      • シンボリック文字

      • 1バイトの表意定数(SPACE、QUOTE、HIGH-VALUE、LOW-VALUE)

      以下の規則が適用されます。

      • ZEROは、数値として扱われます。(フルワード・バイナリのゼロが渡されます)

      • リテラルが固定小数点である場合、9桁以下の精度を持ちます。

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

  • RETURNING句

    • 以下の項目を設定します。

      項目 説明

      identifier-5

      identifier-5は、データ部に定義されたデータ項目を指定します。呼び出されるプログラムで指定した戻り値が保存されます。

    • 呼び出されるプログラムをCOBOLまたはCプログラムで作成した場合、CALLステートメントのRETURNING句を指定することができます。COBOLで作成されたサブプログラムを呼び出すCALLステートメントでRETURNING句を指定するときは、以下の内容に注意しなければなりません。

      • 呼び出されるプログラムでは、手続き部にRETURNING句を必ず指定します。

      • 呼び出し側プログラムのRETURNING句に指定したidentifier-5と、呼び出されるプログラムで指定したRETURNING句は、PICTURE、USAGE、SIGN、SYNCHRONIZED、JUSTIFIED、BLANK WHEN ZERO節が同じでなければなりません。(PICTURE節は通貨記号が異なる場合があり、ピリオドとコンマは、DECIMAL POINT IS COMMA節により異なる場合があります)

      • identifier-5の戻り値が、USAGE INDEX、POINTER、FUNCTION-POINTER、PROCEDURE-POINTERの場合、内部的にidentifier-5のSETステートメントを介して変更されたかのように作用します。

      • identifier-5の戻り値がその他の場合は、内部的にidentifier-5のMOVEステートメントを介して変更されたかのように作用します。

      • 例外またはオーバーフローが発生すると、identifier-5は変更されません。identifier-5は、参照変更されてはなりません。

      • RETURN-CODEは、RETURNING句が存在するCALLステートメントが実行されるときは、セットされません。

  • ON EXCEPTION句

    • 呼び出されるプログラムの実行中に例外が発生する場合、以下のいずれかに処理されます。

      • ON EXCEPTION句が存在する場合、プログラムの制御はimperative-statement-1に移ります。

      • CALLステートメントにON EXCEPTION句が存在しない場合、NOT ON EXCEPTIONがあっても無視されます。

  • NOT ON EXCEPTION句

    • 呼び出されるプログラムが正常に実行されると、プログラムの制御はimperative-statement-2に移されます。

  • ON OVERFLOW句

    • ON OVERFLOW句は、ON EXCEPTION句と同じ処理を実行します。

  • END-CALL句

    • END-CALL句は、明示的にCALLステートメントが終了されたことを指定します。