MainframeMaster

COBOL Tutorial

COBOL INVOKE and END-INVOKE

The INVOKE and END-INVOKE statements represent sophisticated object-oriented programming constructs within modern COBOL environments, providing comprehensive method invocation capabilities that enable object interaction, dynamic method calling, and advanced exception handling. These statements embody the principles of object-oriented design by supporting polymorphism, encapsulation, and inheritance while maintaining type safety, ensuring proper method resolution, and facilitating robust object communication across enterprise applications requiring sophisticated object models, dynamic method dispatch, and comprehensive exception management with reliable execution patterns and optimized performance characteristics.

INVOKE Statement Syntax

Method Invocation Patterns
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
*> Basic INVOKE syntax INVOKE object-reference method-name [USING parameter-list] [RETURNING return-value] [ON EXCEPTION imperative-statements] [NOT ON EXCEPTION imperative-statements] END-INVOKE *> Static method invocation INVOKE class-name method-name [USING parameter-list] [RETURNING return-value] END-INVOKE *> Factory method invocation INVOKE class-name "NEW" [USING parameter-list] RETURNING object-reference END-INVOKE *> Self method invocation INVOKE SELF method-name [USING parameter-list] [RETURNING return-value] END-INVOKE *> Super method invocation INVOKE SUPER method-name [USING parameter-list] [RETURNING return-value] END-INVOKE *> Basic examples 01 WS-CUSTOMER-OBJECT OBJECT REFERENCE. 01 WS-RESULT PIC X(100). 01 WS-AMOUNT PIC 9(8)V99. PROCEDURE DIVISION. *> Create object instance INVOKE Customer "NEW" RETURNING WS-CUSTOMER-OBJECT *> Call instance method INVOKE WS-CUSTOMER-OBJECT "getName" RETURNING WS-RESULT *> Call method with parameters INVOKE WS-CUSTOMER-OBJECT "setBalance" USING WS-AMOUNT *> Method with exception handling INVOKE WS-CUSTOMER-OBJECT "processPayment" USING WS-AMOUNT ON EXCEPTION DISPLAY "Payment processing failed" NOT ON EXCEPTION DISPLAY "Payment processed successfully" END-INVOKE
Object-Oriented
Method Calls
Exception Handling

Comprehensive INVOKE 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
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
IDENTIFICATION DIVISION. PROGRAM-ID. INVOKE-DEMONSTRATION. *> Object-oriented customer management example CLASS-ID. Customer. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS Customer. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-INSTANCE-DATA. 05 WS-CUSTOMER-ID PIC X(10). 05 WS-CUSTOMER-NAME PIC X(50). 05 WS-BALANCE PIC S9(10)V99. 05 WS-CREDIT-LIMIT PIC 9(10)V99. 05 WS-STATUS PIC X(10). OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. 01 INSTANCE-VARIABLES. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(50). 05 ACCOUNT-BALANCE PIC S9(10)V99. 05 CREDIT-LIMIT PIC 9(10)V99. 05 ACCOUNT-STATUS PIC X(10) VALUE "ACTIVE". PROCEDURE DIVISION. *> Constructor method METHOD-ID. "NEW". DATA DIVISION. LINKAGE SECTION. 01 LK-CUSTOMER-ID PIC X(10). 01 LK-CUSTOMER-NAME PIC X(50). 01 LK-CREDIT-LIMIT PIC 9(10)V99. PROCEDURE DIVISION USING LK-CUSTOMER-ID LK-CUSTOMER-NAME LK-CREDIT-LIMIT. MOVE LK-CUSTOMER-ID TO CUSTOMER-ID MOVE LK-CUSTOMER-NAME TO CUSTOMER-NAME MOVE LK-CREDIT-LIMIT TO CREDIT-LIMIT MOVE 0 TO ACCOUNT-BALANCE MOVE "ACTIVE" TO ACCOUNT-STATUS DISPLAY "Customer created: " CUSTOMER-NAME END METHOD "NEW". *> Getter methods METHOD-ID. "getName". DATA DIVISION. LINKAGE SECTION. 01 LK-RETURN-NAME PIC X(50). PROCEDURE DIVISION RETURNING LK-RETURN-NAME. MOVE CUSTOMER-NAME TO LK-RETURN-NAME END METHOD "getName". METHOD-ID. "getBalance". DATA DIVISION. LINKAGE SECTION. 01 LK-RETURN-BALANCE PIC S9(10)V99. PROCEDURE DIVISION RETURNING LK-RETURN-BALANCE. MOVE ACCOUNT-BALANCE TO LK-RETURN-BALANCE END METHOD "getBalance". METHOD-ID. "getStatus". DATA DIVISION. LINKAGE SECTION. 01 LK-RETURN-STATUS PIC X(10). PROCEDURE DIVISION RETURNING LK-RETURN-STATUS. MOVE ACCOUNT-STATUS TO LK-RETURN-STATUS END METHOD "getStatus". *> Setter methods METHOD-ID. "setName". DATA DIVISION. LINKAGE SECTION. 01 LK-NEW-NAME PIC X(50). PROCEDURE DIVISION USING LK-NEW-NAME. MOVE LK-NEW-NAME TO CUSTOMER-NAME DISPLAY "Customer name updated to: " CUSTOMER-NAME END METHOD "setName". *> Business logic methods METHOD-ID. "deposit". DATA DIVISION. LINKAGE SECTION. 01 LK-AMOUNT PIC 9(8)V99. 01 LK-SUCCESS-FLAG PIC X. PROCEDURE DIVISION USING LK-AMOUNT RETURNING LK-SUCCESS-FLAG. IF LK-AMOUNT > 0 ADD LK-AMOUNT TO ACCOUNT-BALANCE MOVE "Y" TO LK-SUCCESS-FLAG DISPLAY "Deposited $" LK-AMOUNT " New balance: $" ACCOUNT-BALANCE ELSE MOVE "N" TO LK-SUCCESS-FLAG DISPLAY "Invalid deposit amount: $" LK-AMOUNT END-IF END METHOD "deposit". METHOD-ID. "withdraw". DATA DIVISION. LINKAGE SECTION. 01 LK-AMOUNT PIC 9(8)V99. 01 LK-SUCCESS-FLAG PIC X. PROCEDURE DIVISION USING LK-AMOUNT RETURNING LK-SUCCESS-FLAG. IF LK-AMOUNT > 0 IF ACCOUNT-BALANCE + CREDIT-LIMIT >= LK-AMOUNT SUBTRACT LK-AMOUNT FROM ACCOUNT-BALANCE MOVE "Y" TO LK-SUCCESS-FLAG DISPLAY "Withdrew $" LK-AMOUNT " New balance: $" ACCOUNT-BALANCE ELSE MOVE "N" TO LK-SUCCESS-FLAG DISPLAY "Insufficient funds for withdrawal of $" LK-AMOUNT END-IF ELSE MOVE "N" TO LK-SUCCESS-FLAG DISPLAY "Invalid withdrawal amount: $" LK-AMOUNT END-IF END METHOD "withdraw". METHOD-ID. "transfer". DATA DIVISION. LINKAGE SECTION. 01 LK-AMOUNT PIC 9(8)V99. 01 LK-TARGET-CUSTOMER OBJECT REFERENCE. 01 LK-SUCCESS-FLAG PIC X. PROCEDURE DIVISION USING LK-AMOUNT LK-TARGET-CUSTOMER RETURNING LK-SUCCESS-FLAG. *> Withdraw from this account INVOKE SELF "withdraw" USING LK-AMOUNT RETURNING LK-SUCCESS-FLAG IF LK-SUCCESS-FLAG = "Y" *> Deposit to target account INVOKE LK-TARGET-CUSTOMER "deposit" USING LK-AMOUNT RETURNING LK-SUCCESS-FLAG IF LK-SUCCESS-FLAG = "Y" DISPLAY "Transfer completed successfully" ELSE *> Rollback withdrawal INVOKE SELF "deposit" USING LK-AMOUNT RETURNING LK-SUCCESS-FLAG MOVE "N" TO LK-SUCCESS-FLAG DISPLAY "Transfer failed - deposit to target failed" END-IF ELSE DISPLAY "Transfer failed - insufficient funds" END-IF END METHOD "transfer". METHOD-ID. "calculateInterest". DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-INTEREST-RATE PIC 9V9999 VALUE 0.0325. 01 WS-INTEREST-AMOUNT PIC S9(8)V99. LINKAGE SECTION. 01 LK-RETURN-INTEREST PIC S9(8)V99. PROCEDURE DIVISION RETURNING LK-RETURN-INTEREST. IF ACCOUNT-BALANCE > 0 COMPUTE WS-INTEREST-AMOUNT = ACCOUNT-BALANCE * WS-INTEREST-RATE MOVE WS-INTEREST-AMOUNT TO LK-RETURN-INTEREST DISPLAY "Interest calculated: $" WS-INTEREST-AMOUNT ELSE MOVE 0 TO LK-RETURN-INTEREST END-IF END METHOD "calculateInterest". METHOD-ID. "closeAccount". PROCEDURE DIVISION. IF ACCOUNT-BALANCE = 0 MOVE "CLOSED" TO ACCOUNT-STATUS DISPLAY "Account closed for customer: " CUSTOMER-NAME ELSE DISPLAY "Cannot close account with balance: $" ACCOUNT-BALANCE END-IF END METHOD "closeAccount". END OBJECT. END CLASS Customer. *> Main program demonstrating INVOKE usage IDENTIFICATION DIVISION. PROGRAM-ID. CUSTOMER-DEMO. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS Customer. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CUSTOMER-OBJECTS. 05 WS-CUSTOMER1 OBJECT REFERENCE. 05 WS-CUSTOMER2 OBJECT REFERENCE. 05 WS-CUSTOMER3 OBJECT REFERENCE. 01 WS-WORKING-FIELDS. 05 WS-CUSTOMER-NAME PIC X(50). 05 WS-BALANCE PIC S9(10)V99. 05 WS-AMOUNT PIC 9(8)V99. 05 WS-SUCCESS-FLAG PIC X. 05 WS-INTEREST PIC S9(8)V99. 05 WS-STATUS PIC X(10). 01 WS-DEMO-DATA. 05 WS-DEMO-CUSTOMERS. 10 FILLER PIC X(60) VALUE "CUST001ALICE JOHNSON 000500000". 10 FILLER PIC X(60) VALUE "CUST002BOB SMITH 001000000". 10 FILLER PIC X(60) VALUE "CUST003CAROL WILLIAMS 000750000". 05 WS-DEMO-TABLE REDEFINES WS-DEMO-CUSTOMERS. 10 WS-DEMO-ENTRY OCCURS 3 TIMES. 15 WS-DEMO-ID PIC X(7). 15 WS-DEMO-NAME PIC X(40). 15 WS-DEMO-LIMIT PIC 9(9)V99. 01 WS-COUNTERS. 05 WS-CUSTOMER-COUNT PIC 9(2) VALUE 0. 05 WS-TRANSACTION-COUNT PIC 9(4) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM DEMONSTRATE-OBJECT-CREATION PERFORM DEMONSTRATE-BASIC-OPERATIONS PERFORM DEMONSTRATE-BUSINESS-LOGIC PERFORM DEMONSTRATE-EXCEPTION-HANDLING PERFORM DEMONSTRATE-POLYMORPHIC-BEHAVIOR PERFORM CLEANUP-OBJECTS STOP RUN. DEMONSTRATE-OBJECT-CREATION. DISPLAY "=== OBJECT CREATION WITH INVOKE ===" *> Create customer objects using constructor INVOKE Customer "NEW" USING "CUST001" "ALICE JOHNSON" 5000.00 RETURNING WS-CUSTOMER1 ON EXCEPTION DISPLAY "Error creating customer 1" NOT ON EXCEPTION ADD 1 TO WS-CUSTOMER-COUNT DISPLAY "Customer 1 created successfully" END-INVOKE INVOKE Customer "NEW" USING "CUST002" "BOB SMITH" 10000.00 RETURNING WS-CUSTOMER2 ON EXCEPTION DISPLAY "Error creating customer 2" NOT ON EXCEPTION ADD 1 TO WS-CUSTOMER-COUNT DISPLAY "Customer 2 created successfully" END-INVOKE INVOKE Customer "NEW" USING "CUST003" "CAROL WILLIAMS" 7500.00 RETURNING WS-CUSTOMER3 ON EXCEPTION DISPLAY "Error creating customer 3" NOT ON EXCEPTION ADD 1 TO WS-CUSTOMER-COUNT DISPLAY "Customer 3 created successfully" END-INVOKE DISPLAY "Total customers created: " WS-CUSTOMER-COUNT DISPLAY SPACES. DEMONSTRATE-BASIC-OPERATIONS. DISPLAY "=== BASIC OBJECT OPERATIONS ===" *> Get customer information INVOKE WS-CUSTOMER1 "getName" RETURNING WS-CUSTOMER-NAME INVOKE WS-CUSTOMER1 "getBalance" RETURNING WS-BALANCE INVOKE WS-CUSTOMER1 "getStatus" RETURNING WS-STATUS DISPLAY "Customer 1 Details:" DISPLAY " Name: " WS-CUSTOMER-NAME DISPLAY " Balance: $" WS-BALANCE DISPLAY " Status: " WS-STATUS *> Perform basic transactions MOVE 1000.00 TO WS-AMOUNT INVOKE WS-CUSTOMER1 "deposit" USING WS-AMOUNT RETURNING WS-SUCCESS-FLAG ON EXCEPTION DISPLAY "Deposit operation failed" NOT ON EXCEPTION IF WS-SUCCESS-FLAG = "Y" ADD 1 TO WS-TRANSACTION-COUNT DISPLAY "Deposit successful" ELSE DISPLAY "Deposit rejected" END-IF END-INVOKE MOVE 250.00 TO WS-AMOUNT INVOKE WS-CUSTOMER1 "withdraw" USING WS-AMOUNT RETURNING WS-SUCCESS-FLAG ON EXCEPTION DISPLAY "Withdrawal operation failed" NOT ON EXCEPTION IF WS-SUCCESS-FLAG = "Y" ADD 1 TO WS-TRANSACTION-COUNT DISPLAY "Withdrawal successful" ELSE DISPLAY "Withdrawal rejected" END-IF END-INVOKE DISPLAY SPACES. DEMONSTRATE-BUSINESS-LOGIC. DISPLAY "=== BUSINESS LOGIC OPERATIONS ===" *> Customer 2 operations MOVE 2000.00 TO WS-AMOUNT INVOKE WS-CUSTOMER2 "deposit" USING WS-AMOUNT RETURNING WS-SUCCESS-FLAG *> Transfer between customers MOVE 500.00 TO WS-AMOUNT INVOKE WS-CUSTOMER2 "transfer" USING WS-AMOUNT WS-CUSTOMER1 RETURNING WS-SUCCESS-FLAG ON EXCEPTION DISPLAY "Transfer operation encountered exception" NOT ON EXCEPTION IF WS-SUCCESS-FLAG = "Y" ADD 1 TO WS-TRANSACTION-COUNT DISPLAY "Transfer completed successfully" ELSE DISPLAY "Transfer failed" END-IF END-INVOKE *> Calculate interest for all customers INVOKE WS-CUSTOMER1 "calculateInterest" RETURNING WS-INTEREST DISPLAY "Customer 1 Interest: $" WS-INTEREST INVOKE WS-CUSTOMER2 "calculateInterest" RETURNING WS-INTEREST DISPLAY "Customer 2 Interest: $" WS-INTEREST INVOKE WS-CUSTOMER3 "calculateInterest" RETURNING WS-INTEREST DISPLAY "Customer 3 Interest: $" WS-INTEREST DISPLAY SPACES. DEMONSTRATE-EXCEPTION-HANDLING. DISPLAY "=== EXCEPTION HANDLING ===" *> Test insufficient funds scenario MOVE 20000.00 TO WS-AMOUNT INVOKE WS-CUSTOMER1 "withdraw" USING WS-AMOUNT RETURNING WS-SUCCESS-FLAG ON EXCEPTION DISPLAY "Exception occurred during large withdrawal" PERFORM HANDLE-WITHDRAWAL-EXCEPTION NOT ON EXCEPTION IF WS-SUCCESS-FLAG = "Y" DISPLAY "Large withdrawal successful" ELSE DISPLAY "Large withdrawal rejected - business rules" END-IF END-INVOKE *> Test invalid amount scenario MOVE -100.00 TO WS-AMOUNT INVOKE WS-CUSTOMER1 "deposit" USING WS-AMOUNT RETURNING WS-SUCCESS-FLAG ON EXCEPTION DISPLAY "Exception occurred with negative deposit" PERFORM HANDLE-DEPOSIT-EXCEPTION NOT ON EXCEPTION DISPLAY "Negative deposit processed (unexpected)" END-INVOKE DISPLAY SPACES. HANDLE-WITHDRAWAL-EXCEPTION. DISPLAY "Handling withdrawal exception..." DISPLAY " Logging transaction attempt" DISPLAY " Notifying customer of failure" DISPLAY " Updating audit trail". HANDLE-DEPOSIT-EXCEPTION. DISPLAY "Handling deposit exception..." DISPLAY " Validating transaction data" DISPLAY " Recording error details". DEMONSTRATE-POLYMORPHIC-BEHAVIOR. DISPLAY "=== POLYMORPHIC BEHAVIOR ===" *> Process multiple customers using same interface PERFORM PROCESS-CUSTOMER-ACCOUNT USING WS-CUSTOMER1 PERFORM PROCESS-CUSTOMER-ACCOUNT USING WS-CUSTOMER2 PERFORM PROCESS-CUSTOMER-ACCOUNT USING WS-CUSTOMER3 DISPLAY SPACES. PROCESS-CUSTOMER-ACCOUNT USING LK-CUSTOMER. LINKAGE SECTION. 01 LK-CUSTOMER OBJECT REFERENCE. PROCEDURE DIVISION. *> Same method calls work on any customer object INVOKE LK-CUSTOMER "getName" RETURNING WS-CUSTOMER-NAME INVOKE LK-CUSTOMER "getBalance" RETURNING WS-BALANCE INVOKE LK-CUSTOMER "getStatus" RETURNING WS-STATUS DISPLAY "Processing account for: " WS-CUSTOMER-NAME DISPLAY " Current balance: $" WS-BALANCE DISPLAY " Account status: " WS-STATUS *> Apply interest if balance is positive IF WS-BALANCE > 0 INVOKE LK-CUSTOMER "calculateInterest" RETURNING WS-INTEREST DISPLAY " Interest earned: $" WS-INTEREST END-IF. CLEANUP-OBJECTS. DISPLAY "=== CLEANUP AND SUMMARY ===" *> Close accounts with zero balance INVOKE WS-CUSTOMER1 "getBalance" RETURNING WS-BALANCE IF WS-BALANCE = 0 INVOKE WS-CUSTOMER1 "closeAccount" END-IF INVOKE WS-CUSTOMER2 "getBalance" RETURNING WS-BALANCE IF WS-BALANCE = 0 INVOKE WS-CUSTOMER2 "closeAccount" END-IF INVOKE WS-CUSTOMER3 "getBalance" RETURNING WS-BALANCE IF WS-BALANCE = 0 INVOKE WS-CUSTOMER3 "closeAccount" END-IF *> Set object references to NULL for cleanup SET WS-CUSTOMER1 TO NULL SET WS-CUSTOMER2 TO NULL SET WS-CUSTOMER3 TO NULL DISPLAY "Total transactions processed: " WS-TRANSACTION-COUNT DISPLAY "Objects cleaned up successfully". *> Advanced INVOKE patterns ADVANCED-INVOKE-PATTERNS. DISPLAY "=== ADVANCED INVOKE PATTERNS ===" PERFORM DEMONSTRATE-FACTORY-METHODS PERFORM DEMONSTRATE-STATIC-METHODS PERFORM DEMONSTRATE-CHAINED-INVOCATIONS PERFORM DEMONSTRATE-CONDITIONAL-INVOCATION. DEMONSTRATE-FACTORY-METHODS. DISPLAY "Factory Method Pattern:" *> Using factory methods for object creation INVOKE Customer "createPremiumCustomer" USING "PREM001" "PREMIUM USER" 50000.00 RETURNING WS-CUSTOMER1 ON EXCEPTION DISPLAY "Factory method failed" NOT ON EXCEPTION DISPLAY "Premium customer created via factory" END-INVOKE. DEMONSTRATE-STATIC-METHODS. DISPLAY "Static Method Calls:" *> Call static utility methods INVOKE Customer "validateCustomerId" USING "CUST001" RETURNING WS-SUCCESS-FLAG IF WS-SUCCESS-FLAG = "Y" DISPLAY "Customer ID validation passed" ELSE DISPLAY "Customer ID validation failed" END-IF. DEMONSTRATE-CHAINED-INVOCATIONS. DISPLAY "Method Chaining Simulation:" *> Simulate fluent interface pattern INVOKE WS-CUSTOMER1 "deposit" USING 1000.00 RETURNING WS-SUCCESS-FLAG IF WS-SUCCESS-FLAG = "Y" INVOKE WS-CUSTOMER1 "calculateInterest" RETURNING WS-INTEREST INVOKE WS-CUSTOMER1 "deposit" USING WS-INTEREST RETURNING WS-SUCCESS-FLAG END-IF. DEMONSTRATE-CONDITIONAL-INVOCATION. DISPLAY "Conditional Method Invocation:" INVOKE WS-CUSTOMER1 "getStatus" RETURNING WS-STATUS EVALUATE WS-STATUS WHEN "ACTIVE" INVOKE WS-CUSTOMER1 "calculateInterest" RETURNING WS-INTEREST DISPLAY "Active account - interest calculated" WHEN "DORMANT" INVOKE WS-CUSTOMER1 "activateAccount" DISPLAY "Dormant account activated" WHEN "CLOSED" DISPLAY "Account is closed - no operations allowed" WHEN OTHER DISPLAY "Unknown account status: " WS-STATUS END-EVALUATE. ERROR-RECOVERY-PATTERNS. DISPLAY "=== ERROR RECOVERY PATTERNS ===" *> Retry pattern with INVOKE PERFORM RETRY-INVOKE-OPERATION *> Circuit breaker pattern simulation PERFORM CIRCUIT-BREAKER-INVOKE. RETRY-INVOKE-OPERATION. MOVE 3 TO WS-CUSTOMER-COUNT *> Retry counter PERFORM UNTIL WS-CUSTOMER-COUNT = 0 OR WS-SUCCESS-FLAG = "Y" INVOKE WS-CUSTOMER1 "complexOperation" RETURNING WS-SUCCESS-FLAG ON EXCEPTION SUBTRACT 1 FROM WS-CUSTOMER-COUNT DISPLAY "Retry attempt remaining: " WS-CUSTOMER-COUNT NOT ON EXCEPTION IF WS-SUCCESS-FLAG = "Y" DISPLAY "Operation succeeded after retry" ELSE SUBTRACT 1 FROM WS-CUSTOMER-COUNT END-IF END-INVOKE END-PERFORM IF WS-SUCCESS-FLAG NOT = "Y" DISPLAY "Operation failed after all retries" END-IF. CIRCUIT-BREAKER-INVOKE. *> Simulate circuit breaker pattern IF WS-TRANSACTION-COUNT < 10 *> Circuit open DISPLAY "Circuit breaker OPEN - operation blocked" ELSE INVOKE WS-CUSTOMER1 "riskyOperation" ON EXCEPTION DISPLAY "Circuit breaker triggered" MOVE 0 TO WS-TRANSACTION-COUNT *> Open circuit NOT ON EXCEPTION DISPLAY "Risky operation succeeded" END-INVOKE END-IF.

INVOKE Operation Types

Instance Methods
  • • Object instance method calls
  • • Parameter passing (USING)
  • • Return value handling (RETURNING)
  • • Exception handling (ON EXCEPTION)
  • • Self-referential calls (SELF)
Static Methods
  • • Class-level method invocation
  • • Factory method patterns
  • • Utility method calls
  • • Constructor invocation (NEW)
  • • Inheritance support (SUPER)

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Purpose

What is the primary purpose of INVOKE and END-INVOKE?

Answer: INVOKE and END-INVOKE are used in Object-Oriented COBOL to call methods on object instances, handle method parameters and return values, and manage exceptions that may occur during method execution.

Question 2: Exception Handling

How do you handle exceptions in INVOKE statements?

Answer: Use ON EXCEPTION clause within the INVOKE statement to handle method execution errors, and NOT ON EXCEPTION for successful execution. END-INVOKE marks the end of the exception handling block.

Question 3: Method Types

What types of methods can be called with INVOKE?

Answer: INVOKE can call instance methods on objects, static methods on classes, factory methods (like "NEW"), self-referential methods (SELF), and inherited methods (SUPER).