Data sharing in COBOL enables multiple programs to access and modify the same data, allowing coordinated operations and information exchange in mainframe applications. COBOL provides several mechanisms for data sharing: EXTERNAL data items for global shared data, LINKAGE SECTION for parameter passing, common storage areas, file-based sharing, and message-based communication. Understanding these mechanisms is essential for building multi-program applications that work together effectively.
Data sharing allows multiple COBOL programs to access and modify the same data. This is essential for:
COBOL provides multiple data sharing mechanisms, each suited for different scenarios. Choosing the right mechanism depends on your specific requirements, program relationships, and execution environment.
The EXTERNAL attribute creates a single shared copy of a data item that all programs in the same run unit can access. When you declare a data item with EXTERNAL, COBOL creates one instance of that data that persists for the entire run unit, regardless of which program declares it.
12345678WORKING-STORAGE SECTION. 01 EXTERNAL-SYSTEM-STATUS EXTERNAL. 05 SYSTEM-STATUS PIC X(10) VALUE 'INACTIVE'. 88 SYSTEM-ACTIVE VALUE 'ACTIVE'. 88 SYSTEM-INACTIVE VALUE 'INACTIVE'. 05 CURRENT-USER-ID PIC X(8) VALUE SPACES. 05 TRANSACTION-COUNTER PIC 9(10) VALUE 0. 05 ERROR-COUNT PIC 9(5) VALUE 0.
In this example, EXTERNAL-SYSTEM-STATUS is declared with the EXTERNAL attribute. This means:
12345678910111213141516171819202122232425262728IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 EXTERNAL-SHARED-DATA EXTERNAL. 05 SHARED-CUSTOMER-ID PIC 9(8) VALUE 0. 05 SHARED-CUSTOMER-NAME PIC X(30) VALUE SPACES. 05 SHARED-BALANCE PIC 9(9)V99 VALUE 0. 05 SHARED-TRANSACTION-CTR PIC 9(6) VALUE 0. PROCEDURE DIVISION. MAIN-PARA. MOVE 12345678 TO SHARED-CUSTOMER-ID MOVE 'JOHN SMITH' TO SHARED-CUSTOMER-NAME MOVE 5000.00 TO SHARED-BALANCE ADD 1 TO SHARED-TRANSACTION-CTR DISPLAY 'Main Program - Customer ID: ' SHARED-CUSTOMER-ID DISPLAY 'Main Program - Transaction Count: ' SHARED-TRANSACTION-CTR CALL 'SUB-PROGRAM' DISPLAY 'Main Program - After Sub Program Call' DISPLAY 'Transaction Count: ' SHARED-TRANSACTION-CTR DISPLAY 'Balance: ' SHARED-BALANCE STOP RUN.
The subprogram can access the same EXTERNAL data:
1234567891011121314151617181920212223IDENTIFICATION DIVISION. PROGRAM-ID. SUB-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 EXTERNAL-SHARED-DATA EXTERNAL. 05 SHARED-CUSTOMER-ID PIC 9(8). 05 SHARED-CUSTOMER-NAME PIC X(30). 05 SHARED-BALANCE PIC 9(9)V99. 05 SHARED-TRANSACTION-CTR PIC 9(6). PROCEDURE DIVISION. SUB-PARA. DISPLAY 'Sub Program - Customer ID: ' SHARED-CUSTOMER-ID DISPLAY 'Sub Program - Customer Name: ' SHARED-CUSTOMER-NAME ADD 100.00 TO SHARED-BALANCE ADD 1 TO SHARED-TRANSACTION-CTR DISPLAY 'Sub Program - Updated Balance: ' SHARED-BALANCE DISPLAY 'Sub Program - Transaction Count: ' SHARED-TRANSACTION-CTR EXIT PROGRAM.
When the subprogram modifies SHARED-BALANCE and SHARED-TRANSACTION-CTR, those changes are immediately visible to the main program because they're accessing the same EXTERNAL data instance.
| Characteristic | Description |
|---|---|
| Scope | Accessible to all programs in the same run unit by name |
| Lifetime | Persists for the entire run unit duration |
| Storage | Single shared instance, not duplicated per program |
| Initialization | Initialized once, typically in the first program that declares it |
| Modifications | Changes by any program are immediately visible to all programs |
| Naming | Must use the exact same name in all programs that access it |
The LINKAGE SECTION is used to define parameters that are passed between programs. Unlike EXTERNAL data, LINKAGE SECTION items don't allocate storage - they reference storage provided by the calling program. This makes parameter passing efficient and allows bidirectional data exchange.
12345678910111213141516DATA DIVISION. LINKAGE SECTION. 01 INPUT-PARAMETERS. 05 CUSTOMER-ID PIC 9(8). 05 TRANSACTION-AMOUNT PIC 9(9)V99. 05 OPERATION-TYPE PIC X. 88 DEPOSIT-OP VALUE 'D'. 88 WITHDRAWAL-OP VALUE 'W'. 01 OUTPUT-PARAMETERS. 05 RETURN-CODE PIC 9(4). 05 RETURN-MESSAGE PIC X(50). 05 NEW-BALANCE PIC 9(9)V99. PROCEDURE DIVISION USING INPUT-PARAMETERS OUTPUT-PARAMETERS.
The USING clause in the PROCEDURE DIVISION header specifies which LINKAGE SECTION items receive parameters from the calling program.
1234567891011121314151617181920212223242526272829303132IDENTIFICATION DIVISION. PROGRAM-ID. CALLING-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-DATA. 05 CUST-ID PIC 9(8) VALUE 12345678. 05 TRANS-AMOUNT PIC 9(9)V99 VALUE 500.00. 05 OP-TYPE PIC X VALUE 'D'. 01 OUTPUT-DATA. 05 RET-CODE PIC 9(4). 05 RET-MESSAGE PIC X(50). 05 NEW-BAL PIC 9(9)V99. PROCEDURE DIVISION. MAIN-PARA. DISPLAY 'Calling subprogram with parameters...' CALL 'PROCESS-TRANSACTION' USING INPUT-DATA OUTPUT-DATA IF RET-CODE = 0 DISPLAY 'Transaction successful' DISPLAY 'Return Message: ' RET-MESSAGE DISPLAY 'New Balance: ' NEW-BAL ELSE DISPLAY 'Transaction failed' DISPLAY 'Error: ' RET-MESSAGE END-IF STOP RUN.
12345678910111213141516171819202122232425262728293031323334353637383940414243IDENTIFICATION DIVISION. PROGRAM-ID. PROCESS-TRANSACTION. DATA DIVISION. WORKING-STORAGE SECTION. 01 CURRENT-BALANCE PIC 9(9)V99 VALUE 1000.00. LINKAGE SECTION. 01 INPUT-PARAMETERS. 05 CUSTOMER-ID PIC 9(8). 05 TRANSACTION-AMOUNT PIC 9(9)V99. 05 OPERATION-TYPE PIC X. 88 DEPOSIT-OP VALUE 'D'. 88 WITHDRAWAL-OP VALUE 'W'. 01 OUTPUT-PARAMETERS. 05 RETURN-CODE PIC 9(4). 05 RETURN-MESSAGE PIC X(50). 05 NEW-BALANCE PIC 9(9)V99. PROCEDURE DIVISION USING INPUT-PARAMETERS OUTPUT-PARAMETERS. PROCESS-PARA. DISPLAY 'Processing transaction for customer: ' CUSTOMER-ID IF DEPOSIT-OP ADD TRANSACTION-AMOUNT TO CURRENT-BALANCE MOVE 0 TO RETURN-CODE MOVE 'Deposit successful' TO RETURN-MESSAGE ELSE IF TRANSACTION-AMOUNT <= CURRENT-BALANCE SUBTRACT TRANSACTION-AMOUNT FROM CURRENT-BALANCE MOVE 0 TO RETURN-CODE MOVE 'Withdrawal successful' TO RETURN-MESSAGE ELSE MOVE 1 TO RETURN-CODE MOVE 'Insufficient funds' TO RETURN-MESSAGE END-IF END-IF MOVE CURRENT-BALANCE TO NEW-BALANCE EXIT PROGRAM.
The called program receives parameters through LINKAGE SECTION items and can modify them. Changes to OUTPUT-PARAMETERS are visible to the calling program because they reference the same storage.
| Aspect | EXTERNAL | LINKAGE SECTION |
|---|---|---|
| Purpose | Global shared data accessible by name | Parameter passing to specific programs |
| Access | Any program in run unit can access by name | Only the called program receives parameters |
| Storage | Single shared instance | References caller's storage |
| Lifetime | Entire run unit | During program execution |
| Initialization | Once, typically in first program | By calling program before CALL |
| Use Case | System-wide configuration, counters, status | Program-specific input/output parameters |
Common storage refers to data areas that persist across program calls within the same run unit. This includes EXTERNAL data items and WORKING-STORAGE data in programs that remain loaded. Common storage allows programs to share state without explicit parameter passing.
123456789101112131415161718192021222324252627WORKING-STORAGE SECTION. 01 COMMON-SESSION-DATA EXTERNAL. 05 SESSION-ID PIC X(20) VALUE SPACES. 05 USER-ID PIC X(8) VALUE SPACES. 05 LOGIN-TIME PIC 9(14) VALUE 0. 05 LAST-ACTIVITY-TIME PIC 9(14) VALUE 0. 05 TRANSACTION-COUNT PIC 9(6) VALUE 0. 01 COMMON-CONFIGURATION EXTERNAL. 05 MAX-TRANSACTIONS PIC 9(4) VALUE 1000. 05 TIMEOUT-SECONDS PIC 9(4) VALUE 300. 05 DEBUG-MODE PIC X VALUE 'N'. 88 DEBUG-ON VALUE 'Y'. 88 DEBUG-OFF VALUE 'N'. 05 LOG-LEVEL PIC 9 VALUE 2. PROCEDURE DIVISION. INITIALIZE-COMMON-STORAGE. MOVE FUNCTION CURRENT-DATE TO SESSION-ID MOVE 'USER001' TO USER-ID MOVE FUNCTION CURRENT-DATE TO LOGIN-TIME MOVE FUNCTION CURRENT-DATE TO LAST-ACTIVITY-TIME MOVE 0 TO TRANSACTION-COUNT DISPLAY 'Common storage initialized' DISPLAY 'Session ID: ' SESSION-ID DISPLAY 'User ID: ' USER-ID.
Any program in the run unit can access and modify this common storage, making it ideal for session management, configuration sharing, and maintaining state across program boundaries.
File-based data sharing is used when programs run in different address spaces, as separate jobs, or at different times. Programs write shared data to files that other programs can read. This method is slower than memory-based sharing but necessary for cross-address-space communication.
1234567891011121314151617181920212223242526272829303132333435363738394041FILE SECTION. FD SHARED-DATA-FILE LABEL RECORDS ARE STANDARD RECORDING MODE IS F ORGANIZATION IS SEQUENTIAL. 01 SHARED-DATA-RECORD. 05 RECORD-TYPE PIC X. 88 CUSTOMER-REC VALUE 'C'. 88 TRANSACTION-REC VALUE 'T'. 88 CONTROL-REC VALUE 'X'. 05 RECORD-DATA PIC X(99). 05 TIMESTAMP PIC 9(14). 05 SEQUENCE-NUMBER PIC 9(6). WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 RECORD-COUNT PIC 9(6) VALUE 0. PROCEDURE DIVISION. WRITE-SHARED-DATA. OPEN OUTPUT SHARED-DATA-FILE MOVE 'C' TO RECORD-TYPE MOVE 'CUSTOMER DATA: 12345678' TO RECORD-DATA MOVE FUNCTION CURRENT-DATE TO TIMESTAMP MOVE 1 TO SEQUENCE-NUMBER WRITE SHARED-DATA-RECORD ADD 1 TO RECORD-COUNT MOVE 'T' TO RECORD-TYPE MOVE 'TRANSACTION: DEPOSIT 500.00' TO RECORD-DATA MOVE FUNCTION CURRENT-DATE TO TIMESTAMP MOVE 2 TO SEQUENCE-NUMBER WRITE SHARED-DATA-RECORD ADD 1 TO RECORD-COUNT DISPLAY 'Written ' RECORD-COUNT ' records to shared file' CLOSE SHARED-DATA-FILE STOP RUN.
Another program can read from this file:
123456789101112131415161718192021222324252627282930313233343536FILE SECTION. FD SHARED-DATA-FILE LABEL RECORDS ARE STANDARD RECORDING MODE IS F ORGANIZATION IS SEQUENTIAL. 01 SHARED-DATA-RECORD. 05 RECORD-TYPE PIC X. 05 RECORD-DATA PIC X(99). 05 TIMESTAMP PIC 9(14). 05 SEQUENCE-NUMBER PIC 9(6). WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 END-OF-FILE PIC X VALUE 'N'. 88 EOF VALUE 'Y'. PROCEDURE DIVISION. READ-SHARED-DATA. OPEN INPUT SHARED-DATA-FILE PERFORM UNTIL EOF READ SHARED-DATA-FILE AT END SET EOF TO TRUE NOT AT END DISPLAY 'Record Type: ' RECORD-TYPE DISPLAY 'Data: ' RECORD-DATA DISPLAY 'Timestamp: ' TIMESTAMP DISPLAY 'Sequence: ' SEQUENCE-NUMBER DISPLAY '---' END-READ END-PERFORM CLOSE SHARED-DATA-FILE STOP RUN.
Message-based data sharing uses structured message formats to exchange data between programs. This approach is common in online environments like CICS, where programs communicate through message queues or transaction data areas.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253WORKING-STORAGE SECTION. 01 MESSAGE-HEADER. 05 MESSAGE-TYPE PIC X(10). 05 MESSAGE-LENGTH PIC 9(4). 05 MESSAGE-SEQUENCE PIC 9(6). 05 MESSAGE-TIMESTAMP PIC 9(14). 05 MESSAGE-SOURCE PIC X(8). 05 MESSAGE-DESTINATION PIC X(8). 01 MESSAGE-BODY. 05 CUSTOMER-DATA. 10 CUSTOMER-ID PIC 9(8). 10 CUSTOMER-NAME PIC X(30). 10 ACCOUNT-BALANCE PIC 9(9)V99. 05 TRANSACTION-DATA. 10 TRANSACTION-ID PIC 9(10). 10 TRANSACTION-TYPE PIC X(10). 10 TRANSACTION-AMOUNT PIC 9(9)V99. 10 TRANSACTION-DATE PIC 9(8). 01 MESSAGE-CONTROL. 05 MESSAGE-STATUS PIC X. 88 MSG-PENDING VALUE 'P'. 88 MSG-PROCESSED VALUE 'C'. 88 MSG-ERROR VALUE 'E'. 05 ERROR-CODE PIC 9(3). 05 ERROR-MESSAGE PIC X(50). PROCEDURE DIVISION. BUILD-MESSAGE. MOVE 'CUSTOMER' TO MESSAGE-TYPE MOVE 120 TO MESSAGE-LENGTH MOVE 1 TO MESSAGE-SEQUENCE MOVE FUNCTION CURRENT-DATE TO MESSAGE-TIMESTAMP MOVE 'PROG001' TO MESSAGE-SOURCE MOVE 'PROG002' TO MESSAGE-DESTINATION MOVE 12345678 TO CUSTOMER-ID MOVE 'JOHN SMITH' TO CUSTOMER-NAME MOVE 5000.00 TO ACCOUNT-BALANCE MOVE 2024000001 TO TRANSACTION-ID MOVE 'DEPOSIT' TO TRANSACTION-TYPE MOVE 500.00 TO TRANSACTION-AMOUNT MOVE 20240115 TO TRANSACTION-DATE SET MSG-PENDING TO TRUE MOVE 0 TO ERROR-CODE MOVE SPACES TO ERROR-MESSAGE DISPLAY 'Message built and ready for transmission' DISPLAY 'Message Type: ' MESSAGE-TYPE DISPLAY 'Customer: ' CUSTOMER-ID ' - ' CUSTOMER-NAME.
Follow these best practices to ensure reliable and maintainable data sharing:
Only use EXTERNAL for data that truly needs to be shared globally. Overuse of EXTERNAL can make programs tightly coupled and difficult to maintain. Consider:
Initialize EXTERNAL data in a single, well-documented location to avoid conflicts:
12345678910PROCEDURE DIVISION. INITIALIZE-EXTERNAL-DATA. *> Initialize only if not already initialized IF SHARED-INITIALIZED = 'N' MOVE FUNCTION CURRENT-DATE TO SHARED-SESSION-ID MOVE 0 TO SHARED-TRANSACTION-COUNTER MOVE 0 TO SHARED-ERROR-COUNT MOVE 'Y' TO SHARED-INITIALIZED DISPLAY 'External data initialized' END-IF.
Use clear, descriptive names that indicate shared data:
EXTERNAL- or SHARED-When multiple programs can modify shared data simultaneously, implement synchronization:
12345678910111213141516171819202122WORKING-STORAGE SECTION. 01 EXTERNAL-SHARED-DATA EXTERNAL. 05 SHARED-LOCK PIC X VALUE 'N'. 88 DATA-LOCKED VALUE 'Y'. 88 DATA-UNLOCKED VALUE 'N'. 05 SHARED-VALUE PIC 9(9)V99. PROCEDURE DIVISION. UPDATE-SHARED-DATA. *> Acquire lock PERFORM UNTIL DATA-UNLOCKED IF DATA-UNLOCKED MOVE 'Y' TO SHARED-LOCK EXIT PERFORM END-IF END-PERFORM *> Perform update ADD 100.00 TO SHARED-VALUE *> Release lock MOVE 'N' TO SHARED-LOCK.
Always validate shared data before use, as other programs may have modified it:
1234567891011121314151617PROCEDURE DIVISION. USE-SHARED-DATA. *> Validate before use IF SHARED-CUSTOMER-ID = 0 DISPLAY 'ERROR: Invalid customer ID' MOVE 1 TO RETURN-CODE EXIT PROGRAM END-IF IF SHARED-BALANCE < 0 DISPLAY 'ERROR: Negative balance detected' MOVE 2 TO RETURN-CODE EXIT PROGRAM END-IF *> Use validated data PERFORM PROCESS-CUSTOMER.
Document all data sharing relationships:
123456WORKING-STORAGE SECTION. 01 EXTERNAL-CONFIG EXTERNAL. 05 MAX-RECORDS PIC 9(6) VALUE 10000. 05 TIMEOUT-SECONDS PIC 9(4) VALUE 300. 05 DEBUG-MODE PIC X VALUE 'N'. 05 LOG-LEVEL PIC 9 VALUE 2.
All programs can access system configuration without passing it as parameters.
123456WORKING-STORAGE SECTION. 01 EXTERNAL-STATISTICS EXTERNAL. 05 TOTAL-TRANSACTIONS PIC 9(10) VALUE 0. 05 SUCCESSFUL-TRANS PIC 9(10) VALUE 0. 05 FAILED-TRANS PIC 9(8) VALUE 0. 05 TOTAL-PROCESSING-TIME PIC 9(8)V99 VALUE 0.
Multiple programs can update shared counters for system-wide statistics.
12345678WORKING-STORAGE SECTION. 01 EXTERNAL-SYSTEM-STATUS EXTERNAL. 05 SYSTEM-STATE PIC X(10). 88 SYSTEM-STARTING VALUE 'STARTING'. 88 SYSTEM-ACTIVE VALUE 'ACTIVE'. 88 SYSTEM-SHUTTING-DOWN VALUE 'SHUTDOWN'. 05 CURRENT-USER PIC X(8). 05 LAST-ERROR PIC X(50).
Programs can check and update system status for coordination.
Think of data sharing like a shared whiteboard:
Just like you need to coordinate when multiple people use the same whiteboard (so they don't write over each other), programs need to coordinate when sharing data to avoid conflicts!
Complete these exercises to reinforce your understanding:
Create two programs: a main program that initializes EXTERNAL customer data (ID, name, balance), and a subprogram that reads and modifies the balance. Display the balance in both programs to verify sharing works.
Create a calling program that passes customer ID and transaction amount to a called program. The called program should validate the transaction, update a balance, and return a return code and message through LINKAGE SECTION.
Create a program that writes customer records to a shared file, and another program that reads from that file and displays the records. Include proper error handling and file status checking.
Create an EXTERNAL configuration area with system settings (max records, timeout, debug mode). Create multiple programs that read and use this configuration, and one program that initializes it.
Create a shared counter with a lock mechanism. Have multiple programs attempt to increment the counter, using the lock to prevent race conditions. Display the final counter value to verify all updates were applied.
1. What does the EXTERNAL attribute do in COBOL?
2. Where do you define parameters passed between programs?
3. What is the main difference between EXTERNAL and LINKAGE SECTION?
4. When should you use file-based data sharing?
5. What happens if multiple programs modify EXTERNAL data simultaneously?
6. How do you pass data from a calling program to a called program?