The GOBACK statement represents a modern and versatile program control return mechanism within COBOL programming environments, serving as the primary specification for returning control from subprograms to calling programs or terminating main program execution with clean resource management. This statement embodies the principles of structured program termination by providing consistent return behavior across different program contexts, enabling reliable inter-program communication patterns, and supporting efficient program lifecycle management while maintaining compatibility with modern COBOL standards and ensuring predictable program flow control in enterprise applications that require robust modular programming architectures and reliable program termination sequences with proper resource cleanup and state management.
12345678910GOBACK *> In main program - terminates program *> In subprogram - returns to calling program *> Examples: GOBACK IF ERROR-CONDITION GOBACK END-IF
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 CALCULATION-RESULT PIC 9(7)V99. 01 ERROR-CODE PIC 9(3). 01 VALIDATION-STATUS PIC X. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY 'Starting main program...' *> Call subprogram for validation CALL 'VALIDATE-INPUT' USING VALIDATION-STATUS IF VALIDATION-STATUS = 'N' DISPLAY 'Validation failed - terminating' GOBACK END-IF *> Call subprogram for calculation CALL 'CALCULATE-VALUES' USING CALCULATION-RESULT ERROR-CODE IF ERROR-CODE NOT = 0 DISPLAY 'Calculation error: ' ERROR-CODE GOBACK END-IF DISPLAY 'Main program completed successfully' DISPLAY 'Result: ' CALCULATION-RESULT GOBACK. *> Subprogram demonstrating GOBACK usage IDENTIFICATION DIVISION. PROGRAM-ID. VALIDATE-INPUT. DATA DIVISION. LINKAGE SECTION. 01 VALIDATION-RESULT PIC X. PROCEDURE DIVISION USING VALIDATION-RESULT. VALIDATION-LOGIC. DISPLAY 'Performing input validation...' *> Simulate validation process MOVE 'Y' TO VALIDATION-RESULT *> Simulate validation failure condition IF FUNCTION RANDOM < 0.2 MOVE 'N' TO VALIDATION-RESULT DISPLAY 'Validation failed - invalid input detected' GOBACK END-IF DISPLAY 'Validation successful' GOBACK. END PROGRAM VALIDATE-INPUT. *> Another subprogram with error handling IDENTIFICATION DIVISION. PROGRAM-ID. CALCULATE-VALUES. DATA DIVISION. WORKING-STORAGE SECTION. 01 TEMP-RESULT PIC 9(9)V99. 01 DIVISOR PIC 9(3) VALUE 100. LINKAGE SECTION. 01 RESULT-VALUE PIC 9(7)V99. 01 ERROR-STATUS PIC 9(3). PROCEDURE DIVISION USING RESULT-VALUE ERROR-STATUS. CALCULATION-LOGIC. MOVE 0 TO ERROR-STATUS *> Simulate complex calculation COMPUTE TEMP-RESULT = FUNCTION RANDOM * 1000000 *> Check for overflow IF TEMP-RESULT > 99999.99 MOVE 101 TO ERROR-STATUS DISPLAY 'Error: Calculation overflow' GOBACK END-IF *> Check for division by zero (simulated) IF DIVISOR = 0 MOVE 102 TO ERROR-STATUS DISPLAY 'Error: Division by zero' GOBACK END-IF DIVIDE TEMP-RESULT BY DIVISOR GIVING RESULT-VALUE DISPLAY 'Calculation completed: ' RESULT-VALUE GOBACK. END PROGRAM CALCULATE-VALUES. END PROGRAM MAIN-PROGRAM.
123456789101112131415161718192021222324252627282930IDENTIFICATION DIVISION. PROGRAM-ID. FILE-PROCESSOR. DATA DIVISION. LINKAGE SECTION. 01 FILE-NAME PIC X(20). 01 PROCESS-STATUS PIC 9(3). PROCEDURE DIVISION USING FILE-NAME PROCESS-STATUS. MOVE 0 TO PROCESS-STATUS *> Validate file name IF FILE-NAME = SPACES MOVE 001 TO PROCESS-STATUS DISPLAY 'Error: File name is empty' GOBACK END-IF *> Simulate file processing DISPLAY 'Processing file: ' FILE-NAME *> Simulate file not found IF FILE-NAME(1:4) = 'TEMP' MOVE 002 TO PROCESS-STATUS DISPLAY 'Error: Temporary files not allowed' GOBACK END-IF DISPLAY 'File processed successfully' GOBACK.
1234567891011121314151617181920212223242526272829303132IDENTIFICATION DIVISION. PROGRAM-ID. BUSINESS-LOGIC. PROCEDURE DIVISION. MAIN-LOGIC. CALL 'INITIALIZE-SYSTEM' CALL 'PROCESS-TRANSACTIONS' CALL 'GENERATE-REPORTS' GOBACK. IDENTIFICATION DIVISION. PROGRAM-ID. INITIALIZE-SYSTEM. PROCEDURE DIVISION. DISPLAY 'System initialization...' *> Check system prerequisites PERFORM CHECK-ENVIRONMENT PERFORM LOAD-CONFIGURATION DISPLAY 'System ready' GOBACK. CHECK-ENVIRONMENT. *> Environment validation CONTINUE. LOAD-CONFIGURATION. *> Configuration loading CONTINUE. END PROGRAM INITIALIZE-SYSTEM.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-GOBACK-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 SYSTEM-STATE. 05 INITIALIZATION-COMPLETE PIC X VALUE 'N'. 05 PROCESSING-ACTIVE PIC X VALUE 'N'. 05 ERROR-RECOVERY-MODE PIC X VALUE 'N'. 01 OPERATION-COUNTERS. 05 SUCCESSFUL-OPERATIONS PIC 9(5) VALUE 0. 05 FAILED-OPERATIONS PIC 9(5) VALUE 0. 05 TOTAL-OPERATIONS PIC 9(5) VALUE 0. 01 WS-COUNTER PIC 9(3). 01 WS-RESULT-CODE PIC 9(2). PROCEDURE DIVISION. MAIN-CONTROLLER. PERFORM SYSTEM-STARTUP IF INITIALIZATION-COMPLETE = 'Y' PERFORM BUSINESS-PROCESSING ELSE DISPLAY 'System startup failed' GOBACK END-IF PERFORM SYSTEM-SHUTDOWN DISPLAY 'Operations Summary:' DISPLAY 'Total: ' TOTAL-OPERATIONS DISPLAY 'Successful: ' SUCCESSFUL-OPERATIONS DISPLAY 'Failed: ' FAILED-OPERATIONS GOBACK. SYSTEM-STARTUP. CALL 'DATABASE-CONNECT' USING INITIALIZATION-COMPLETE IF INITIALIZATION-COMPLETE = 'N' DISPLAY 'Database connection failed' GOBACK END-IF CALL 'LOAD-BUSINESS-RULES' USING INITIALIZATION-COMPLETE IF INITIALIZATION-COMPLETE = 'N' DISPLAY 'Business rules loading failed' GOBACK END-IF. BUSINESS-PROCESSING. MOVE 'Y' TO PROCESSING-ACTIVE PERFORM VARYING WS-COUNTER FROM 1 BY 1 UNTIL WS-COUNTER > 100 ADD 1 TO TOTAL-OPERATIONS CALL 'PROCESS-TRANSACTION' USING WS-COUNTER WS-RESULT-CODE IF WS-RESULT-CODE = 0 ADD 1 TO SUCCESSFUL-OPERATIONS ELSE ADD 1 TO FAILED-OPERATIONS *> Emergency stop if too many failures IF FAILED-OPERATIONS > 10 DISPLAY 'Too many failures - stopping processing' MOVE 'N' TO PROCESSING-ACTIVE EXIT PERFORM END-IF END-IF END-PERFORM. SYSTEM-SHUTDOWN. MOVE 'N' TO PROCESSING-ACTIVE CALL 'DATABASE-DISCONNECT' CALL 'CLEANUP-RESOURCES'. *> Database connection subprogram IDENTIFICATION DIVISION. PROGRAM-ID. DATABASE-CONNECT. DATA DIVISION. WORKING-STORAGE SECTION. 01 CONNECTION-ATTEMPTS PIC 9(2) VALUE 0. 01 MAX-ATTEMPTS PIC 9(2) VALUE 3. LINKAGE SECTION. 01 CONNECTION-STATUS PIC X. PROCEDURE DIVISION USING CONNECTION-STATUS. CONNECTION-LOGIC. MOVE 'N' TO CONNECTION-STATUS PERFORM VARYING CONNECTION-ATTEMPTS FROM 1 BY 1 UNTIL CONNECTION-ATTEMPTS > MAX-ATTEMPTS OR CONNECTION-STATUS = 'Y' DISPLAY 'Connection attempt ' CONNECTION-ATTEMPTS *> Simulate connection logic IF FUNCTION RANDOM > 0.3 MOVE 'Y' TO CONNECTION-STATUS DISPLAY 'Database connected successfully' GOBACK ELSE DISPLAY 'Connection failed, retrying...' END-IF END-PERFORM IF CONNECTION-STATUS = 'N' DISPLAY 'All connection attempts failed' END-IF GOBACK. END PROGRAM DATABASE-CONNECT. *> Transaction processing subprogram IDENTIFICATION DIVISION. PROGRAM-ID. PROCESS-TRANSACTION. DATA DIVISION. LINKAGE SECTION. 01 TRANSACTION-ID PIC 9(5). 01 RESULT-CODE PIC 9(3). PROCEDURE DIVISION USING TRANSACTION-ID RESULT-CODE. TRANSACTION-LOGIC. MOVE 0 TO RESULT-CODE *> Validate transaction ID IF TRANSACTION-ID = 0 MOVE 001 TO RESULT-CODE DISPLAY 'Invalid transaction ID' GOBACK END-IF *> Simulate processing IF FUNCTION MOD(TRANSACTION-ID, 10) = 0 MOVE 002 TO RESULT-CODE DISPLAY 'Transaction ' TRANSACTION-ID ' failed validation' GOBACK END-IF *> Successful processing DISPLAY 'Transaction ' TRANSACTION-ID ' processed successfully' GOBACK. END PROGRAM PROCESS-TRANSACTION. *> Resource cleanup subprogram IDENTIFICATION DIVISION. PROGRAM-ID. CLEANUP-RESOURCES. PROCEDURE DIVISION. CLEANUP-LOGIC. DISPLAY 'Cleaning up temporary files...' DISPLAY 'Releasing memory resources...' DISPLAY 'Closing log files...' DISPLAY 'Cleanup completed' GOBACK. END PROGRAM CLEANUP-RESOURCES. END PROGRAM ADVANCED-GOBACK-DEMO.
What does GOBACK do in a subprogram?
Answer: GOBACK returns control from the subprogram to the calling program, terminating the current subprogram's execution.
What happens when GOBACK is used in a main program?
Answer: In a main program, GOBACK terminates the entire program execution, similar to STOP RUN but with more modern semantics.
Why is GOBACK preferred over EXIT PROGRAM?
Answer: GOBACK is more versatile (works in both main and subprograms), follows modern COBOL standards, and provides more consistent behavior across different program contexts.
1234567891011121314PROCEDURE DIVISION USING INPUT-DATA RESULT-CODE. MOVE 0 TO RESULT-CODE *> Validation IF INPUT-DATA = SPACES MOVE 001 TO RESULT-CODE GOBACK END-IF *> Processing PERFORM BUSINESS-LOGIC *> Success GOBACK.
1234567891011PROCEDURE DIVISION. PERFORM INITIALIZE-RESOURCES IF INITIALIZATION-FAILED PERFORM CLEANUP-RESOURCES GOBACK END-IF PERFORM MAIN-PROCESSING PERFORM CLEANUP-RESOURCES GOBACK.