COBOL子程序是可以獨立編譯但不能獨立執(zhí)行的程序。有兩種類型的子程序:內部子程序,如perform語句;和外部子程序,如CALL動詞。
調用動詞用于將控件從一個程序轉移到另一個程序。包含CALL動詞的程序是Calling Program(調用程序),被調用的程序被稱為Called Program(被調用程序)。調用程序的執(zhí)行將停止,直到被調用的程序完成執(zhí)行。Exit Program語句用在被調用程序中傳送回控件。
以下是被調用的程序要求:
Linkage section(連接節(jié)):必須在被調用程序中定義。它由在程序中傳遞的數(shù)據(jù)元素組成。該數(shù)據(jù)項不應該有value子句。PIC子句必須與通過調用程序傳遞的變量兼容。
Procedure division using:有一個從調用程序傳遞過來的變量列表,并且該順序必須與在Call動詞中提到的相同。
Exit program:該語句是用在被調用程序中傳送回控件。它必須被調用程序的最后一條語句。
參數(shù)可以通過兩種方式在程序間進行傳遞:
如果被調用程序中的變量的值被修改,那么它們的新值將在調用程序中反映出來。如果未指定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執(zhí)行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=MAIN
當你編譯和執(zhí)行上面的程序,會產生以下結果:
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執(zhí)行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=MAIN
當你編譯和執(zhí)行上面的程序,會產生以下結果:
In Called Program Student Id : 1000 Student Name : Tim
有兩種調用類型:
Static Call(靜態(tài)調用):發(fā)生在使用NODYNAM編譯器選項編譯程序時。靜態(tài)調用程序在編譯時被加載到存儲中。
Dynamic Call(動態(tài)調用):發(fā)生在使用DYNAM和NODLL編譯器選項編譯程序時。動態(tài)調用程序在運行時被加載到存儲中。
更多建議: