MainframeMaster

COBOL Tutorial

COBOL INITIAL Clause

The INITIAL clause represents a fundamental program state management mechanism within COBOL programming environments, providing automatic data initialization capabilities that ensure consistent program behavior, predictable execution states, and reliable subprogram functionality. This clause embodies the principles of clean program execution by supporting automatic data reset, memory state management, and program reentrancy while maintaining data integrity, ensuring repeatable results, and facilitating robust application architectures across enterprise systems requiring reliable program execution, consistent state management, and predictable behavior patterns with optimal resource utilization and comprehensive program lifecycle control.

INITIAL Clause Syntax

Program Declaration with INITIAL
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
*> Basic INITIAL clause syntax IDENTIFICATION DIVISION. PROGRAM-ID. program-name IS INITIAL PROGRAM. *> Example of INITIAL program IDENTIFICATION DIVISION. PROGRAM-ID. CALCULATE-INTEREST IS INITIAL PROGRAM. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNTER PIC 9(3) VALUE 0. 01 WS-TOTAL PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-FLAG PIC X VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. *> This program is initialized fresh on each call DISPLAY "Starting fresh calculation..." DISPLAY "Counter starts at: " WS-COUNTER DISPLAY "Total starts at: " WS-TOTAL *> Program logic here GOBACK. *> Calling program example IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CALL-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM 3 TIMES ADD 1 TO WS-CALL-COUNT DISPLAY "Call number: " WS-CALL-COUNT CALL "CALCULATE-INTEREST" END-PERFORM STOP RUN.
Program Control
Initialization
State Management

Comprehensive INITIAL Examples

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
*> =============================================== *> MAIN CALLING PROGRAM *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. INITIAL-DEMO-MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-MAIN-COUNTERS. 05 WS-TOTAL-CALLS PIC 9(3) VALUE 0. 05 WS-SESSION-NUMBER PIC 9(2) VALUE 0. 01 WS-PARAMETERS. 05 WS-PRINCIPAL PIC 9(8)V99. 05 WS-RATE PIC 9V9999. 05 WS-RESULT PIC 9(10)V99. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== INITIAL CLAUSE DEMONSTRATION ===" DISPLAY "Testing INITIAL vs NON-INITIAL programs" DISPLAY SPACES PERFORM TEST-INITIAL-PROGRAM PERFORM TEST-NON-INITIAL-PROGRAM STOP RUN. TEST-INITIAL-PROGRAM. DISPLAY "=== TESTING INITIAL PROGRAM ===" PERFORM VARYING WS-SESSION-NUMBER FROM 1 BY 1 UNTIL WS-SESSION-NUMBER > 3 DISPLAY "Session " WS-SESSION-NUMBER ":" MOVE 10000.00 TO WS-PRINCIPAL MOVE 0.05 TO WS-RATE CALL "INITIAL-CALCULATOR" USING WS-PRINCIPAL WS-RATE WS-RESULT DISPLAY " Result: $" WS-RESULT ADD 1 TO WS-TOTAL-CALLS END-PERFORM DISPLAY "Total calls to INITIAL program: " WS-TOTAL-CALLS DISPLAY SPACES. TEST-NON-INITIAL-PROGRAM. DISPLAY "=== TESTING NON-INITIAL PROGRAM ===" MOVE 0 TO WS-SESSION-NUMBER PERFORM VARYING WS-SESSION-NUMBER FROM 1 BY 1 UNTIL WS-SESSION-NUMBER > 3 DISPLAY "Session " WS-SESSION-NUMBER ":" MOVE 10000.00 TO WS-PRINCIPAL MOVE 0.05 TO WS-RATE CALL "REGULAR-CALCULATOR" USING WS-PRINCIPAL WS-RATE WS-RESULT DISPLAY " Result: $" WS-RESULT ADD 1 TO WS-TOTAL-CALLS END-PERFORM DISPLAY "Total calls to REGULAR program: " WS-TOTAL-CALLS DISPLAY SPACES. *> =============================================== *> INITIAL SUBPROGRAM *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. INITIAL-CALCULATOR IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. *> These values are reset on each program call 01 WS-INTERNAL-COUNTERS. 05 WS-CALCULATION-COUNT PIC 9(3) VALUE 0. 05 WS-ITERATION-COUNT PIC 9(4) VALUE 0. 05 WS-TOTAL-PROCESSED PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-DATA. 05 WS-COMPOUND-FACTOR PIC 9V99999 VALUE 1.0. 05 WS-MONTHLY-RATE PIC 9V99999 VALUE 0. 05 WS-INTERMEDIATE-RESULT PIC 9(10)V99 VALUE 0. 01 WS-STATUS-FLAGS. 05 WS-FIRST-CALCULATION PIC X VALUE 'Y'. 88 FIRST-TIME VALUE 'Y'. 88 NOT-FIRST-TIME VALUE 'N'. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 88 CALCULATION-ERROR VALUE 'Y'. 88 NO-ERROR VALUE 'N'. LINKAGE SECTION. 01 LS-PRINCIPAL PIC 9(8)V99. 01 LS-ANNUAL-RATE PIC 9V9999. 01 LS-CALCULATED-RESULT PIC 9(10)V99. PROCEDURE DIVISION USING LS-PRINCIPAL LS-ANNUAL-RATE LS-CALCULATED-RESULT. INITIAL-PROGRAM-MAIN. DISPLAY " INITIAL PROGRAM - Starting fresh calculation" DISPLAY " Calculation count starts at: " WS-CALCULATION-COUNT DISPLAY " Total processed starts at: $" WS-TOTAL-PROCESSED PERFORM VALIDATE-INPUT IF NO-ERROR PERFORM CALCULATE-COMPOUND-INTEREST PERFORM UPDATE-STATISTICS PERFORM DISPLAY-INTERNAL-STATE ELSE MOVE 0 TO LS-CALCULATED-RESULT END-IF GOBACK. VALIDATE-INPUT. SET NO-ERROR TO TRUE IF LS-PRINCIPAL <= 0 DISPLAY " Error: Principal must be positive" SET CALCULATION-ERROR TO TRUE END-IF IF LS-ANNUAL-RATE <= 0 OR LS-ANNUAL-RATE > 1 DISPLAY " Error: Rate must be between 0 and 1" SET CALCULATION-ERROR TO TRUE END-IF. CALCULATE-COMPOUND-INTEREST. *> Simple compound interest calculation ADD 1 TO WS-CALCULATION-COUNT IF FIRST-TIME DISPLAY " This is the first calculation in this instance" SET NOT-FIRST-TIME TO TRUE END-IF COMPUTE WS-MONTHLY-RATE = LS-ANNUAL-RATE / 12 COMPUTE WS-COMPOUND-FACTOR = 1 + WS-MONTHLY-RATE *> Calculate for 12 months MOVE LS-PRINCIPAL TO WS-INTERMEDIATE-RESULT PERFORM VARYING WS-ITERATION-COUNT FROM 1 BY 1 UNTIL WS-ITERATION-COUNT > 12 COMPUTE WS-INTERMEDIATE-RESULT = WS-INTERMEDIATE-RESULT * WS-COMPOUND-FACTOR END-PERFORM MOVE WS-INTERMEDIATE-RESULT TO LS-CALCULATED-RESULT. UPDATE-STATISTICS. ADD LS-PRINCIPAL TO WS-TOTAL-PROCESSED DISPLAY " Calculation #" WS-CALCULATION-COUNT " completed" DISPLAY " Running total processed: $" WS-TOTAL-PROCESSED. DISPLAY-INTERNAL-STATE. DISPLAY " Internal state:" DISPLAY " Calculations performed: " WS-CALCULATION-COUNT DISPLAY " Total amount processed: $" WS-TOTAL-PROCESSED DISPLAY " Compound factor: " WS-COMPOUND-FACTOR. *> =============================================== *> NON-INITIAL SUBPROGRAM (FOR COMPARISON) *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. REGULAR-CALCULATOR. DATA DIVISION. WORKING-STORAGE SECTION. *> These values persist between program calls 01 WS-INTERNAL-COUNTERS. 05 WS-CALCULATION-COUNT PIC 9(3) VALUE 0. 05 WS-ITERATION-COUNT PIC 9(4) VALUE 0. 05 WS-TOTAL-PROCESSED PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-DATA. 05 WS-COMPOUND-FACTOR PIC 9V99999 VALUE 1.0. 05 WS-MONTHLY-RATE PIC 9V99999 VALUE 0. 05 WS-INTERMEDIATE-RESULT PIC 9(10)V99 VALUE 0. 01 WS-STATUS-FLAGS. 05 WS-FIRST-CALCULATION PIC X VALUE 'Y'. 88 FIRST-TIME VALUE 'Y'. 88 NOT-FIRST-TIME VALUE 'N'. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 88 CALCULATION-ERROR VALUE 'Y'. 88 NO-ERROR VALUE 'N'. LINKAGE SECTION. 01 LS-PRINCIPAL PIC 9(8)V99. 01 LS-ANNUAL-RATE PIC 9V9999. 01 LS-CALCULATED-RESULT PIC 9(10)V99. PROCEDURE DIVISION USING LS-PRINCIPAL LS-ANNUAL-RATE LS-CALCULATED-RESULT. REGULAR-PROGRAM-MAIN. DISPLAY " REGULAR PROGRAM - Using persistent data" DISPLAY " Calculation count continues from: " WS-CALCULATION-COUNT DISPLAY " Total processed continues from: $" WS-TOTAL-PROCESSED PERFORM VALIDATE-INPUT IF NO-ERROR PERFORM CALCULATE-COMPOUND-INTEREST PERFORM UPDATE-STATISTICS PERFORM DISPLAY-INTERNAL-STATE ELSE MOVE 0 TO LS-CALCULATED-RESULT END-IF GOBACK. VALIDATE-INPUT. SET NO-ERROR TO TRUE IF LS-PRINCIPAL <= 0 DISPLAY " Error: Principal must be positive" SET CALCULATION-ERROR TO TRUE END-IF IF LS-ANNUAL-RATE <= 0 OR LS-ANNUAL-RATE > 1 DISPLAY " Error: Rate must be between 0 and 1" SET CALCULATION-ERROR TO TRUE END-IF. CALCULATE-COMPOUND-INTEREST. ADD 1 TO WS-CALCULATION-COUNT IF FIRST-TIME DISPLAY " This is the first calculation ever" SET NOT-FIRST-TIME TO TRUE ELSE DISPLAY " This is calculation #" WS-CALCULATION-COUNT END-IF COMPUTE WS-MONTHLY-RATE = LS-ANNUAL-RATE / 12 COMPUTE WS-COMPOUND-FACTOR = 1 + WS-MONTHLY-RATE MOVE LS-PRINCIPAL TO WS-INTERMEDIATE-RESULT PERFORM VARYING WS-ITERATION-COUNT FROM 1 BY 1 UNTIL WS-ITERATION-COUNT > 12 COMPUTE WS-INTERMEDIATE-RESULT = WS-INTERMEDIATE-RESULT * WS-COMPOUND-FACTOR END-PERFORM MOVE WS-INTERMEDIATE-RESULT TO LS-CALCULATED-RESULT. UPDATE-STATISTICS. ADD LS-PRINCIPAL TO WS-TOTAL-PROCESSED DISPLAY " Cumulative calculation #" WS-CALCULATION-COUNT " completed" DISPLAY " Cumulative total processed: $" WS-TOTAL-PROCESSED. DISPLAY-INTERNAL-STATE. DISPLAY " Persistent state:" DISPLAY " Total calculations: " WS-CALCULATION-COUNT DISPLAY " Cumulative amount: $" WS-TOTAL-PROCESSED DISPLAY " Last compound factor: " WS-COMPOUND-FACTOR. *> =============================================== *> ADVANCED INITIAL PROGRAM EXAMPLES *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. DATA-VALIDATOR IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VALIDATION-WORKSPACE. 05 WS-ERROR-COUNT PIC 9(3) VALUE 0. 05 WS-WARNING-COUNT PIC 9(3) VALUE 0. 05 WS-RECORDS-PROCESSED PIC 9(6) VALUE 0. 05 WS-VALIDATION-LEVEL PIC 9 VALUE 1. 01 WS-ERROR-MESSAGES. 05 WS-ERROR-TABLE OCCURS 50 TIMES. 10 WS-ERROR-CODE PIC X(5). 10 WS-ERROR-MESSAGE PIC X(50). 10 WS-ERROR-SEVERITY PIC X(7). 01 WS-VALIDATION-FLAGS. 05 WS-STRICT-MODE PIC X VALUE 'N'. 88 STRICT-VALIDATION VALUE 'Y'. 88 NORMAL-VALIDATION VALUE 'N'. 05 WS-INITIALIZED PIC X VALUE 'N'. 88 VALIDATOR-READY VALUE 'Y'. 88 NOT-INITIALIZED VALUE 'N'. LINKAGE SECTION. 01 LS-INPUT-RECORD PIC X(100). 01 LS-VALIDATION-RESULT PIC X(10). 01 LS-ERROR-DETAILS PIC X(200). PROCEDURE DIVISION USING LS-INPUT-RECORD LS-VALIDATION-RESULT LS-ERROR-DETAILS. VALIDATOR-MAIN. DISPLAY " DATA VALIDATOR - Fresh instance started" DISPLAY " Error count reset to: " WS-ERROR-COUNT DISPLAY " Records processed reset to: " WS-RECORDS-PROCESSED PERFORM INITIALIZE-VALIDATOR PERFORM VALIDATE-RECORD PERFORM FINALIZE-VALIDATION GOBACK. INITIALIZE-VALIDATOR. *> This runs fresh every time due to INITIAL DISPLAY " Initializing validator (fresh each time)..." MOVE 1 TO WS-VALIDATION-LEVEL SET NORMAL-VALIDATION TO TRUE SET VALIDATOR-READY TO TRUE *> Initialize error table PERFORM VARYING WS-ERROR-COUNT FROM 1 BY 1 UNTIL WS-ERROR-COUNT > 50 MOVE SPACES TO WS-ERROR-TABLE(WS-ERROR-COUNT) END-PERFORM MOVE 0 TO WS-ERROR-COUNT. VALIDATE-RECORD. ADD 1 TO WS-RECORDS-PROCESSED *> Perform various validations IF LS-INPUT-RECORD = SPACES PERFORM ADD-ERROR END-IF IF LS-INPUT-RECORD(1:1) NOT ALPHABETIC PERFORM ADD-WARNING END-IF *> Set result based on validation IF WS-ERROR-COUNT = 0 MOVE "VALID" TO LS-VALIDATION-RESULT ELSE MOVE "INVALID" TO LS-VALIDATION-RESULT END-IF. ADD-ERROR. ADD 1 TO WS-ERROR-COUNT MOVE "E001" TO WS-ERROR-CODE(WS-ERROR-COUNT) MOVE "Record is blank" TO WS-ERROR-MESSAGE(WS-ERROR-COUNT) MOVE "ERROR" TO WS-ERROR-SEVERITY(WS-ERROR-COUNT). ADD-WARNING. ADD 1 TO WS-WARNING-COUNT ADD 1 TO WS-ERROR-COUNT MOVE "W001" TO WS-ERROR-CODE(WS-ERROR-COUNT) MOVE "First character should be alphabetic" TO WS-ERROR-MESSAGE(WS-ERROR-COUNT) MOVE "WARNING" TO WS-ERROR-SEVERITY(WS-ERROR-COUNT). FINALIZE-VALIDATION. STRING "Errors: " WS-ERROR-COUNT " Warnings: " WS-WARNING-COUNT " Records: " WS-RECORDS-PROCESSED DELIMITED BY SIZE INTO LS-ERROR-DETAILS DISPLAY " Validation complete - Errors: " WS-ERROR-COUNT DISPLAY " This instance processed: " WS-RECORDS-PROCESSED " records". *> =============================================== *> UTILITY INITIAL PROGRAM FOR CONFIGURATION *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. CONFIG-MANAGER IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CONFIG-DATA. 05 WS-CONFIG-LOADED PIC X VALUE 'N'. 88 CONFIG-AVAILABLE VALUE 'Y'. 88 CONFIG-NOT-LOADED VALUE 'N'. 05 WS-CONFIG-VERSION PIC X(10) VALUE SPACES. 05 WS-CONFIG-TIMESTAMP PIC X(20) VALUE SPACES. 01 WS-DEFAULT-SETTINGS. 05 WS-TIMEOUT-VALUE PIC 9(4) VALUE 30. 05 WS-RETRY-COUNT PIC 9(2) VALUE 3. 05 WS-DEBUG-MODE PIC X VALUE 'N'. 05 WS-LOG-LEVEL PIC 9 VALUE 2. LINKAGE SECTION. 01 LS-CONFIG-REQUEST PIC X(20). 01 LS-CONFIG-VALUE PIC X(50). 01 LS-STATUS-CODE PIC 9(2). PROCEDURE DIVISION USING LS-CONFIG-REQUEST LS-CONFIG-VALUE LS-STATUS-CODE. CONFIG-MANAGER-MAIN. DISPLAY " CONFIG MANAGER - Fresh configuration instance" DISPLAY " Loading default settings..." PERFORM LOAD-DEFAULT-CONFIG PERFORM PROCESS-CONFIG-REQUEST GOBACK. LOAD-DEFAULT-CONFIG. *> Always loads fresh defaults due to INITIAL DISPLAY " Loading fresh default configuration" MOVE "1.0.0" TO WS-CONFIG-VERSION ACCEPT WS-CONFIG-TIMESTAMP FROM TIME SET CONFIG-AVAILABLE TO TRUE DISPLAY " Default timeout: " WS-TIMEOUT-VALUE " seconds" DISPLAY " Default retries: " WS-RETRY-COUNT. PROCESS-CONFIG-REQUEST. EVALUATE LS-CONFIG-REQUEST WHEN "TIMEOUT" MOVE WS-TIMEOUT-VALUE TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN "RETRY-COUNT" MOVE WS-RETRY-COUNT TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN "VERSION" MOVE WS-CONFIG-VERSION TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN OTHER MOVE "UNKNOWN-SETTING" TO LS-CONFIG-VALUE MOVE 1 TO LS-STATUS-CODE END-EVALUATE.

INITIAL vs Non-INITIAL Comparison

INITIAL Programs
  • • Fresh data on every call
  • • Predictable starting state
  • • No residual values
  • • Slight performance overhead
  • • Ideal for reentrant code
Non-INITIAL Programs
  • • Data persists between calls
  • • Faster execution
  • • Can maintain state
  • • Potential for unexpected values
  • • Useful for caching

Knowledge Check

Test Your Understanding

Question 1: Behavior

What happens to Working-Storage data in an INITIAL program?

Answer: All Working-Storage data items are reset to their initial values (VALUE clauses or default values) each time the program is called, ensuring a fresh start on every invocation.

Question 2: Use Cases

When is it important to use the INITIAL clause?

Answer: Use INITIAL when you need predictable starting states, when programs are called multiple times with different data, for reentrant programs, or when residual values from previous calls could cause problems.