内部子程序
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-A.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-B.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-B.
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-C.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-D.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-D.
END PROGRAM PROC-C.
END PROGRAM PROC-A.
程序A包含B,C两个子程序,其中C又包含子程序D。
A能调用B,C。C能调用D。B不能调用C,A不能调用D。
如果C声明为公用的,则B可以调用C,语法为:
PROGRAM-ID. PROC-C IS COMMON PROGRAM.
当前函数中定义的变量都只是对当前函数有效。可以用GLOBAL声明为对所有函数有效。
01 DATA-NAME IS GOLBAL ...
文件也有此声明:FD FILE-NAME IS GOLBAL ...
如果调用的不是本程序中的文件或变量,则可以用EXTERNAL声明。
FD FILE-NAME IS EXTERNAL.../01 DATA-NAME IS EXTERNAL...
CALL PROC VAR1 [ON EXCEPTION CODE1] [NOT ON EXCEPTION CODE2] END-CALL.
如果找不到PROC程序名,执行CODE1(如果有此声明),找到将参数VAR1传递给PROC,并执行。PROC返回时执行CODE2(如果有此声明)。
参数应该在文件,工作存储或连接节中定义,应为01层数据项,77层数据项或基本数据项。
子程序要返回调用程序,执行EXIT PROGRAM
传递参数有3步:
首先在调用程序的CALL语句列出要传递的参数。
CALL PROC VAR1 .
然后在被调用程序的过程部标题,使用USING短语列出相应的参数。
PROCEDURE DIVISION USING VAR1.
最后在被调用程序的连接节(LINKAGE SECTION)提供参数的存储空间。
LINKAGE SECTION.
01 VAR1 PIC XX.
参数传递有2中方式:
BY CONTENT 传递的参数值只在被调用函数中被改变,调用函数中的值不变。
BY REFERENCE. 传递的参数值在被调用函数中被改变,调用函数中的值也改变。
CALL PROC VAR1 BY CONTENT/REFERENCE.
再次调用子程序,子程序处于上次退出的状态(除了连接节中的数据),打开的文件依然打开。
可以用INITIAL声明函数被调用时处于初始状态。
PROGRAM-ID. PROC-C IS INITIAL PROGRAM.
如果不想每次执行都初始化,只在需要的时候初始化,可以用CANCEL PROC.初始化PROC程序,但不执行PROC。