Cobol-subroutines
COBOL-サブルーチン
Cobolサブルーチンは、独立してコンパイルできますが、独立して実行できないプログラムです。 サブルーチンには2つのタイプがあります: Perform ステートメントのような* internalサブルーチン*とCALL verbのような external サブルーチンです。
動詞を呼び出す
呼び出し動詞は、あるプログラムから別のプログラムに制御を転送するために使用されます。 CALL動詞を含むプログラムは Calling Program であり、呼び出されるプログラムは Called Program として知られています。 呼び出しプログラムの実行は、呼び出されたプログラムが実行を終了するまで停止します。 Exit Programステートメントは、呼び出し先プログラムで制御を戻すために使用されます。
呼び出されたプログラムの制約
以下は、呼び出されたプログラムの要件です-
- *リンケージセクション*は、呼び出されたプログラムで定義する必要があります。 プログラムで渡されるデータ要素で構成されます。 データ項目にValue句を含めることはできません。 PIC句は、呼び出しプログラムを介して渡される変数と互換性がある必要があります。
- *を使用した手続き除算*には、呼び出し側プログラムから渡される変数のリストがあり、呼び出し動詞で言及されている順序と同じでなければなりません。
- Exit program ステートメントは、制御を戻すために呼び出されたプログラムで使用されます。 呼び出されたプログラムの最後のステートメントでなければなりません。
パラメータは、2つの方法でプログラム間で渡すことができます-
- 参照により *コンテンツごと
参照による呼び出し
呼び出されたプログラムの変数の値が変更された場合、それらの新しい値は呼び出し元のプログラムに反映されます。* BY *句が指定されていない場合、変数は常に参照渡しされます。
構文
参照によってサブルーチンを呼び出す構文は次のとおりです-
CALL sub-prog-name USING variable-1, variable-2.
例
次の例は、メインの呼び出しプログラムであり、UTILは呼び出されたプログラムです-
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.
呼び出されたプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
In Called Program
Student Id : 1111
Student Name : Tim
コンテンツで呼び出す
呼び出されたプログラムの変数の値が変更された場合、それらの新しい値は呼び出しプログラムに反映されません。
構文
内容によってサブルーチンを呼び出す構文は次のとおりです-
CALL sub-prog-name USING
BY CONTENT variable-1, BY CONTENT variable-2.
例
次の例は、メインの呼び出しプログラムであり、UTILは呼び出されたプログラムです-
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.
呼び出されたプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
In Called Program
Student Id : 1000
Student Name : Tim
通話の種類
呼び出しには2つのタイプがあります-
- *静的呼び出し*は、プログラムがNODYNAMコンパイラオプションでコンパイルされるときに発生します。 呼び出された静的プログラムは、コンパイル時にストレージにロードされます。
- *ダイナミックコール*は、プログラムがDYNAMおよびNODLLコンパイラオプションでコンパイルされるときに発生します。 動的に呼び出されるプログラムは、実行時にストレージにロードされます。