The LINKAGE SECTION represents sophisticated parameter passing and data sharing mechanisms within COBOL modular programming environments, providing comprehensive inter-program communication capabilities, efficient data exchange protocols, and advanced memory management that enable seamless program integration, reliable parameter transmission, and optimized resource utilization. This section embodies advanced programming principles by supporting dynamic data referencing, enabling sophisticated program collaboration, and facilitating comprehensive modular architecture requirements while maintaining data integrity, ensuring efficient memory usage, and enabling complex application scenarios across enterprise environments requiring detailed program communication, automated parameter management, and reliable data sharing with optimized performance characteristics and consistent interface standards throughout the application ecosystem.
12345678910111213141516171819202122232425262728293031DATA DIVISION. LINKAGE SECTION. 01 parameter-name-1 PIC clause. 01 parameter-name-2. 05 field-1 PIC clause. 05 field-2 PIC clause. *> Called program structure PROCEDURE DIVISION USING parameter-name-1 parameter-name-2. *> Calling program CALL 'SUBPROGRAM' USING data-item-1 data-item-2. *> Complete example: DATA DIVISION. LINKAGE SECTION. 01 LK-EMPLOYEE-ID PIC 9(6). 01 LK-EMPLOYEE-RECORD. 05 LK-EMP-NAME PIC X(30). 05 LK-EMP-SALARY PIC 9(7)V99. 05 LK-EMP-STATUS PIC X(10). 01 LK-RETURN-CODE PIC 9(2). PROCEDURE DIVISION USING LK-EMPLOYEE-ID LK-EMPLOYEE-RECORD LK-RETURN-CODE. *> Alternative with BY REFERENCE/CONTENT PROCEDURE DIVISION USING BY REFERENCE LK-EMPLOYEE-ID BY CONTENT LK-EMPLOYEE-RECORD BY REFERENCE LK-RETURN-CODE.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413*> MAIN CALLING PROGRAM IDENTIFICATION DIVISION. PROGRAM-ID. LINKAGE-CALLER. DATA DIVISION. WORKING-STORAGE SECTION. *> Data to be passed to subprograms 01 WS-EMPLOYEE-DATA. 05 WS-EMP-ID PIC 9(6) VALUE 123456. 05 WS-EMP-RECORD. 10 WS-EMP-NAME PIC X(30) VALUE "JOHN SMITH". 10 WS-EMP-DEPT PIC X(15) VALUE "SALES". 10 WS-EMP-SALARY PIC 9(7)V99 VALUE 65000.50. 10 WS-EMP-STATUS PIC X(10) VALUE "ACTIVE". 05 WS-EMP-ADDRESS. 10 WS-STREET PIC X(30) VALUE "123 MAIN ST". 10 WS-CITY PIC X(20) VALUE "ANYTOWN". 10 WS-STATE PIC X(2) VALUE "NY". 10 WS-ZIP PIC 9(5) VALUE 12345. *> Communication variables 01 WS-OPERATION-TYPE PIC X(10). 01 WS-RETURN-CODE PIC 9(2). 01 WS-ERROR-MESSAGE PIC X(80). *> Calculation results 01 WS-CALCULATION-RESULTS. 05 WS-ANNUAL-SALARY PIC 9(8)V99. 05 WS-TAX-AMOUNT PIC 9(7)V99. 05 WS-NET-SALARY PIC 9(8)V99. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== LINKAGE SECTION DEMONSTRATION ===" DISPLAY SPACES PERFORM DEMONSTRATE-EMPLOYEE-PROCESSING PERFORM DEMONSTRATE-CALCULATION-CALLS PERFORM DEMONSTRATE-VALIDATION-CALLS PERFORM DEMONSTRATE-UTILITY-CALLS DISPLAY "=== LINKAGE DEMO COMPLETE ===" STOP RUN. DEMONSTRATE-EMPLOYEE-PROCESSING. DISPLAY "=== EMPLOYEE PROCESSING WITH LINKAGE ===" *> Call employee validation MOVE "VALIDATE" TO WS-OPERATION-TYPE CALL 'EMP-VALIDATE' USING WS-EMP-ID WS-EMP-RECORD WS-OPERATION-TYPE WS-RETURN-CODE WS-ERROR-MESSAGE IF WS-RETURN-CODE = 0 DISPLAY "Employee validation successful" PERFORM CALL-EMPLOYEE-UPDATE ELSE DISPLAY "Employee validation failed: " WS-ERROR-MESSAGE END-IF DISPLAY SPACES. CALL-EMPLOYEE-UPDATE. MOVE "UPDATE" TO WS-OPERATION-TYPE CALL 'EMP-UPDATE' USING WS-EMP-ID WS-EMP-RECORD WS-EMP-ADDRESS WS-OPERATION-TYPE WS-RETURN-CODE IF WS-RETURN-CODE = 0 DISPLAY "Employee update successful" ELSE DISPLAY "Employee update failed with code: " WS-RETURN-CODE END-IF. DEMONSTRATE-CALCULATION-CALLS. DISPLAY "=== CALCULATION CALLS WITH LINKAGE ===" *> Call salary calculation CALL 'SALARY-CALC' USING WS-EMP-SALARY WS-ANNUAL-SALARY WS-TAX-AMOUNT WS-NET-SALARY WS-RETURN-CODE IF WS-RETURN-CODE = 0 DISPLAY "Salary calculations:" DISPLAY " Annual: $" WS-ANNUAL-SALARY DISPLAY " Tax: $" WS-TAX-AMOUNT DISPLAY " Net: $" WS-NET-SALARY ELSE DISPLAY "Calculation failed with code: " WS-RETURN-CODE END-IF DISPLAY SPACES. DEMONSTRATE-VALIDATION-CALLS. DISPLAY "=== VALIDATION CALLS WITH LINKAGE ===" *> Call address validation CALL 'ADDR-VALIDATE' USING WS-EMP-ADDRESS WS-RETURN-CODE WS-ERROR-MESSAGE EVALUATE WS-RETURN-CODE WHEN 0 DISPLAY "Address validation passed" WHEN 1 DISPLAY "Address warning: " WS-ERROR-MESSAGE WHEN OTHER DISPLAY "Address validation failed: " WS-ERROR-MESSAGE END-EVALUATE DISPLAY SPACES. DEMONSTRATE-UTILITY-CALLS. DISPLAY "=== UTILITY CALLS WITH LINKAGE ===" *> Call string utilities CALL 'STRING-UTIL' USING WS-EMP-NAME WS-OPERATION-TYPE WS-RETURN-CODE DISPLAY "String utility completed with code: " WS-RETURN-CODE DISPLAY SPACES. *> ================================================== *> EMPLOYEE VALIDATION SUBPROGRAM *> ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. EMP-VALIDATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VALIDATION-RULES. 05 WS-MIN-ID PIC 9(6) VALUE 100000. 05 WS-MAX-ID PIC 9(6) VALUE 999999. 05 WS-MIN-SALARY PIC 9(7)V99 VALUE 20000.00. 05 WS-MAX-SALARY PIC 9(7)V99 VALUE 200000.00. 01 WS-VALIDATION-FLAGS. 05 WS-ID-VALID PIC X VALUE 'Y'. 05 WS-NAME-VALID PIC X VALUE 'Y'. 05 WS-SALARY-VALID PIC X VALUE 'Y'. 05 WS-STATUS-VALID PIC X VALUE 'Y'. LINKAGE SECTION. 01 LK-EMPLOYEE-ID PIC 9(6). 01 LK-EMPLOYEE-RECORD. 05 LK-EMP-NAME PIC X(30). 05 LK-EMP-DEPT PIC X(15). 05 LK-EMP-SALARY PIC 9(7)V99. 05 LK-EMP-STATUS PIC X(10). 01 LK-OPERATION PIC X(10). 01 LK-RETURN-CODE PIC 9(2). 01 LK-ERROR-MESSAGE PIC X(80). PROCEDURE DIVISION USING LK-EMPLOYEE-ID LK-EMPLOYEE-RECORD LK-OPERATION LK-RETURN-CODE LK-ERROR-MESSAGE. VALIDATION-MAIN. MOVE 0 TO LK-RETURN-CODE MOVE SPACES TO LK-ERROR-MESSAGE EVALUATE LK-OPERATION WHEN "VALIDATE" PERFORM VALIDATE-EMPLOYEE-DATA WHEN "QUICK" PERFORM QUICK-VALIDATION WHEN OTHER MOVE 99 TO LK-RETURN-CODE MOVE "INVALID OPERATION" TO LK-ERROR-MESSAGE END-EVALUATE GOBACK. VALIDATE-EMPLOYEE-DATA. PERFORM VALIDATE-EMPLOYEE-ID PERFORM VALIDATE-EMPLOYEE-NAME PERFORM VALIDATE-EMPLOYEE-SALARY PERFORM VALIDATE-EMPLOYEE-STATUS IF WS-ID-VALID = 'N' OR WS-NAME-VALID = 'N' OR WS-SALARY-VALID = 'N' OR WS-STATUS-VALID = 'N' MOVE 1 TO LK-RETURN-CODE MOVE "VALIDATION FAILED" TO LK-ERROR-MESSAGE END-IF. VALIDATE-EMPLOYEE-ID. IF LK-EMPLOYEE-ID < WS-MIN-ID OR LK-EMPLOYEE-ID > WS-MAX-ID MOVE 'N' TO WS-ID-VALID MOVE "INVALID EMPLOYEE ID RANGE" TO LK-ERROR-MESSAGE MOVE 2 TO LK-RETURN-CODE END-IF. VALIDATE-EMPLOYEE-NAME. IF LK-EMP-NAME = SPACES MOVE 'N' TO WS-NAME-VALID MOVE "EMPLOYEE NAME REQUIRED" TO LK-ERROR-MESSAGE MOVE 3 TO LK-RETURN-CODE END-IF. VALIDATE-EMPLOYEE-SALARY. IF LK-EMP-SALARY < WS-MIN-SALARY OR LK-EMP-SALARY > WS-MAX-SALARY MOVE 'N' TO WS-SALARY-VALID MOVE "SALARY OUT OF VALID RANGE" TO LK-ERROR-MESSAGE MOVE 4 TO LK-RETURN-CODE END-IF. VALIDATE-EMPLOYEE-STATUS. IF LK-EMP-STATUS NOT = "ACTIVE" AND LK-EMP-STATUS NOT = "INACTIVE" MOVE 'N' TO WS-STATUS-VALID MOVE "INVALID EMPLOYEE STATUS" TO LK-ERROR-MESSAGE MOVE 5 TO LK-RETURN-CODE END-IF. QUICK-VALIDATION. IF LK-EMPLOYEE-ID > 0 AND LK-EMP-NAME NOT = SPACES MOVE 0 TO LK-RETURN-CODE ELSE MOVE 1 TO LK-RETURN-CODE MOVE "QUICK VALIDATION FAILED" TO LK-ERROR-MESSAGE END-IF. *> ================================================== *> SALARY CALCULATION SUBPROGRAM *> ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. SALARY-CALC. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TAX-RATES. 05 WS-FEDERAL-RATE PIC 9V9999 VALUE 0.2200. 05 WS-STATE-RATE PIC 9V9999 VALUE 0.0650. 05 WS-FICA-RATE PIC 9V9999 VALUE 0.0765. 01 WS-CALCULATION-WORK. 05 WS-FEDERAL-TAX PIC 9(7)V99. 05 WS-STATE-TAX PIC 9(6)V99. 05 WS-FICA-TAX PIC 9(6)V99. 05 WS-TOTAL-TAX PIC 9(7)V99. LINKAGE SECTION. 01 LK-MONTHLY-SALARY PIC 9(7)V99. 01 LK-ANNUAL-SALARY PIC 9(8)V99. 01 LK-TAX-AMOUNT PIC 9(7)V99. 01 LK-NET-SALARY PIC 9(8)V99. 01 LK-RETURN-CODE PIC 9(2). PROCEDURE DIVISION USING LK-MONTHLY-SALARY LK-ANNUAL-SALARY LK-TAX-AMOUNT LK-NET-SALARY LK-RETURN-CODE. CALCULATION-MAIN. MOVE 0 TO LK-RETURN-CODE IF LK-MONTHLY-SALARY <= 0 MOVE 1 TO LK-RETURN-CODE GOBACK END-IF PERFORM CALCULATE-ANNUAL-SALARY PERFORM CALCULATE-TAXES PERFORM CALCULATE-NET-SALARY GOBACK. CALCULATE-ANNUAL-SALARY. MULTIPLY LK-MONTHLY-SALARY BY 12 GIVING LK-ANNUAL-SALARY. CALCULATE-TAXES. COMPUTE WS-FEDERAL-TAX = LK-ANNUAL-SALARY * WS-FEDERAL-RATE COMPUTE WS-STATE-TAX = LK-ANNUAL-SALARY * WS-STATE-RATE COMPUTE WS-FICA-TAX = LK-ANNUAL-SALARY * WS-FICA-RATE ADD WS-FEDERAL-TAX WS-STATE-TAX WS-FICA-TAX GIVING LK-TAX-AMOUNT. CALCULATE-NET-SALARY. SUBTRACT LK-TAX-AMOUNT FROM LK-ANNUAL-SALARY GIVING LK-NET-SALARY. *> ================================================== *> ADDRESS VALIDATION SUBPROGRAM *> ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. ADDR-VALIDATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VALID-STATES. 05 WS-STATE-TABLE. 10 FILLER PIC X(2) VALUE "AL". 10 FILLER PIC X(2) VALUE "AK". 10 FILLER PIC X(2) VALUE "AZ". 10 FILLER PIC X(2) VALUE "CA". 10 FILLER PIC X(2) VALUE "NY". 10 FILLER PIC X(2) VALUE "TX". 05 WS-STATE-ENTRY REDEFINES WS-STATE-TABLE OCCURS 6 TIMES PIC X(2). 01 WS-VALIDATION-WORK. 05 WS-STATE-INDEX PIC 9(2). 05 WS-STATE-FOUND PIC X VALUE 'N'. LINKAGE SECTION. 01 LK-ADDRESS. 05 LK-STREET PIC X(30). 05 LK-CITY PIC X(20). 05 LK-STATE PIC X(2). 05 LK-ZIP PIC 9(5). 01 LK-RETURN-CODE PIC 9(2). 01 LK-ERROR-MESSAGE PIC X(80). PROCEDURE DIVISION USING LK-ADDRESS LK-RETURN-CODE LK-ERROR-MESSAGE. ADDRESS-VALIDATION-MAIN. MOVE 0 TO LK-RETURN-CODE MOVE SPACES TO LK-ERROR-MESSAGE PERFORM VALIDATE-STREET PERFORM VALIDATE-CITY PERFORM VALIDATE-STATE PERFORM VALIDATE-ZIP GOBACK. VALIDATE-STREET. IF LK-STREET = SPACES MOVE 1 TO LK-RETURN-CODE MOVE "STREET ADDRESS REQUIRED" TO LK-ERROR-MESSAGE END-IF. VALIDATE-CITY. IF LK-CITY = SPACES MOVE 2 TO LK-RETURN-CODE MOVE "CITY REQUIRED" TO LK-ERROR-MESSAGE END-IF. VALIDATE-STATE. MOVE 'N' TO WS-STATE-FOUND PERFORM VARYING WS-STATE-INDEX FROM 1 BY 1 UNTIL WS-STATE-INDEX > 6 OR WS-STATE-FOUND = 'Y' IF LK-STATE = WS-STATE-ENTRY(WS-STATE-INDEX) MOVE 'Y' TO WS-STATE-FOUND END-IF END-PERFORM IF WS-STATE-FOUND = 'N' MOVE 3 TO LK-RETURN-CODE MOVE "INVALID STATE CODE" TO LK-ERROR-MESSAGE END-IF. VALIDATE-ZIP. IF LK-ZIP = 0 MOVE 4 TO LK-RETURN-CODE MOVE "ZIP CODE REQUIRED" TO LK-ERROR-MESSAGE END-IF. *> ================================================== *> STRING UTILITY SUBPROGRAM *> ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. STRING-UTIL. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STRING-WORK. 05 WS-WORK-STRING PIC X(100). 05 WS-STRING-LENGTH PIC 9(3). 05 WS-CHAR-INDEX PIC 9(3). LINKAGE SECTION. 01 LK-INPUT-STRING PIC X(30). 01 LK-OPERATION PIC X(10). 01 LK-RETURN-CODE PIC 9(2). PROCEDURE DIVISION USING LK-INPUT-STRING LK-OPERATION LK-RETURN-CODE. STRING-UTILITY-MAIN. MOVE 0 TO LK-RETURN-CODE EVALUATE LK-OPERATION WHEN "UPPERCASE" PERFORM CONVERT-TO-UPPERCASE WHEN "LOWERCASE" PERFORM CONVERT-TO-LOWERCASE WHEN "TRIM" PERFORM TRIM-SPACES WHEN OTHER MOVE 1 TO LK-RETURN-CODE END-EVALUATE GOBACK. CONVERT-TO-UPPERCASE. INSPECT LK-INPUT-STRING CONVERTING "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ". CONVERT-TO-LOWERCASE. INSPECT LK-INPUT-STRING CONVERTING "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz". TRIM-SPACES. MOVE FUNCTION TRIM(LK-INPUT-STRING) TO LK-INPUT-STRING.
123456789101112131415161718192021222324252627282930*> Main Program DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUMBER-1 PIC 9(5) VALUE 100. 01 WS-NUMBER-2 PIC 9(5) VALUE 50. 01 WS-RESULT PIC 9(6). PROCEDURE DIVISION. MAIN-PROGRAM. CALL 'CALCULATOR' USING WS-NUMBER-1 WS-NUMBER-2 WS-RESULT DISPLAY "Result: " WS-RESULT STOP RUN. *> Called Program - CALCULATOR IDENTIFICATION DIVISION. PROGRAM-ID. CALCULATOR. DATA DIVISION. LINKAGE SECTION. 01 LK-NUM-1 PIC 9(5). 01 LK-NUM-2 PIC 9(5). 01 LK-RESULT PIC 9(6). PROCEDURE DIVISION USING LK-NUM-1 LK-NUM-2 LK-RESULT. CALCULATE-SUM. ADD LK-NUM-1 TO LK-NUM-2 GIVING LK-RESULT GOBACK.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647*> Main Program DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CUSTOMER-DATA. 05 WS-CUST-ID PIC 9(6) VALUE 123456. 05 WS-CUST-NAME PIC X(30) VALUE "JANE DOE". 05 WS-BALANCE PIC 9(8)V99 VALUE 1500.75. 01 WS-STATUS-CODE PIC 9(2). PROCEDURE DIVISION. MAIN-PROGRAM. CALL 'CUST-PROCESS' USING WS-CUSTOMER-DATA WS-STATUS-CODE IF WS-STATUS-CODE = 0 DISPLAY "Customer processing successful" ELSE DISPLAY "Processing failed: " WS-STATUS-CODE END-IF STOP RUN. *> Called Program - CUST-PROCESS IDENTIFICATION DIVISION. PROGRAM-ID. CUST-PROCESS. DATA DIVISION. LINKAGE SECTION. 01 LK-CUSTOMER. 05 LK-CUST-ID PIC 9(6). 05 LK-CUST-NAME PIC X(30). 05 LK-BALANCE PIC 9(8)V99. 01 LK-STATUS PIC 9(2). PROCEDURE DIVISION USING LK-CUSTOMER LK-STATUS. PROCESS-CUSTOMER. MOVE 0 TO LK-STATUS IF LK-CUST-ID = 0 MOVE 1 TO LK-STATUS GOBACK END-IF IF LK-BALANCE < 0 MOVE 2 TO LK-STATUS END-IF GOBACK.
How does storage work for LINKAGE SECTION items?
Answer: LINKAGE SECTION items don't have their own storage allocation. They reference storage allocated in the calling program, enabling efficient parameter passing without data copying (when using BY REFERENCE).
What's the difference between BY REFERENCE and BY CONTENT?
Answer: BY REFERENCE (default) passes the address of the data, allowing modifications to affect the calling program. BY CONTENT passes a copy of the data, so modifications don't affect the original.
What are common uses for LINKAGE SECTION in business applications?
Answer: Common uses include: validation routines, calculation modules, database access routines, utility functions, error handling procedures, and any reusable business logic that needs to operate on calling program data.