The CALL statement is the primary mechanism for invoking subprograms in COBOL. It allows a program to transfer control to another program and optionally pass data between them. This forms the foundation of modular programming in COBOL, enabling developers to create reusable code components.
12345CALL program-name [USING argument-1 [argument-2 ... ]] [RETURNING identifier-1] [ON EXCEPTION imperative-statement-1] [NOT ON EXCEPTION imperative-statement-2] [END-CALL]
1234567891011121314151617181920212223IDENTIFICATION DIVISION. PROGRAM-ID. MAINPROG. DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOMER-ID PIC 9(5) VALUE 12345. 01 CUSTOMER-NAME PIC X(30). 01 RESULT-CODE PIC 99. PROCEDURE DIVISION. MAIN-LOGIC. DISPLAY "Calling customer lookup subprogram" CALL "CUSTLOOK" USING CUSTOMER-ID, CUSTOMER-NAME RETURNING RESULT-CODE IF RESULT-CODE = 0 DISPLAY "Customer found: " CUSTOMER-NAME ELSE DISPLAY "Customer not found, code: " RESULT-CODE END-IF STOP RUN.
This example shows a main program calling a subprogram named "CUSTLOOK" to look up customer information based on a customer ID. The main program passes the customer ID and a field to receive the customer name, and the subprogram returns a result code.
Feature | Static CALL | Dynamic CALL |
---|---|---|
Syntax | CALL programname | CALL "programname" or CALL literal |
Binding Time | Compile/Link time | Runtime |
Load Module | Combined with main program | Separate load module |
Memory Usage | Always loaded | Loaded only when needed |
Performance | Faster execution | Slight overhead for loading |
Maintenance | Recompile all for changes | Can update subprogram independently |
Error Handling | Compile-time resolution | Runtime resolution (ON EXCEPTION) |
123456789101112131415* Static CALL example CALL CUSTLOOK USING CUSTOMER-ID, CUSTOMER-NAME * Dynamic CALL example CALL "CUSTLOOK" USING CUSTOMER-ID, CUSTOMER-NAME ON EXCEPTION DISPLAY "Program CUSTLOOK not found" NOT ON EXCEPTION DISPLAY "CUSTLOOK executed successfully" END-CALL * Dynamic CALL with variable program name 01 PROGRAM-NAME PIC X(8) VALUE "CUSTLOOK". ... CALL PROGRAM-NAME USING CUSTOMER-ID, CUSTOMER-NAME
Dynamic calls provide more flexibility but require appropriate error handling to manage cases where the subprogram cannot be found or loaded.
The USING and RETURNING clauses are essential for passing data between programs. The USING clause passes arguments to the subprogram, while the RETURNING clause retrieves a single result value. Understanding these mechanisms is crucial for effective communication between COBOL program modules.
The USING clause allows the calling program to pass arguments to the called subprogram. These arguments are declared in the LINKAGE SECTION of the subprogram.
123456789101112131415161718* In the calling program: CALL "CALCINTEREST" USING PRINCIPAL, RATE, TERM, INTEREST * In the called subprogram: IDENTIFICATION DIVISION. PROGRAM-ID. CALCINTEREST. DATA DIVISION. LINKAGE SECTION. 01 LS-PRINCIPAL PIC 9(7)V99. 01 LS-RATE PIC 9(2)V99. 01 LS-TERM PIC 9(2). 01 LS-INTEREST PIC 9(7)V99. PROCEDURE DIVISION USING LS-PRINCIPAL, LS-RATE, LS-TERM, LS-INTEREST. MAIN-PARAGRAPH. COMPUTE LS-INTEREST = LS-PRINCIPAL * LS-RATE * LS-TERM / 100 GOBACK.
The RETURNING clause allows a subprogram to pass a single value back to the calling program. This is ideal for returning status codes, calculation results, or other single-value returns.
1234567891011121314151617181920212223242526272829* In the calling program: 01 RESULT-VALUE PIC 9(5) COMP. ... CALL "FACTORIAL" USING INPUT-NUMBER RETURNING RESULT-VALUE * In the called subprogram: IDENTIFICATION DIVISION. PROGRAM-ID. FACTORIAL. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNTER PIC 9(2) COMP. 01 WS-RESULT PIC 9(5) COMP VALUE 1. LINKAGE SECTION. 01 LS-NUMBER PIC 9(2) COMP. PROCEDURE DIVISION USING LS-NUMBER RETURNING WS-RESULT. MAIN-PARAGRAPH. IF LS-NUMBER = 0 OR LS-NUMBER = 1 MOVE 1 TO WS-RESULT ELSE PERFORM VARYING WS-COUNTER FROM 1 BY 1 UNTIL WS-COUNTER > LS-NUMBER COMPUTE WS-RESULT = WS-RESULT * WS-COUNTER END-PERFORM END-IF GOBACK.
Method | Syntax | Description | Use Case |
---|---|---|---|
BY REFERENCE | USING BY REFERENCE data-item | Passes the address; changes affect the original | Default method; for input/output parameters |
BY CONTENT | USING BY CONTENT data-item | Passes a copy; changes don't affect the original | For input-only parameters that shouldn't be modified |
BY VALUE | USING BY VALUE data-item | Passes the actual value; more efficient for small data | For small elementary items (numerics, single chars) |
123456789* In the calling program: CALL "PROCDATA" USING BY REFERENCE CUSTOMER-RECORD BY CONTENT TRANSACTION-DATE BY VALUE ACTION-CODE * In the subprogram: PROCEDURE DIVISION USING BY REFERENCE LS-CUSTOMER BY CONTENT LS-DATE BY VALUE LS-ACTION.
Choosing the appropriate parameter passing method enhances program security and prevents unintended side effects. BY REFERENCE is the default and most common method, but the others have important use cases.
The CANCEL statement and the LINKAGE SECTION are important components of COBOL's subprogram infrastructure. The CANCEL statement releases resources associated with a called subprogram, while the LINKAGE SECTION provides the interface for data communication between programs.
The CANCEL statement releases the resources associated with a dynamically called subprogram and forces a fresh load on the next CALL to that program.
12345678* Basic CANCEL syntax CANCEL program-name-1 [program-name-2 ...] * Examples CANCEL "SUBPROG1" * Cancel a single program CANCEL "SUBPROG1" "SUBPROG2" * Cancel multiple programs CANCEL PROGRAM-NAME * Cancel using a variable name
12345678910111213141516171819202122232425* Memory management in a large application PERFORM PROCESS-CUSTOMER-DATA CANCEL "CUSTPROC" "CUSTVAL" "CUSTRPT" PERFORM PROCESS-INVENTORY-DATA CANCEL "INVPROC" "INVVAL" "INVRPT" * Forcing reinitialization of working storage CALL "COUNTER" USING COUNT-VALUE * ... later in the program CANCEL "COUNTER" * Forces reinitialization of counter's working storage CALL "COUNTER" USING COUNT-VALUE * Fresh start with initial values * Implementing a form of "recursive" calling 01 RECURSION-LIMIT PIC 9(2) VALUE 10. 01 RECURSION-COUNTER PIC 9(2) VALUE ZERO. ... PERFORM HANDLE-RECURSIVE-CASE ... HANDLE-RECURSIVE-CASE. ADD 1 TO RECURSION-COUNTER IF RECURSION-COUNTER < RECURSION-LIMIT CANCEL "RECURSIVE" * Clear the state CALL "RECURSIVE" USING NEW-PARAMETER END-IF SUBTRACT 1 FROM RECURSION-COUNTER.
These examples show how CANCEL can be used to manage memory in large applications, force reinitialization of a subprogram's state, and simulate recursion in environments that don't directly support it.
The LINKAGE SECTION is where subprograms define the data items passed from the calling program. It serves as the interface between programs.
12345678910111213141516171819202122DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-WORK-FIELDS. 05 WS-CALC-RESULT PIC 9(5)V99. 05 WS-ERROR-FLAG PIC X. 88 WS-ERROR-FOUND VALUE "Y". LINKAGE SECTION. 01 LS-INPUT-PARAMS. 05 LS-CUSTOMER-ID PIC X(8). 05 LS-TRANSACTION-AMT PIC 9(5)V99. 05 LS-TRANSACTION-DATE. 10 LS-YEAR PIC 9(4). 10 LS-MONTH PIC 9(2). 10 LS-DAY PIC 9(2). 01 LS-RESULT-FIELDS. 05 LS-PROCESSED-AMT PIC 9(5)V99. 05 LS-STATUS-CODE PIC XX. 01 LS-ERROR-MESSAGE PIC X(50). PROCEDURE DIVISION USING LS-INPUT-PARAMS, LS-RESULT-FIELDS, LS-ERROR-MESSAGE.
1234567891011121314151617181920212223242526272829303132333435* Pattern 1: Simple parameter list LINKAGE SECTION. 01 LS-PARAM1 PIC X(10). 01 LS-PARAM2 PIC 9(5). 01 LS-PARAM3 PIC X. ... PROCEDURE DIVISION USING LS-PARAM1, LS-PARAM2, LS-PARAM3. * Pattern 2: Single group item containing all parameters LINKAGE SECTION. 01 LS-PARAMETERS. 05 LS-INPUT-FIELDS. 10 LS-CUSTOMER-ID PIC X(10). 10 LS-AMOUNT PIC 9(5)V99. 05 LS-OUTPUT-FIELDS. 10 LS-RESULT PIC 9(5)V99. 10 LS-STATUS PIC XX. ... PROCEDURE DIVISION USING LS-PARAMETERS. * Pattern 3: Input, output, and I/O parameters LINKAGE SECTION. 01 LS-INPUT-PARAMS. 05 LS-CUST-ID PIC X(10). 05 LS-TRANS-DATE PIC X(8). 01 LS-OUTPUT-PARAMS. 05 LS-RESULT-AMT PIC 9(7)V99. 05 LS-STATUS-CODE PIC XX. 01 LS-INOUT-PARAMS. 05 LS-BALANCE PIC S9(7)V99. 05 LS-TRANSACTION PIC X(50). ... PROCEDURE DIVISION USING LS-INPUT-PARAMS, LS-OUTPUT-PARAMS, LS-INOUT-PARAMS.
These patterns show different ways to organize the LINKAGE SECTION. Choose the pattern that best fits your application's needs and organizational standards.
Modular programming is an approach where an application is divided into smaller, manageable, and reusable components called modules. In COBOL, these modules are typically implemented as subprograms. This section explores the concepts and benefits of modular programming in COBOL.
Benefit | Description |
---|---|
Reusability | Common functionality can be implemented once and used in multiple programs |
Maintainability | Smaller programs are easier to understand, debug, and maintain |
Collaboration | Different programmers can work on different modules simultaneously |
Testing | Modules can be tested independently before integration |
Flexibility | Modules can be replaced or upgraded without affecting the entire system |
Memory Efficiency | Dynamic loading allows optimized memory usage |
Abstraction | Implementation details are hidden behind interfaces |
COBOL applications typically employ several types of modules or subprograms, each with a specific purpose:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950* Main program structure in a modular application IDENTIFICATION DIVISION. PROGRAM-ID. MAINAPP. DATA DIVISION. WORKING-STORAGE SECTION. 01 MENU-SELECTION PIC 9. 01 CUSTOMER-MASTER. 05 CUST-ID PIC X(8). 05 CUST-NAME PIC X(30). 05 CUST-ADDRESS PIC X(50). 01 TRANSACTION-DATA. 05 TRANS-TYPE PIC X. 05 TRANS-AMOUNT PIC 9(7)V99. 01 STATUS-CODE PIC 99. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM DISPLAY-MENU PERFORM PROCESS-SELECTION UNTIL MENU-SELECTION = 0 PERFORM TERMINATION STOP RUN. INITIALIZATION. CALL "INITMOD" USING STATUS-CODE IF STATUS-CODE NOT = 0 DISPLAY "Initialization failed, code: " STATUS-CODE MOVE 0 TO MENU-SELECTION END-IF. DISPLAY-MENU. CALL "MENUMOD" USING MENU-SELECTION. PROCESS-SELECTION. EVALUATE MENU-SELECTION WHEN 1 CALL "CUSTMAINT" USING CUSTOMER-MASTER, STATUS-CODE WHEN 2 CALL "TRANSMOD" USING TRANSACTION-DATA, CUSTOMER-MASTER, STATUS-CODE WHEN 3 CALL "RPTMOD" USING STATUS-CODE WHEN OTHER DISPLAY "Invalid selection" END-EVALUATE PERFORM DISPLAY-MENU. TERMINATION. CALL "TERMMOD" USING STATUS-CODE.
This example shows a main program that coordinates various subprograms to implement a complete application. Each subprogram handles a specific aspect of the application's functionality.
Well-designed module interfaces are crucial for effective modular programming:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950* Example of well-designed subprogram interface IDENTIFICATION DIVISION. PROGRAM-ID. DATEVAL. * Purpose: Validates and formats dates * Input: Date in YYYYMMDD format * Output: Formatted date and validation status DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-MONTH-TABLE. 05 FILLER PIC X(3) VALUE "Jan". 05 FILLER PIC X(3) VALUE "Feb". 05 FILLER PIC X(3) VALUE "Mar". 05 FILLER PIC X(3) VALUE "Apr". 05 FILLER PIC X(3) VALUE "May". 05 FILLER PIC X(3) VALUE "Jun". 05 FILLER PIC X(3) VALUE "Jul". 05 FILLER PIC X(3) VALUE "Aug". 05 FILLER PIC X(3) VALUE "Sep". 05 FILLER PIC X(3) VALUE "Oct". 05 FILLER PIC X(3) VALUE "Nov". 05 FILLER PIC X(3) VALUE "Dec". 01 WS-MONTHS REDEFINES WS-MONTH-TABLE. 05 WS-MONTH-NAME PIC X(3) OCCURS 12 TIMES. 01 WS-WORK-FIELDS. 05 WS-YEAR PIC 9(4). 05 WS-MONTH PIC 99. 05 WS-DAY PIC 99. 05 WS-LEAP-YEAR PIC X. 88 IS-LEAP-YEAR VALUE "Y". LINKAGE SECTION. 01 LS-INPUT-DATE PIC X(8). * YYYYMMDD 01 LS-OUTPUT-STRUCT. 05 LS-FORMATTED-DATE PIC X(11). * DD-Mon-YYYY 05 LS-STATUS PIC 9. 88 LS-DATE-VALID VALUE 0. 88 LS-INVALID-YEAR VALUE 1. 88 LS-INVALID-MONTH VALUE 2. 88 LS-INVALID-DAY VALUE 3. PROCEDURE DIVISION USING LS-INPUT-DATE, LS-OUTPUT-STRUCT. * Clear consistent interface documentation * Validation and processing logic * Proper error handling * Status codes for all outcomes * Well-structured output GOBACK.
This example demonstrates a well-designed subprogram interface with:
Pattern | Description | Use Case |
---|---|---|
Sequential | Main program calls modules in sequence | Simple batch processing applications |
Hierarchical | Modules call other modules in a tree structure | Complex applications with layered functionality |
Menu-driven | Main module displays menu, calls modules based on selection | Interactive applications with multiple functions |
Pipeline | Output from one module becomes input to the next | Data transformation and processing chains |
Callback | Module A passes a routine name to Module B to call back | Event handling and customizable processing |
1. What statement is used to invoke a subprogram in COBOL?
2. Which of the following indicates a dynamic CALL in COBOL?
3. In COBOL, where do subprograms define the parameters passed from the calling program?
4. What is the purpose of the USING clause in a CALL statement?
5. What statement can be used to release resources associated with a dynamically called subprogram?
Detailed usage of the CALL statement in COBOL.
How to pass parameters between programs in COBOL.
Understanding the structure of COBOL programs.
The PROCEDURE DIVISION in COBOL programs.
Using the LINKAGE SECTION for parameter definitions.