MainframeMaster

COBOL Tutorial

COBOL DECLARATIVES Section

The DECLARATIVES section in COBOL contains special procedures that are automatically executed when specific conditions occur, providing centralized exception handling and special processing capabilities.

DECLARATIVES Section Structure

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PROCEDURE DIVISION. DECLARATIVES. section-name SECTION. USE statement. paragraph-name. statements... section-name-2 SECTION. USE statement. paragraph-name-2. statements... END DECLARATIVES. *> Regular procedure division code follows MAIN-SECTION SECTION. MAIN-PROCESSING. statements...

File Error Handling

USE AFTER STANDARD ERROR PROCEDURE

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
PROCEDURE DIVISION. DECLARATIVES. file-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON INPUT-FILE. file-error-handler. DISPLAY "Error occurred on INPUT-FILE" DISPLAY "File Status: " FILE-STATUS-INPUT EVALUATE FILE-STATUS-INPUT WHEN "10" DISPLAY "End of file reached" MOVE "Y" TO EOF-FLAG WHEN "23" DISPLAY "Record not found" MOVE "Y" TO RECORD-NOT-FOUND-FLAG WHEN "24" DISPLAY "Boundary violation" PERFORM ERROR-RECOVERY WHEN OTHER DISPLAY "Unexpected file error: " FILE-STATUS-INPUT PERFORM ABEND-PROCESSING END-EVALUATE. general-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON OUTPUT-FILE, REPORT-FILE. general-error-handler. DISPLAY "Error on file: " IF FILE-STATUS-OUTPUT NOT = "00" DISPLAY "OUTPUT-FILE Status: " FILE-STATUS-OUTPUT END-IF IF FILE-STATUS-REPORT NOT = "00" DISPLAY "REPORT-FILE Status: " FILE-STATUS-REPORT END-IF PERFORM LOG-ERROR-DETAILS. END DECLARATIVES. MAIN-SECTION SECTION. MAIN-PROCESSING. OPEN INPUT INPUT-FILE OPEN OUTPUT OUTPUT-FILE, REPORT-FILE PERFORM READ-AND-PROCESS UNTIL EOF-FLAG = "Y" CLOSE INPUT-FILE, OUTPUT-FILE, REPORT-FILE STOP RUN. READ-AND-PROCESS. READ INPUT-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-RECORD END-READ. ERROR-RECOVERY. DISPLAY "Attempting error recovery..." *> Recovery logic here ABEND-PROCESSING. DISPLAY "Fatal error - terminating program" MOVE 16 TO RETURN-CODE STOP RUN. LOG-ERROR-DETAILS. *> Log error to audit file or system log CONTINUE.

Advanced File Error Processing

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ERROR-HANDLING. 05 WS-ERROR-COUNT PIC 9(3) VALUE ZERO. 05 WS-MAX-ERRORS PIC 9(3) VALUE 10. 05 WS-RETRY-COUNT PIC 9(2) VALUE ZERO. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. 05 WS-ERROR-LOG-FILE PIC X(20) VALUE "ERROR.LOG". 01 WS-ERROR-DETAILS. 05 WS-ERROR-TIMESTAMP PIC X(20). 05 WS-ERROR-FILE-NAME PIC X(30). 05 WS-ERROR-STATUS PIC X(2). 05 WS-ERROR-OPERATION PIC X(10). PROCEDURE DIVISION. DECLARATIVES. comprehensive-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON ALL FILES. comprehensive-error-handler. ADD 1 TO WS-ERROR-COUNT ACCEPT WS-ERROR-TIMESTAMP FROM DATE-TIME *> Determine which file caused the error PERFORM IDENTIFY-ERROR-FILE *> Log the error PERFORM LOG-COMPREHENSIVE-ERROR *> Determine recovery action PERFORM DETERMINE-ERROR-ACTION. END DECLARATIVES. MAIN-SECTION SECTION. IDENTIFY-ERROR-FILE. *> Check file status of all files to identify the problem IF FILE-STATUS-CUSTOMER NOT = "00" MOVE "CUSTOMER-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-CUSTOMER TO WS-ERROR-STATUS ELSE IF FILE-STATUS-ORDERS NOT = "00" MOVE "ORDERS-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-ORDERS TO WS-ERROR-STATUS ELSE IF FILE-STATUS-REPORTS NOT = "00" MOVE "REPORTS-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-REPORTS TO WS-ERROR-STATUS END-IF. LOG-COMPREHENSIVE-ERROR. DISPLAY "=== FILE ERROR DETECTED ===" DISPLAY "Timestamp: " WS-ERROR-TIMESTAMP DISPLAY "File: " WS-ERROR-FILE-NAME DISPLAY "Status: " WS-ERROR-STATUS DISPLAY "Error Count: " WS-ERROR-COUNT DISPLAY "==========================" *> Write to error log file PERFORM WRITE-ERROR-LOG. DETERMINE-ERROR-ACTION. EVALUATE WS-ERROR-STATUS WHEN "10" *> End of file CONTINUE WHEN "23" *> Record not found IF WS-RETRY-COUNT < WS-MAX-RETRIES ADD 1 TO WS-RETRY-COUNT DISPLAY "Retrying operation..." ELSE DISPLAY "Max retries exceeded" PERFORM SKIP-RECORD-PROCESSING END-IF WHEN "30" *> Permanent error DISPLAY "Permanent error - cannot continue" PERFORM EMERGENCY-SHUTDOWN WHEN OTHER IF WS-ERROR-COUNT > WS-MAX-ERRORS DISPLAY "Too many errors - aborting" PERFORM EMERGENCY-SHUTDOWN ELSE DISPLAY "Continuing with next operation" END-IF END-EVALUATE. WRITE-ERROR-LOG. *> Write detailed error information to log file CONTINUE. SKIP-RECORD-PROCESSING. *> Skip current record and continue CONTINUE. EMERGENCY-SHUTDOWN. DISPLAY "Emergency shutdown initiated" MOVE 20 TO RETURN-CODE STOP RUN.

Report Writer Declaratives

USE BEFORE REPORTING

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
PROCEDURE DIVISION. DECLARATIVES. report-control-section SECTION. USE BEFORE REPORTING PAGE-HEADING. page-heading-control. ADD 1 TO PAGE-COUNTER ACCEPT CURRENT-DATE-TIME FROM DATE-TIME MOVE CURRENT-DATE-TIME(1:8) TO REPORT-DATE MOVE CURRENT-DATE-TIME(9:6) TO REPORT-TIME DISPLAY "Generating page " PAGE-COUNTER. summary-control-section SECTION. USE BEFORE REPORTING FINAL-SUMMARY. final-summary-control. COMPUTE AVERAGE-AMOUNT = TOTAL-AMOUNT / RECORD-COUNT MOVE AVERAGE-AMOUNT TO AVERAGE-DISPLAY DISPLAY "Final summary being generated" DISPLAY "Total records processed: " RECORD-COUNT DISPLAY "Average amount: " AVERAGE-DISPLAY. END DECLARATIVES. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNTERS. 05 PAGE-COUNTER PIC 9(3) VALUE ZERO. 05 RECORD-COUNT PIC 9(5) VALUE ZERO. 05 TOTAL-AMOUNT PIC 9(8)V99 VALUE ZERO. 05 AVERAGE-AMOUNT PIC 9(6)V99. 01 WS-DATE-TIME-FIELDS. 05 CURRENT-DATE-TIME PIC X(20). 05 REPORT-DATE PIC X(8). 05 REPORT-TIME PIC X(6). 01 WS-DISPLAY-FIELDS. 05 AVERAGE-DISPLAY PIC ZZ,ZZ9.99. REPORT SECTION. RD SALES-REPORT CONTROL IS FINAL, REGION. 01 PAGE-HEADING TYPE IS PAGE HEADING. 05 LINE 1. 05 COLUMN 1 PIC X(20) VALUE "SALES REPORT". 05 COLUMN 50 PIC X(8) SOURCE REPORT-DATE. 05 COLUMN 60 PIC X(6) SOURCE REPORT-TIME. 05 COLUMN 70 PIC X(5) VALUE "PAGE ". 05 COLUMN 75 PIC ZZ9 SOURCE PAGE-COUNTER. 01 DETAIL-LINE TYPE IS DETAIL. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(10) SOURCE SALESMAN-ID. 05 COLUMN 15 PIC X(20) SOURCE CUSTOMER-NAME. 05 COLUMN 40 PIC ZZ,ZZ9.99 SOURCE SALE-AMOUNT. 01 FINAL-SUMMARY TYPE IS CONTROL FOOTING FINAL. 05 LINE PLUS 3. 05 COLUMN 1 PIC X(15) VALUE "TOTAL RECORDS: ". 05 COLUMN 20 PIC ZZ,ZZ9 SOURCE RECORD-COUNT. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(15) VALUE "AVERAGE AMOUNT: ". 05 COLUMN 20 PIC ZZ,ZZ9.99 SOURCE AVERAGE-DISPLAY.

Complex Report Processing

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
PROCEDURE DIVISION. DECLARATIVES. region-break-section SECTION. USE BEFORE REPORTING REGION-FOOTING. region-break-processing. *> Calculate region statistics IF REGION-RECORD-COUNT > 0 COMPUTE REGION-AVERAGE = REGION-TOTAL / REGION-RECORD-COUNT ELSE MOVE ZERO TO REGION-AVERAGE END-IF *> Determine performance rating EVALUATE TRUE WHEN REGION-TOTAL > 100000 MOVE "EXCELLENT" TO REGION-RATING WHEN REGION-TOTAL > 50000 MOVE "GOOD" TO REGION-RATING WHEN REGION-TOTAL > 25000 MOVE "AVERAGE" TO REGION-RATING WHEN OTHER MOVE "BELOW AVG" TO REGION-RATING END-EVALUATE *> Log region completion DISPLAY "Region " REGION-CODE " completed:" DISPLAY " Records: " REGION-RECORD-COUNT DISPLAY " Total: " REGION-TOTAL DISPLAY " Average: " REGION-AVERAGE DISPLAY " Rating: " REGION-RATING. page-overflow-section SECTION. USE BEFORE REPORTING PAGE-FOOTING. page-overflow-processing. *> Check if page is getting full IF LINE-COUNTER > 50 DISPLAY "Page " PAGE-COUNTER " is full - starting new page" ADD 1 TO TOTAL-PAGES END-IF *> Add page footer information ACCEPT CURRENT-TIME FROM TIME MOVE CURRENT-TIME TO PAGE-TIME. END DECLARATIVES. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-REGION-STATS. 05 REGION-RECORD-COUNT PIC 9(4) VALUE ZERO. 05 REGION-TOTAL PIC 9(8)V99 VALUE ZERO. 05 REGION-AVERAGE PIC 9(6)V99. 05 REGION-RATING PIC X(10). 01 WS-PAGE-CONTROL. 05 TOTAL-PAGES PIC 9(3) VALUE ZERO. 05 LINE-COUNTER PIC 9(2) VALUE ZERO. 05 CURRENT-TIME PIC X(8). 05 PAGE-TIME PIC X(8). REPORT SECTION. RD REGIONAL-SALES-REPORT CONTROL IS FINAL, REGION-CODE. 01 REGION-FOOTING TYPE IS CONTROL FOOTING REGION-CODE. 05 LINE PLUS 2. 05 COLUMN 1 PIC X(15) VALUE "REGION TOTAL: ". 05 COLUMN 20 PIC ZZ,ZZ9.99 SOURCE REGION-TOTAL. 05 COLUMN 35 PIC X(10) VALUE "AVERAGE: ". 05 COLUMN 45 PIC Z,ZZ9.99 SOURCE REGION-AVERAGE. 05 COLUMN 55 PIC X(10) VALUE "RATING: ". 05 COLUMN 65 PIC X(10) SOURCE REGION-RATING. 01 PAGE-FOOTING TYPE IS PAGE FOOTING. 05 LINE 60. 05 COLUMN 1 PIC X(20) VALUE "End of Page". 05 COLUMN 50 PIC X(8) SOURCE PAGE-TIME.

Exception Handling Declaratives

USE AFTER STANDARD EXCEPTION PROCEDURE

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
PROCEDURE DIVISION. DECLARATIVES. exception-handling-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE. exception-handler. DISPLAY "Exception occurred in program" DISPLAY "Exception type: " EXCEPTION-TYPE DISPLAY "Exception location: " EXCEPTION-LOCATION PERFORM LOG-EXCEPTION-DETAILS PERFORM DETERMINE-EXCEPTION-ACTION. arithmetic-exception-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE ON ARITHMETIC-OPERATIONS. arithmetic-exception-handler. DISPLAY "Arithmetic exception detected" EVALUATE EXCEPTION-TYPE WHEN "DIVIDE-BY-ZERO" DISPLAY "Division by zero attempted" PERFORM HANDLE-DIVIDE-BY-ZERO WHEN "OVERFLOW" DISPLAY "Arithmetic overflow occurred" PERFORM HANDLE-OVERFLOW WHEN "SIZE-ERROR" DISPLAY "Size error in arithmetic operation" PERFORM HANDLE-SIZE-ERROR WHEN OTHER DISPLAY "Unknown arithmetic exception" PERFORM HANDLE-UNKNOWN-ARITHMETIC-ERROR END-EVALUATE. END DECLARATIVES. MAIN-SECTION SECTION. LOG-EXCEPTION-DETAILS. ACCEPT EXCEPTION-TIMESTAMP FROM DATE-TIME DISPLAY "=== EXCEPTION LOG ===" DISPLAY "Time: " EXCEPTION-TIMESTAMP DISPLAY "Type: " EXCEPTION-TYPE DISPLAY "Location: " EXCEPTION-LOCATION DISPLAY "Program: " PROGRAM-NAME DISPLAY "====================" *> Write to exception log file PERFORM WRITE-EXCEPTION-LOG. DETERMINE-EXCEPTION-ACTION. EVALUATE EXCEPTION-SEVERITY WHEN "FATAL" DISPLAY "Fatal exception - terminating" PERFORM CLEANUP-AND-EXIT WHEN "ERROR" DISPLAY "Error exception - attempting recovery" PERFORM ATTEMPT-RECOVERY WHEN "WARNING" DISPLAY "Warning exception - continuing" CONTINUE WHEN OTHER DISPLAY "Unknown exception severity" PERFORM ATTEMPT-RECOVERY END-EVALUATE. HANDLE-DIVIDE-BY-ZERO. DISPLAY "Setting result to zero for divide-by-zero" MOVE ZERO TO CALCULATION-RESULT ADD 1 TO DIVIDE-BY-ZERO-COUNT. HANDLE-OVERFLOW. DISPLAY "Using maximum value for overflow" MOVE HIGH-VALUES TO CALCULATION-RESULT ADD 1 TO OVERFLOW-COUNT. HANDLE-SIZE-ERROR. DISPLAY "Truncating result for size error" MOVE 999999999 TO CALCULATION-RESULT ADD 1 TO SIZE-ERROR-COUNT. HANDLE-UNKNOWN-ARITHMETIC-ERROR. DISPLAY "Setting default value for unknown error" MOVE ZERO TO CALCULATION-RESULT ADD 1 TO UNKNOWN-ERROR-COUNT. WRITE-EXCEPTION-LOG. *> Write exception details to log file CONTINUE. ATTEMPT-RECOVERY. DISPLAY "Attempting automatic recovery..." *> Recovery logic here CONTINUE. CLEANUP-AND-EXIT. DISPLAY "Performing cleanup operations..." *> Cleanup logic here MOVE 24 TO RETURN-CODE STOP RUN.

Best Practices and Guidelines

DECLARATIVES Best Practices

  • Keep declarative procedures simple and focused on their specific purpose
  • Always include proper error logging and recovery mechanisms
  • Use meaningful section and paragraph names for clarity
  • Avoid complex logic in declarative procedures
  • Test all declarative procedures thoroughly with various error conditions
  • Document the purpose and trigger conditions for each declarative
  • Consider performance impact of declarative processing

Common Patterns and Templates

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
*> Standard DECLARATIVES template PROCEDURE DIVISION. DECLARATIVES. *> File error handling template file-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON file-name. file-error-handler. PERFORM LOG-FILE-ERROR PERFORM DETERMINE-FILE-ACTION. *> Report processing template report-section SECTION. USE BEFORE REPORTING report-group-name. report-handler. PERFORM SETUP-REPORT-DATA PERFORM CALCULATE-REPORT-TOTALS. *> Debug processing template debug-section SECTION. USE FOR DEBUGGING ON ALL PROCEDURES. debug-handler. IF DEBUG-MODE-ON PERFORM LOG-DEBUG-INFO END-IF. *> Exception handling template exception-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE. exception-handler. PERFORM LOG-EXCEPTION PERFORM HANDLE-EXCEPTION. END DECLARATIVES. *> Standard procedures for declaratives MAIN-SECTION SECTION. LOG-FILE-ERROR. DISPLAY "File error: " FILE-STATUS *> Log to error file or system log DETERMINE-FILE-ACTION. EVALUATE FILE-STATUS WHEN "10" CONTINUE *> End of file WHEN "23" PERFORM RETRY-OPERATION WHEN OTHER PERFORM ABORT-PROCESSING END-EVALUATE. LOG-DEBUG-INFO. DISPLAY "Debug: " DEBUG-LINE " " DEBUG-NAME. LOG-EXCEPTION. DISPLAY "Exception: " EXCEPTION-TYPE. HANDLE-EXCEPTION. EVALUATE EXCEPTION-TYPE WHEN "FATAL" PERFORM EMERGENCY-EXIT WHEN OTHER PERFORM CONTINUE-PROCESSING END-EVALUATE.

Frequently Asked Questions