COBOL子程序是可以獨(dú)立編譯但不能獨(dú)立執(zhí)行的程序。有兩種類(lèi)型的子程序:內(nèi)部子程序,如perform語(yǔ)句;和外部子程序,如CALL動(dòng)詞。
調(diào)用動(dòng)詞用于將控件從一個(gè)程序轉(zhuǎn)移到另一個(gè)程序。包含CALL動(dòng)詞的程序是Calling Program(調(diào)用程序),被調(diào)用的程序被稱(chēng)為Called Program(被調(diào)用程序)。調(diào)用程序的執(zhí)行將停止,直到被調(diào)用的程序完成執(zhí)行。Exit Program語(yǔ)句用在被調(diào)用程序中傳送回控件。
以下是被調(diào)用的程序要求:
Linkage section(連接節(jié)):必須在被調(diào)用程序中定義。它由在程序中傳遞的數(shù)據(jù)元素組成。該數(shù)據(jù)項(xiàng)不應(yīng)該有value子句。PIC子句必須與通過(guò)調(diào)用程序傳遞的變量兼容。
Procedure division using:有一個(gè)從調(diào)用程序傳遞過(guò)來(lái)的變量列表,并且該順序必須與在Call動(dòng)詞中提到的相同。
Exit program:該語(yǔ)句是用在被調(diào)用程序中傳送回控件。它必須被調(diào)用程序的最后一條語(yǔ)句。
參數(shù)可以通過(guò)兩種方式在程序間進(jìn)行傳遞:
如果被調(diào)用程序中的變量的值被修改,那么它們的新值將在調(diào)用程序中反映出來(lái)。如果未指定BY子句,則始終通過(guò)引用傳遞變量。
以下是通過(guò)引用調(diào)用子程序的語(yǔ)法:
CALL sub-prog-name USING variable-1, variable-2.
以下示例,MAIN是調(diào)用程序,UTIL是被調(diào)用程序:
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
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
In Called Program Student Id : 1111 Student Name : Tim
如果被調(diào)用程序中的變量的值被修改,那么它們的新值將不會(huì)在調(diào)用程序中反映出來(lái)。
以下是通過(guò)內(nèi)容調(diào)用子程序的語(yǔ)法:
CALL sub-prog-name USING BY CONTENT variable-1, BY CONTENT variable-2.
以下示例,MAIN是調(diào)用程序,UTIL是被調(diào)用程序:
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
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
In Called Program Student Id : 1000 Student Name : Tim
有兩種調(diào)用類(lèi)型:
Static Call(靜態(tài)調(diào)用):發(fā)生在使用NODYNAM編譯器選項(xiàng)編譯程序時(shí)。靜態(tài)調(diào)用程序在編譯時(shí)被加載到存儲(chǔ)中。
Dynamic Call(動(dòng)態(tài)調(diào)用):發(fā)生在使用DYNAM和NODLL編譯器選項(xiàng)編譯程序時(shí)。動(dòng)態(tài)調(diào)用程序在運(yùn)行時(shí)被加載到存儲(chǔ)中。
更多建議: