📅  最后修改于: 2020-11-22 16:56:27             🧑  作者: Mango
Cobol子例程是可以独立编译但不能独立执行的程序。子例程有两种类型:内部子例程(如Perform语句)和外部子例程(如CALL动词)。
调用动词用于将控件从一个程序转移到另一个程序。包含CALL动词的程序是“调用程序” ,被调用的程序称为“被调用程序” 。调用程序的执行将暂停,直到被调用程序完成执行为止。在被调用程序中使用Exit Program语句将控制权转回。
以下是所谓的计划要求-
链接部分必须在调用的程序中定义。它由程序中传递的数据元素组成。数据项不应具有Value子句。 PIC子句必须与通过调用程序传递的变量兼容。
使用“过程除法”具有从调用程序传递的变量列表,并且顺序必须与“调用”动词中提到的顺序相同。
在被调用程序中使用Exit program语句将控制权转回。它必须是被调用程序中的最后一条语句。
可以通过两种方式在程序之间传递参数-
如果修改了被调用程序中的变量值,则它们的新值将反映在调用程序中。如果未指定BY子句,则变量始终按引用传递。
以下是通过引用调用子例程的语法-
CALL sub-prog-name USING variable-1, variable-2.
例
以下示例是MAIN调用程序,而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.
例
以下示例是MAIN调用程序,而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
呼叫有两种类型-
使用NODYNAM编译器选项编译程序时,将发生静态调用。静态的被调用程序在编译时被加载到存储中。
当使用DYNAM和NODLL编译器选项编译程序时,将发生动态调用。动态调用程序在运行时加载到存储中。