The CALL statement in COBOL is a fundamental mechanism for invoking subprograms, enabling modular programming and code reuse. It allows programs to communicate with other programs, pass parameters, and receive return values, making COBOL applications more maintainable and organized.
The CALL statement transfers control from the calling program to a subprogram, executes the subprogram, and then returns control to the calling program. This mechanism enables code modularity, reusability, and separation of concerns in COBOL applications.
123456CALL 'subprogram-name' USING parameter-list ON EXCEPTION error-handling-statements NOT ON EXCEPTION success-handling-statements END-CALL.
12345678910111213141516171819202122232425262728293031323334IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 CALCULATION-DATA. 05 FIRST-NUMBER PIC 9(5)V99. 05 SECOND-NUMBER PIC 9(5)V99. 05 RESULT PIC 9(6)V99. 05 OPERATION PIC X(1). 88 ADDITION VALUE 'A'. 88 SUBTRACTION VALUE 'S'. 88 MULTIPLICATION VALUE 'M'. 88 DIVISION VALUE 'D'. 01 RETURN-CODE. 05 RC PIC 9(2). 88 SUCCESS VALUE 00. 88 ERROR VALUE 99. PROCEDURE DIVISION. MAIN-LOGIC. MOVE 100.50 TO FIRST-NUMBER MOVE 25.25 TO SECOND-NUMBER MOVE 'A' TO OPERATION CALL 'CALCULATOR' USING CALCULATION-DATA RETURN-CODE IF SUCCESS DISPLAY 'Result: ' RESULT ELSE DISPLAY 'Calculation Error' END-IF STOP RUN.
12345678910111213141516171819202122232425262728293031323334353637IDENTIFICATION DIVISION. PROGRAM-ID. CALCULATOR. DATA DIVISION. LINKAGE SECTION. 01 CALCULATION-DATA. 05 FIRST-NUMBER PIC 9(5)V99. 05 SECOND-NUMBER PIC 9(5)V99. 05 RESULT PIC 9(6)V99. 05 OPERATION PIC X(1). 01 RETURN-CODE. 05 RC PIC 9(2). PROCEDURE DIVISION USING CALCULATION-DATA RETURN-CODE. MAIN-CALCULATION. EVALUATE OPERATION WHEN 'A' ADD FIRST-NUMBER TO SECOND-NUMBER GIVING RESULT MOVE 00 TO RC WHEN 'S' SUBTRACT SECOND-NUMBER FROM FIRST-NUMBER GIVING RESULT MOVE 00 TO RC WHEN 'M' MULTIPLY FIRST-NUMBER BY SECOND-NUMBER GIVING RESULT MOVE 00 TO RC WHEN 'D' IF SECOND-NUMBER NOT = ZERO DIVIDE FIRST-NUMBER BY SECOND-NUMBER GIVING RESULT MOVE 00 TO RC ELSE MOVE 99 TO RC END-IF WHEN OTHER MOVE 99 TO RC END-EVALUATE EXIT PROGRAM.
Parameters are passed by reference, meaning the subprogram works with the actual data items from the calling program.
123CALL 'PROCESS-DATA' USING CUSTOMER-RECORD TRANSACTION-AMOUNT RESULT-STATUS.
Parameters are passed by content, creating a copy of the data for the subprogram to use.
12CALL 'VALIDATE-DATE' USING BY CONTENT INPUT-DATE BY REFERENCE VALIDATION-RESULT.
Combine both reference and content parameter passing in a single CALL statement.
123CALL 'PROCESS-ORDER' USING BY REFERENCE ORDER-DATA BY CONTENT PROCESSING-DATE BY REFERENCE ORDER-STATUS.
12345678910111213PROCEDURE DIVISION. CALL-WITH-ERROR-HANDLING. CALL 'FILE-PROCESSOR' USING FILE-DATA ON EXCEPTION DISPLAY 'Error: Subprogram not found' MOVE 99 TO RETURN-CODE NOT ON EXCEPTION IF RETURN-CODE = 00 DISPLAY 'File processing successful' ELSE DISPLAY 'File processing failed' END-IF END-CALL.
Dynamic CALL statements allow program names to be determined at runtime, providing flexibility in program execution.
1234567891011121314151617181920212223242526WORKING-STORAGE SECTION. 01 DYNAMIC-PROGRAM-NAME PIC X(20). 01 PROGRAM-SELECTION PIC X(1). 88 REPORT-PROGRAM VALUE 'R'. 88 UPDATE-PROGRAM VALUE 'U'. 88 QUERY-PROGRAM VALUE 'Q'. PROCEDURE DIVISION. DYNAMIC-CALL-PROCESSING. PERFORM SELECT-PROGRAM-NAME CALL DYNAMIC-PROGRAM-NAME USING PARAMETER-LIST ON EXCEPTION DISPLAY 'Program not available: ' DYNAMIC-PROGRAM-NAME END-CALL. SELECT-PROGRAM-NAME. EVALUATE PROGRAM-SELECTION WHEN 'R' MOVE 'GENERATE-REPORT' TO DYNAMIC-PROGRAM-NAME WHEN 'U' MOVE 'UPDATE-RECORDS' TO DYNAMIC-PROGRAM-NAME WHEN 'Q' MOVE 'QUERY-DATABASE' TO DYNAMIC-PROGRAM-NAME WHEN OTHER MOVE 'DEFAULT-PROCESSOR' TO DYNAMIC-PROGRAM-NAME END-EVALUATE.
CALL statements can be nested, allowing subprograms to call other subprograms, creating a hierarchy of program calls.
1234567891011PROCEDURE DIVISION. NESTED-CALL-EXAMPLE. CALL 'VALIDATE-INPUT' USING INPUT-DATA VALIDATION-RESULT IF VALIDATION-SUCCESSFUL CALL 'PROCESS-DATA' USING INPUT-DATA PROCESSING-RESULT IF PROCESSING-SUCCESSFUL CALL 'GENERATE-OUTPUT' USING PROCESSING-RESULT OUTPUT-DATA END-IF END-IF.