COBOL - 子程序

Cobol子程序是一个可以独立编译但不能独立执行的程序.有两种类型的子程序:内部子程序,如执行语句和外部子程序,如CALL动词.

调用动词

调用动词用于将控件从一个程序转移到另一个程序.包含CALL动词的程序是呼叫程序,被调用的程序称为被叫程序.调用程序执行将停止,直到被调用程序完成执行.在被叫程序中使用退出程序语句来传回控制.

被称为程序约束

以下是被调用的程序要求 :

  • 必须在被调用程序中定义链接部分.它由程序中传递的数据元素组成.数据项不应具有Value子句. PIC子句必须与通过调用程序传递的变量兼容.
  • 使用的程序划分有一个从中传递的变量列表调用程序和命令必须与Call动词中提到的相同.
  • 退出程序语句在被调用程序中使用将控制权转回.它必须是被调用程序中的最后一个语句.

参数可以通过两种方式在程序之间传递和减去;

  • 按参考
  • 按内容

按引用调用

如果修改了被调用程序中变量的值,则它们的新值将反映在调用程序中.如果未指定 BY 子句,则变量始终通过引用传递.

语法

以下是语法通过引用调用子例程 :

CALL sub-prog-name USING variable-1, variable-2.

示例

以下示例是MAIN调用程序,UTIL是被调用程序 :

 
 IDENTIFICATION DIVISION. 
 PROGRAM-ID.主要. 
 DATA DIVISION. 
工作 - 储存部分. 
 01 WS-STUDENT-ID PIC 9(4)价值1000. 
 01 WS-STUDENT-NAME PIC A(15)VALUE'Tim'. 
程序部门. 
 CALL'UTIL'使用WS-STUDENT-ID,WS-STUDENT-NAME. 
 DISPLAY'学生ID:'WS-STUDENT-ID 
 DISPLAY'学生姓名:'WS-STUDENT-NAME 
 STOP RUN.

被叫程序

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.

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编译程序时发生编译选项.动态调用程序在运行时加载到存储中.