The CHAIN and CHAINING statements in COBOL provide powerful program control transfer mechanisms that enable one program to transfer control to another program while preserving data and execution context. These statements are essential for modular programming, system integration, workflow management, and building complex application architectures where programs need to pass control and data between different modules in a structured and efficient manner while maintaining program state and parameter continuity across program boundaries.
CHAIN transfers control from the current program to another program, effectively replacing the current program in memory. CHAINING refers to the overall concept of linking programs together in a sequence. Unlike CALL, CHAIN does not return control to the calling program.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152*> Basic CHAIN statement usage DATA DIVISION. WORKING-STORAGE SECTION. 01 CHAIN-PARAMETERS. 05 NEXT-PROGRAM PIC X(8) VALUE "PROG002". 05 CHAIN-DATA PIC X(100). 05 PROCESS-STATUS PIC X VALUE 'A'. 88 CONTINUE-PROCESSING VALUE 'A'. 88 END-PROCESSING VALUE 'Z'. 01 PROGRAM-CONTROL. 05 CURRENT-STEP PIC 9(2) VALUE 1. 05 TOTAL-STEPS PIC 9(2) VALUE 5. 05 ERROR-FLAG PIC X VALUE 'N'. 88 ERROR-OCCURRED VALUE 'Y'. PROCEDURE DIVISION. MAIN-PROGRAM-LOGIC. PERFORM INITIALIZE-PROCESSING PERFORM PROCESS-CURRENT-STEP IF CONTINUE-PROCESSING AND NOT ERROR-OCCURRED PERFORM PREPARE-CHAIN-DATA PERFORM CHAIN-TO-NEXT-PROGRAM ELSE PERFORM END-PROGRAM-PROCESSING END-IF. PROCESS-CURRENT-STEP. DISPLAY "Processing step: " CURRENT-STEP EVALUATE CURRENT-STEP WHEN 1 PERFORM VALIDATE-INPUT-DATA WHEN 2 PERFORM CALCULATE-RESULTS WHEN 3 PERFORM UPDATE-DATABASE WHEN OTHER PERFORM FINALIZE-PROCESSING END-EVALUATE. PREPARE-CHAIN-DATA. STRING "STEP=" CURRENT-STEP ",STATUS=" PROCESS-STATUS ",DATA=" WS-CALCULATED-VALUE DELIMITED BY SIZE INTO CHAIN-DATA END-STRING. CHAIN-TO-NEXT-PROGRAM. DISPLAY "Chaining to program: " NEXT-PROGRAM CHAIN NEXT-PROGRAM USING CHAIN-DATA.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122*> Advanced program chaining with complex data structures DATA DIVISION. WORKING-STORAGE SECTION. 01 CHAINING-CONTROL-BLOCK. 05 CCB-SIGNATURE PIC X(4) VALUE "CCB1". 05 CCB-VERSION PIC 9(2) VALUE 01. 05 CCB-PROGRAM-COUNT PIC 9(3) VALUE ZERO. 05 CCB-CURRENT-PROG PIC 9(3) VALUE 1. 05 CCB-STATUS PIC X(2) VALUE "OK". 05 CCB-ERROR-CODE PIC 9(4) VALUE ZERO. 01 PROGRAM-CHAIN-TABLE. 05 CHAIN-PROGRAMS OCCURS 10 TIMES. 10 PROG-NAME PIC X(8). 10 PROG-FUNCTION PIC X(20). 10 PROG-STATUS PIC X(1). 88 PROG-PENDING VALUE 'P'. 88 PROG-RUNNING VALUE 'R'. 88 PROG-COMPLETED VALUE 'C'. 88 PROG-ERROR VALUE 'E'. 10 PROG-PRIORITY PIC 9(2). 01 SHARED-DATA-AREA. 05 SDA-CUSTOMER-DATA. 10 CUSTOMER-ID PIC 9(8). 10 CUSTOMER-NAME PIC X(30). 10 CUSTOMER-TYPE PIC X(3). 05 SDA-TRANSACTION-DATA. 10 TRANS-COUNT PIC 9(5). 10 TRANS-AMOUNT PIC S9(9)V99 COMP-3. 10 TRANS-DATE PIC 9(8). 05 SDA-CONTROL-INFO. 10 PROCESSING-MODE PIC X(10). 10 BATCH-NUMBER PIC 9(6). 10 RUN-DATE PIC 9(8). PROCEDURE DIVISION. ADVANCED-CHAINING-CONTROL. PERFORM INITIALIZE-CHAIN-TABLE PERFORM SETUP-SHARED-DATA PERFORM EXECUTE-PROGRAM-CHAIN. INITIALIZE-CHAIN-TABLE. *> Set up the program execution sequence MOVE "VALIDATE" TO PROG-NAME(1) MOVE "Input Validation" TO PROG-FUNCTION(1) MOVE 'P' TO PROG-STATUS(1) MOVE 10 TO PROG-PRIORITY(1) MOVE "PROCESS1" TO PROG-NAME(2) MOVE "Data Processing" TO PROG-FUNCTION(2) MOVE 'P' TO PROG-STATUS(2) MOVE 20 TO PROG-PRIORITY(2) MOVE "PROCESS2" TO PROG-NAME(3) MOVE "Business Logic" TO PROG-FUNCTION(3) MOVE 'P' TO PROG-STATUS(3) MOVE 30 TO PROG-PRIORITY(3) MOVE "REPORT" TO PROG-NAME(4) MOVE "Report Generation" TO PROG-FUNCTION(4) MOVE 'P' TO PROG-STATUS(4) MOVE 40 TO PROG-PRIORITY(4) MOVE 4 TO CCB-PROGRAM-COUNT. SETUP-SHARED-DATA. *> Initialize shared data for the chain MOVE 12345678 TO CUSTOMER-ID MOVE "ACME CORPORATION" TO CUSTOMER-NAME MOVE "BUS" TO CUSTOMER-TYPE MOVE 150 TO TRANS-COUNT MOVE 250000.00 TO TRANS-AMOUNT MOVE FUNCTION CURRENT-DATE(1:8) TO TRANS-DATE MOVE "BATCH" TO PROCESSING-MODE MOVE 123456 TO BATCH-NUMBER MOVE FUNCTION CURRENT-DATE(1:8) TO RUN-DATE. EXECUTE-PROGRAM-CHAIN. PERFORM VARYING CCB-CURRENT-PROG FROM 1 BY 1 UNTIL CCB-CURRENT-PROG > CCB-PROGRAM-COUNT OR CCB-STATUS NOT = "OK" PERFORM PREPARE-PROGRAM-EXECUTION PERFORM CHAIN-TO-CURRENT-PROGRAM END-PERFORM. PREPARE-PROGRAM-EXECUTION. MOVE 'R' TO PROG-STATUS(CCB-CURRENT-PROG) DISPLAY "Executing program: " PROG-NAME(CCB-CURRENT-PROG) DISPLAY "Function: " PROG-FUNCTION(CCB-CURRENT-PROG) DISPLAY "Priority: " PROG-PRIORITY(CCB-CURRENT-PROG). CHAIN-TO-CURRENT-PROGRAM. *> Pass control and data to the next program EVALUATE CCB-CURRENT-PROG WHEN 1 CHAIN "VALIDATE" USING CHAINING-CONTROL-BLOCK SHARED-DATA-AREA WHEN 2 CHAIN "PROCESS1" USING CHAINING-CONTROL-BLOCK SHARED-DATA-AREA WHEN 3 CHAIN "PROCESS2" USING CHAINING-CONTROL-BLOCK SHARED-DATA-AREA WHEN 4 CHAIN "REPORT" USING CHAINING-CONTROL-BLOCK SHARED-DATA-AREA WHEN OTHER MOVE "ER" TO CCB-STATUS MOVE 9999 TO CCB-ERROR-CODE END-EVALUATE.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170*> Workflow management using program chaining DATA DIVISION. WORKING-STORAGE SECTION. 01 WORKFLOW-CONTROL. 05 WF-ID PIC 9(8). 05 WF-NAME PIC X(30). 05 WF-STATUS PIC X(10). 88 WF-ACTIVE VALUE "ACTIVE". 88 WF-SUSPENDED VALUE "SUSPENDED". 88 WF-COMPLETED VALUE "COMPLETED". 88 WF-ERROR VALUE "ERROR". 05 WF-CURRENT-STEP PIC 9(3). 05 WF-TOTAL-STEPS PIC 9(3). 05 WF-START-TIME PIC X(26). 05 WF-END-TIME PIC X(26). 01 WORKFLOW-STEPS. 05 STEP-DEFINITIONS OCCURS 50 TIMES. 10 STEP-NUMBER PIC 9(3). 10 STEP-NAME PIC X(20). 10 STEP-PROGRAM PIC X(8). 10 STEP-TYPE PIC X(10). 88 STEP-PROCESS VALUE "PROCESS". 88 STEP-DECISION VALUE "DECISION". 88 STEP-MANUAL VALUE "MANUAL". 88 STEP-AUTOMATED VALUE "AUTOMATED". 10 STEP-STATUS PIC X(10). 10 STEP-DURATION PIC 9(5). 10 STEP-RETRY-COUNT PIC 9(2). 01 BUSINESS-PROCESS-DATA. 05 ORDER-INFORMATION. 10 ORDER-ID PIC 9(10). 10 ORDER-DATE PIC 9(8). 10 ORDER-VALUE PIC S9(9)V99 COMP-3. 10 ORDER-STATUS PIC X(10). 05 APPROVAL-CHAIN. 10 APPROVAL-LEVEL PIC 9(2). 10 APPROVER-ID PIC X(8). 10 APPROVAL-DATE PIC 9(8). 10 APPROVAL-STATUS PIC X(10). PROCEDURE DIVISION. WORKFLOW-MANAGEMENT-SYSTEM. PERFORM INITIALIZE-WORKFLOW PERFORM DEFINE-WORKFLOW-STEPS PERFORM EXECUTE-WORKFLOW-CHAIN. INITIALIZE-WORKFLOW. MOVE 20231001 TO WF-ID MOVE "ORDER-PROCESSING-WORKFLOW" TO WF-NAME MOVE "ACTIVE" TO WF-STATUS MOVE 1 TO WF-CURRENT-STEP MOVE 8 TO WF-TOTAL-STEPS MOVE FUNCTION CURRENT-DATE TO WF-START-TIME. DEFINE-WORKFLOW-STEPS. *> Step 1: Order Validation MOVE 1 TO STEP-NUMBER(1) MOVE "Order Validation" TO STEP-NAME(1) MOVE "ORDVAL" TO STEP-PROGRAM(1) MOVE "AUTOMATED" TO STEP-TYPE(1) MOVE "PENDING" TO STEP-STATUS(1) *> Step 2: Credit Check MOVE 2 TO STEP-NUMBER(2) MOVE "Credit Check" TO STEP-NAME(2) MOVE "CREDCHK" TO STEP-PROGRAM(2) MOVE "AUTOMATED" TO STEP-TYPE(2) MOVE "PENDING" TO STEP-STATUS(2) *> Step 3: Inventory Check MOVE 3 TO STEP-NUMBER(3) MOVE "Inventory Check" TO STEP-NAME(3) MOVE "INVCHK" TO STEP-PROGRAM(3) MOVE "AUTOMATED" TO STEP-TYPE(3) MOVE "PENDING" TO STEP-STATUS(3) *> Step 4: Approval Process MOVE 4 TO STEP-NUMBER(4) MOVE "Approval Process" TO STEP-NAME(4) MOVE "APPROVE" TO STEP-PROGRAM(4) MOVE "DECISION" TO STEP-TYPE(4) MOVE "PENDING" TO STEP-STATUS(4) *> Step 5: Order Fulfillment MOVE 5 TO STEP-NUMBER(5) MOVE "Order Fulfillment" TO STEP-NAME(5) MOVE "FULFILL" TO STEP-PROGRAM(5) MOVE "PROCESS" TO STEP-TYPE(5) MOVE "PENDING" TO STEP-STATUS(5) *> Step 6: Shipping MOVE 6 TO STEP-NUMBER(6) MOVE "Shipping Process" TO STEP-NAME(6) MOVE "SHIP" TO STEP-PROGRAM(6) MOVE "PROCESS" TO STEP-TYPE(6) MOVE "PENDING" TO STEP-STATUS(6) *> Step 7: Invoice Generation MOVE 7 TO STEP-NUMBER(7) MOVE "Invoice Generation" TO STEP-NAME(7) MOVE "INVOICE" TO STEP-PROGRAM(7) MOVE "AUTOMATED" TO STEP-TYPE(7) MOVE "PENDING" TO STEP-STATUS(7) *> Step 8: Completion MOVE 8 TO STEP-NUMBER(8) MOVE "Order Completion" TO STEP-NAME(8) MOVE "COMPLETE" TO STEP-PROGRAM(8) MOVE "AUTOMATED" TO STEP-TYPE(8) MOVE "PENDING" TO STEP-STATUS(8). EXECUTE-WORKFLOW-CHAIN. PERFORM VARYING WF-CURRENT-STEP FROM 1 BY 1 UNTIL WF-CURRENT-STEP > WF-TOTAL-STEPS OR WF-ERROR PERFORM LOG-WORKFLOW-STEP PERFORM EXECUTE-CURRENT-STEP PERFORM UPDATE-STEP-STATUS IF WF-ERROR PERFORM HANDLE-WORKFLOW-ERROR EXIT PERFORM END-IF END-PERFORM IF NOT WF-ERROR PERFORM COMPLETE-WORKFLOW END-IF. EXECUTE-CURRENT-STEP. MOVE "RUNNING" TO STEP-STATUS(WF-CURRENT-STEP) DISPLAY "Executing workflow step: " WF-CURRENT-STEP DISPLAY "Step name: " STEP-NAME(WF-CURRENT-STEP) DISPLAY "Program: " STEP-PROGRAM(WF-CURRENT-STEP) *> Chain to the appropriate program for this step EVALUATE WF-CURRENT-STEP WHEN 1 THRU 8 CHAIN STEP-PROGRAM(WF-CURRENT-STEP) USING WORKFLOW-CONTROL WORKFLOW-STEPS BUSINESS-PROCESS-DATA WHEN OTHER MOVE "ERROR" TO WF-STATUS END-EVALUATE. LOG-WORKFLOW-STEP. DISPLAY "=== Workflow Step Execution ===" DISPLAY "Workflow ID: " WF-ID DISPLAY "Workflow Name: " WF-NAME DISPLAY "Current Step: " WF-CURRENT-STEP " of " WF-TOTAL-STEPS DISPLAY "Step Name: " STEP-NAME(WF-CURRENT-STEP) DISPLAY "Step Type: " STEP-TYPE(WF-CURRENT-STEP). UPDATE-STEP-STATUS. MOVE "COMPLETED" TO STEP-STATUS(WF-CURRENT-STEP) ADD 1 TO WF-CURRENT-STEP. COMPLETE-WORKFLOW. MOVE "COMPLETED" TO WF-STATUS MOVE FUNCTION CURRENT-DATE TO WF-END-TIME DISPLAY "=== Workflow Completed ===" DISPLAY "Workflow ID: " WF-ID DISPLAY "Start Time: " WF-START-TIME DISPLAY "End Time: " WF-END-TIME.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153*> Error handling and recovery in program chains DATA DIVISION. WORKING-STORAGE SECTION. 01 ERROR-RECOVERY-CONTROL. 05 ERROR-HANDLER-PROG PIC X(8) VALUE "ERRHAND". 05 RECOVERY-PROG PIC X(8) VALUE "RECOVERY". 05 ROLLBACK-PROG PIC X(8) VALUE "ROLLBACK". 05 AUDIT-PROG PIC X(8) VALUE "AUDIT". 01 ERROR-INFORMATION. 05 ERROR-CODE PIC 9(4). 05 ERROR-MESSAGE PIC X(80). 05 ERROR-SEVERITY PIC X(10). 88 FATAL-ERROR VALUE "FATAL". 88 WARNING-ERROR VALUE "WARNING". 88 INFO-ERROR VALUE "INFO". 05 ERROR-PROGRAM PIC X(8). 05 ERROR-TIMESTAMP PIC X(26). 05 ERROR-USER-ID PIC X(8). 01 RECOVERY-OPTIONS. 05 RECOVERY-ACTION PIC X(10). 88 RETRY-OPERATION VALUE "RETRY". 88 SKIP-STEP VALUE "SKIP". 88 ABORT-CHAIN VALUE "ABORT". 88 MANUAL-INTERVENTION VALUE "MANUAL". 05 RETRY-COUNT PIC 9(2) VALUE ZERO. 05 MAX-RETRIES PIC 9(2) VALUE 3. 01 CHECKPOINT-DATA. 05 CHECKPOINT-ID PIC 9(8). 05 CHECKPOINT-STATUS PIC X(10). 05 CHECKPOINT-DATA-AREA PIC X(500). PROCEDURE DIVISION. ERROR-HANDLING-CHAIN. PERFORM INITIALIZE-ERROR-HANDLING PERFORM MAIN-PROCESSING-WITH-RECOVERY. INITIALIZE-ERROR-HANDLING. MOVE FUNCTION CURRENT-DATE TO ERROR-TIMESTAMP MOVE "SYSTEM" TO ERROR-USER-ID MOVE ZERO TO ERROR-CODE RETRY-COUNT. MAIN-PROCESSING-WITH-RECOVERY. PERFORM ESTABLISH-CHECKPOINT PERFORM UNTIL OPERATION-COMPLETE OR ABORT-CHAIN PERFORM ATTEMPT-OPERATION IF ERROR-OCCURRED PERFORM HANDLE-CHAIN-ERROR EVALUATE TRUE WHEN RETRY-OPERATION PERFORM INCREMENT-RETRY-COUNT IF RETRY-COUNT <= MAX-RETRIES CONTINUE ELSE PERFORM ESCALATE-ERROR END-IF WHEN SKIP-STEP PERFORM SKIP-TO-NEXT-STEP WHEN ABORT-CHAIN PERFORM ABORT-PROCESSING-CHAIN WHEN MANUAL-INTERVENTION PERFORM REQUEST-MANUAL-INTERVENTION END-EVALUATE ELSE PERFORM ADVANCE-TO-NEXT-STEP END-IF END-PERFORM. ATTEMPT-OPERATION. *> Simulate processing that might fail EVALUATE WS-CURRENT-OPERATION WHEN "DATABASE-UPDATE" PERFORM UPDATE-DATABASE-OPERATION WHEN "FILE-PROCESSING" PERFORM FILE-PROCESSING-OPERATION WHEN "CALCULATION" PERFORM CALCULATION-OPERATION WHEN OTHER PERFORM UNKNOWN-OPERATION END-EVALUATE. HANDLE-CHAIN-ERROR. MOVE "ERROR" TO ERROR-SEVERITY MOVE WS-CURRENT-PROGRAM TO ERROR-PROGRAM MOVE FUNCTION CURRENT-DATE TO ERROR-TIMESTAMP DISPLAY "=== Error Detected in Chain ===" DISPLAY "Error Code: " ERROR-CODE DISPLAY "Error Message: " ERROR-MESSAGE DISPLAY "Program: " ERROR-PROGRAM DISPLAY "Timestamp: " ERROR-TIMESTAMP *> Chain to error handler program CHAIN ERROR-HANDLER-PROG USING ERROR-INFORMATION RECOVERY-OPTIONS CHECKPOINT-DATA. ESTABLISH-CHECKPOINT. MOVE FUNCTION CURRENT-DATE(9:8) TO CHECKPOINT-ID MOVE "ACTIVE" TO CHECKPOINT-STATUS *> Save current state STRING "PROGRAM=" WS-CURRENT-PROGRAM ",STEP=" WS-CURRENT-STEP ",STATUS=" WS-PROCESS-STATUS DELIMITED BY SIZE INTO CHECKPOINT-DATA-AREA END-STRING DISPLAY "Checkpoint established: " CHECKPOINT-ID. ESCALATE-ERROR. MOVE "FATAL" TO ERROR-SEVERITY MOVE "Maximum retries exceeded" TO ERROR-MESSAGE *> Chain to escalation handler CHAIN "ESCALATE" USING ERROR-INFORMATION CHECKPOINT-DATA. SKIP-TO-NEXT-STEP. DISPLAY "Skipping current step due to error" ADD 1 TO WS-CURRENT-STEP MOVE ZERO TO RETRY-COUNT. ABORT-PROCESSING-CHAIN. MOVE "FATAL" TO ERROR-SEVERITY MOVE "Processing chain aborted" TO ERROR-MESSAGE *> Chain to rollback program CHAIN ROLLBACK-PROG USING ERROR-INFORMATION CHECKPOINT-DATA. REQUEST-MANUAL-INTERVENTION. MOVE "WARNING" TO ERROR-SEVERITY MOVE "Manual intervention required" TO ERROR-MESSAGE DISPLAY "=== Manual Intervention Required ===" DISPLAY "Current Step: " WS-CURRENT-STEP DISPLAY "Error: " ERROR-MESSAGE DISPLAY "Please resolve and restart" *> Chain to manual intervention handler CHAIN "MANUAL" USING ERROR-INFORMATION RECOVERY-OPTIONS CHECKPOINT-DATA.
CHAIN transfers control permanently to another program and doesn't return, while CALL temporarily transfers control and returns to the calling program.
Yes, you can pass data using the USING clause in the CHAIN statement, similar to how parameters are passed in CALL statements.
The current program is typically removed from memory and replaced by the chained program, making CHAIN memory-efficient for long processing sequences.