MainframeMaster

COBOL Tutorial

COBOL Verbs Overview

Progress0 of 0 lessons

Introduction to COBOL Verbs

COBOL verbs are the action words that perform operations in a COBOL program. They form the core of the PROCEDURE DIVISION, where they execute the actual instructions that manipulate data, control program flow, and interact with external resources.

COBOL verbs can be categorized into several groups based on their function. Understanding these categories helps organize code and clarify the purpose of different operations in your program.

Basic Verb Structure

cobol
1
verb-name operand1, operand2 ... [optional-phrases]

COBOL verbs typically appear at the beginning of a statement, followed by their operands and optional phrases.

Computational Verbs

Computational verbs perform arithmetic operations on numeric data. These verbs are fundamental for business applications that need to calculate totals, percentages, averages, and other numerical values.

ADD

cobol
1
2
3
4
ADD A, B, C TO TOTAL. ADD A, B GIVING SUM. ADD A TO B ROUNDED. ADD A TO B ON SIZE ERROR DISPLAY "Overflow".

Adds two or more numeric values.

SUBTRACT

cobol
1
2
3
4
SUBTRACT A FROM B. SUBTRACT A, B FROM C. SUBTRACT A, B FROM C GIVING RESULT. SUBTRACT A FROM B ROUNDED.

Subtracts one or more numeric values from another.

MULTIPLY

cobol
1
2
3
4
MULTIPLY A BY B. MULTIPLY A BY B GIVING PRODUCT. MULTIPLY A BY B ROUNDED. MULTIPLY A BY B ON SIZE ERROR PERFORM ERROR-ROUTINE.

Multiplies two numeric values.

DIVIDE

cobol
1
2
3
4
DIVIDE A INTO B. DIVIDE A INTO B GIVING QUOTIENT. DIVIDE A INTO B GIVING QUOTIENT REMAINDER REMAINDER-FIELD. DIVIDE A BY B GIVING QUOTIENT.

Divides one numeric value by another.

COMPUTE

cobol
1
2
3
4
COMPUTE RESULT = A + B * C. COMPUTE AREA = 3.14159 * RADIUS ** 2. COMPUTE DISCOUNT ROUNDED = PRICE * 0.25. COMPUTE TOTAL = SUBTOTAL + (SUBTOTAL * TAX-RATE) ON SIZE ERROR PERFORM OVERFLOW-ROUTINE.

Evaluates arithmetic expressions using multiple operations and assigns the result to a variable.

Common Features of Computational Verbs

  • ROUNDED option - Rounds the result to the precision defined in the PICTURE clause
  • ON SIZE ERROR phrase - Executed when the result cannot fit in the receiving field
  • NOT ON SIZE ERROR phrase - Executed when no size error occurs
  • GIVING option - Specifies where to store the result (doesn't modify the operands)

Example: Using Multiple Computational Verbs

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
COMPUTE GROSS-PAY = HOURS-WORKED * HOURLY-RATE. IF HOURS-WORKED > 40 MULTIPLY HOURLY-RATE BY 1.5 GIVING OVERTIME-RATE SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE GIVING OVERTIME-PAY ADD OVERTIME-PAY TO GROSS-PAY END-IF. COMPUTE NET-PAY ROUNDED = GROSS-PAY * (1 - TAX-RATE). IF NET-PAY > 0 MULTIPLY PRIOR-BALANCE BY -1 GIVING NEGATIVE-BALANCE ADD NET-PAY TO NEGATIVE-BALANCE IF NEGATIVE-BALANCE > 0 MOVE NEGATIVE-BALANCE TO NET-PAY MOVE 0 TO PRIOR-BALANCE ELSE ADD NEGATIVE-BALANCE TO PRIOR-BALANCE MOVE 0 TO NET-PAY END-IF END-IF.

This example shows how different computational verbs work together to calculate an employee's paycheck.

Data Movement Verbs

Data movement verbs transfer data between memory locations, initialize fields, and manipulate strings. These operations are essential for data preparation, formatting, and transformation.

MOVE

cobol
1
2
3
4
5
6
MOVE "JOHN" TO CUSTOMER-NAME. MOVE SPACES TO OUTPUT-FIELD. MOVE ZEROS TO COUNTER. MOVE "123" TO NUMERIC-FIELD. MOVE CUSTOMER-RECORD TO OUTPUT-RECORD. MOVE CORRESPONDING INPUT-REC TO OUTPUT-REC.

Copies data from one field to another. One of the most commonly used COBOL verbs.

INITIALIZE

cobol
1
2
3
4
5
6
INITIALIZE CUSTOMER-RECORD. INITIALIZE OUTPUT-AREA REPLACING NUMERIC DATA BY ZEROS ALPHANUMERIC DATA BY SPACES. INITIALIZE WS-TABLE-AREA REPLACING NUMERIC DATA BY 1.

Sets fields to their default values or specified values. More powerful than MOVE for complex structures.

STRING

cobol
1
2
3
4
5
6
7
STRING "First" DELIMITED BY SIZE " " DELIMITED BY SIZE "Last" DELIMITED BY SIZE INTO FULL-NAME WITH POINTER NAME-PTR ON OVERFLOW PERFORM ERROR-ROUTINE END-STRING.

Concatenates strings with powerful formatting options.

UNSTRING

cobol
1
2
3
4
5
6
7
UNSTRING FULL-NAME DELIMITED BY ALL SPACES INTO FIRST-NAME LAST-NAME TALLYING IN WORD-COUNT ON OVERFLOW PERFORM ERROR-ROUTINE END-UNSTRING.

Splits strings into multiple fields based on delimiters.

INSPECT

cobol
1
2
3
4
5
INSPECT FIELD-1 TALLYING COUNT-1 FOR ALL "A". INSPECT FIELD-2 REPLACING ALL "a" BY "A". INSPECT FIELD-3 CONVERTING "abcdef" TO "ABCDEF". INSPECT FIELD-4 TALLYING COUNT-2 FOR CHARACTERS BEFORE INITIAL "Z".

Counts, replaces, or converts characters in strings.

SET

cobol
1
2
3
4
5
SET INDEX-1 TO 1. SET INDEX-1 UP BY 2. SET ADDRESS OF WS-POINTER TO ADDRESS OF WS-DATA. SET BONUS-SWITCH TO TRUE. SET TABLE-INDEX TO 5.

Assigns values to special items like indexes, pointers, and condition names.

MOVE CORRESPONDING

A special form of MOVE that copies fields with matching names between group items:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
01 INPUT-RECORD. 05 CUSTOMER-ID PIC X(6). 05 CUSTOMER-NAME PIC X(30). 05 BALANCE PIC 9(7)V99. 05 OTHER-DATA PIC X(20). 01 OUTPUT-RECORD. 05 CUSTOMER-ID PIC X(6). 05 CUSTOMER-NAME PIC X(30). 05 TAX-ID PIC X(9). 05 BALANCE PIC 9(7)V99. MOVE CORRESPONDING INPUT-RECORD TO OUTPUT-RECORD. *> Only CUSTOMER-ID, CUSTOMER-NAME, and BALANCE are copied

Example: Complex String 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
*> Input field contains "JOHN DOE,123 MAIN ST,ANYTOWN,TX,12345" *> Initialize work fields MOVE SPACES TO FIRST-NAME LAST-NAME STREET-ADDRESS CITY STATE ZIP-CODE. MOVE 1 TO PTR. *> Extract name UNSTRING INPUT-FIELD DELIMITED BY "," INTO FULL-NAME WITH POINTER PTR END-UNSTRING. *> Split name into first and last UNSTRING FULL-NAME DELIMITED BY ALL SPACES INTO FIRST-NAME LAST-NAME END-UNSTRING. *> Convert name to proper case INSPECT FIRST-NAME REPLACING ALL "JOHN" BY "John". INSPECT LAST-NAME REPLACING ALL "DOE" BY "Doe". *> Extract address UNSTRING INPUT-FIELD DELIMITED BY "," INTO WS-TEMP STREET-ADDRESS CITY STATE ZIP-CODE WITH POINTER PTR END-UNSTRING. *> Build formatted output STRING "Customer: " DELIMITED BY SIZE FIRST-NAME DELIMITED BY SPACE " " DELIMITED BY SIZE LAST-NAME DELIMITED BY SIZE INTO OUTPUT-LINE-1 END-STRING. STRING "Address: " DELIMITED BY SIZE STREET-ADDRESS DELIMITED BY SIZE INTO OUTPUT-LINE-2 END-STRING. STRING "Location: " DELIMITED BY SIZE CITY DELIMITED BY SIZE ", " DELIMITED BY SIZE STATE DELIMITED BY SIZE " " DELIMITED BY SIZE ZIP-CODE DELIMITED BY SIZE INTO OUTPUT-LINE-3 END-STRING.

This example demonstrates how data movement verbs work together to parse and format a customer address.

Control Flow Verbs

Control flow verbs determine the sequence of operations in a COBOL program. They include branching statements, looping constructs, and procedural invocation verbs. These verbs give the program its logical structure.

IF

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
IF BALANCE > 1000 PERFORM PROCESS-PREMIUM-CUSTOMER ELSE PERFORM PROCESS-REGULAR-CUSTOMER END-IF. IF AGE < 18 MOVE "MINOR" TO CUSTOMER-CATEGORY ELSE IF AGE < 65 MOVE "ADULT" TO CUSTOMER-CATEGORY ELSE MOVE "SENIOR" TO CUSTOMER-CATEGORY END-IF.

Conditional execution based on a boolean expression.

EVALUATE

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
EVALUATE TRUE WHEN BALANCE < 0 PERFORM PROCESS-OVERDRAWN WHEN BALANCE = 0 PERFORM PROCESS-ZERO-BALANCE WHEN BALANCE < 1000 PERFORM PROCESS-LOW-BALANCE WHEN OTHER PERFORM PROCESS-NORMAL-BALANCE END-EVALUATE. EVALUATE TRANSACTION-CODE WHEN "D" PERFORM PROCESS-DEPOSIT WHEN "W" PERFORM PROCESS-WITHDRAWAL WHEN "T" PERFORM PROCESS-TRANSFER WHEN OTHER PERFORM PROCESS-ERROR END-EVALUATE.

Multi-way branching, similar to a switch/case in other languages.

PERFORM

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
*> Basic PERFORM PERFORM CALCULATE-INTEREST. *> PERFORM with THRU PERFORM PROCESS-START THRU PROCESS-END. *> PERFORM TIMES PERFORM PRINT-HEADER 3 TIMES. *> PERFORM UNTIL PERFORM PROCESS-RECORD UNTIL END-OF-FILE. *> PERFORM VARYING PERFORM VARYING INDEX-1 FROM 1 BY 1 UNTIL INDEX-1 > 10 DISPLAY TABLE-ITEM(INDEX-1) END-PERFORM. *> In-line PERFORM PERFORM UNTIL END-OF-FILE READ INPUT-FILE AT END SET END-OF-FILE TO TRUE NOT AT END PERFORM PROCESS-RECORD END-READ END-PERFORM.

Executes paragraphs/sections or blocks of code, with various iteration options.

GO TO

cobol
1
2
3
4
5
6
7
8
9
GO TO PARAGRAPH-NAME. IF AMOUNT > 1000 GO TO HIGH-AMOUNT-PARA ELSE GO TO LOW-AMOUNT-PARA END-IF. GO TO PARA-1 PARA-2 PARA-3 DEPENDING ON CHOICE.

Transfers control to the specified paragraph or section (less used in modern code).

CALL

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CALL "SUBPROGRAM" USING PARAM1, PARAM2. CALL "CUSTINFO" USING BY REFERENCE CUSTOMER-ID BY CONTENT QUERY-TYPE BY REFERENCE RESULT-DATA. CALL PROGRAM-NAME. CALL "REPORT" USING REPORT-DATA ON EXCEPTION DISPLAY "Program not found" NOT ON EXCEPTION MOVE "Y" TO REPORT-COMPLETE END-CALL.

Invokes a separate COBOL program or external routine.

EXIT, GOBACK, STOP RUN

cobol
1
2
3
4
5
6
7
8
9
10
11
EXIT. *> Marks the end of a paragraph EXIT PROGRAM. *> Returns from a called program GOBACK. *> Returns to the calling program or OS STOP RUN. *> Terminates the entire run unit EXIT PERFORM. *> Exits from the current PERFORM EXIT PERFORM CYCLE. *> Skips to the next iteration

Various ways to exit from different program structures.

Example: Complex Control Flow

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
PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION. PERFORM PROCESS-FILES UNTIL END-OF-FILES. PERFORM WRAP-UP. STOP RUN. INITIALIZATION. OPEN INPUT CUSTOMER-FILE. OPEN OUTPUT REPORT-FILE. MOVE "N" TO END-OF-FILES. PERFORM READ-CUSTOMER-RECORD. READ-CUSTOMER-RECORD. READ CUSTOMER-FILE AT END MOVE "Y" TO END-OF-FILES NOT AT END PERFORM VALIDATE-CUSTOMER-RECORD END-READ. PROCESS-FILES. EVALUATE TRUE WHEN VALID-CUSTOMER PERFORM PROCESS-VALID-CUSTOMER WHEN INACTIVE-CUSTOMER PERFORM PROCESS-INACTIVE-CUSTOMER WHEN OTHER PERFORM PROCESS-INVALID-CUSTOMER END-EVALUATE. PERFORM READ-CUSTOMER-RECORD. VALIDATE-CUSTOMER-RECORD. MOVE "N" TO VALID-CUSTOMER-SW. MOVE "N" TO INACTIVE-CUSTOMER-SW. IF CUSTOMER-ID IS NUMERIC IF CUSTOMER-STATUS = "A" MOVE "Y" TO VALID-CUSTOMER-SW ELSE IF CUSTOMER-STATUS = "I" MOVE "Y" TO INACTIVE-CUSTOMER-SW END-IF END-IF. PROCESS-VALID-CUSTOMER. IF CUSTOMER-BALANCE > 10000 PERFORM PROCESS-HIGH-BALANCE-CUSTOMER ELSE IF CUSTOMER-BALANCE < 0 PERFORM PROCESS-OVERDRAWN-CUSTOMER ELSE PERFORM PROCESS-NORMAL-CUSTOMER END-IF. PROCESS-INACTIVE-CUSTOMER. MOVE CUSTOMER-ID TO INACTIVE-REPORT-ID. MOVE CUSTOMER-NAME TO INACTIVE-REPORT-NAME. MOVE "INACTIVE ACCOUNT" TO INACTIVE-REPORT-MESSAGE. WRITE INACTIVE-REPORT-RECORD. ADD 1 TO INACTIVE-COUNTER. PROCESS-INVALID-CUSTOMER. MOVE CUSTOMER-ID TO ERROR-REPORT-ID. MOVE "INVALID CUSTOMER RECORD" TO ERROR-REPORT-MESSAGE. WRITE ERROR-REPORT-RECORD. ADD 1 TO ERROR-COUNTER. PROCESS-HIGH-BALANCE-CUSTOMER. CALL "PREMIUM-PROCESSING" USING CUSTOMER-RECORD PREMIUM-STATUS. IF PREMIUM-STATUS = "OK" ADD 1 TO PREMIUM-COUNTER ELSE PERFORM PROCESS-NORMAL-CUSTOMER END-IF. PROCESS-OVERDRAWN-CUSTOMER. MOVE CUSTOMER-ID TO OVERDRAWN-REPORT-ID. MOVE CUSTOMER-NAME TO OVERDRAWN-REPORT-NAME. MOVE CUSTOMER-BALANCE TO OVERDRAWN-REPORT-BALANCE. WRITE OVERDRAWN-REPORT-RECORD. ADD 1 TO OVERDRAWN-COUNTER. PROCESS-NORMAL-CUSTOMER. MOVE CUSTOMER-ID TO NORMAL-REPORT-ID. MOVE CUSTOMER-NAME TO NORMAL-REPORT-NAME. MOVE CUSTOMER-BALANCE TO NORMAL-REPORT-BALANCE. WRITE NORMAL-REPORT-RECORD. ADD 1 TO NORMAL-COUNTER. WRAP-UP. CLOSE CUSTOMER-FILE. CLOSE REPORT-FILE. DISPLAY "Processing complete.". DISPLAY NORMAL-COUNTER " normal accounts processed.". DISPLAY PREMIUM-COUNTER " premium accounts processed.". DISPLAY OVERDRAWN-COUNTER " overdrawn accounts processed.". DISPLAY INACTIVE-COUNTER " inactive accounts processed.". DISPLAY ERROR-COUNTER " error records found."

This example demonstrates how various control flow verbs work together in a real-world program.

I/O Verbs

Input/Output verbs handle file operations and interaction with external data sources. These verbs allow COBOL programs to read from and write to files, which is essential for batch processing and data management.

OPEN

cobol
1
2
3
4
5
6
7
OPEN INPUT CUSTOMER-FILE. OPEN OUTPUT REPORT-FILE. OPEN I-O MASTER-FILE. OPEN EXTEND LOG-FILE. OPEN INPUT CUSTOMER-FILE OUTPUT REPORT-FILE I-O TRANSACTION-FILE.

Prepares files for processing with different access modes.

CLOSE

cobol
1
2
3
CLOSE CUSTOMER-FILE. CLOSE REPORT-FILE TRANSACTION-FILE. CLOSE MASTER-FILE WITH LOCK.

Terminates file processing and releases resources.

READ

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
READ CUSTOMER-FILE. READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG END-READ. READ CUSTOMER-FILE NEXT RECORD. READ INDEXED-FILE KEY IS CUSTOMER-ID INVALID KEY PERFORM CUSTOMER-NOT-FOUND END-READ. READ INDEXED-FILE WITH LOCK KEY IS CUSTOMER-ID.

Retrieves records from a file, with sequential or random access.

WRITE

cobol
1
2
3
4
5
6
7
8
9
10
11
WRITE CUSTOMER-RECORD. WRITE CUSTOMER-RECORD INVALID KEY PERFORM DUPLICATE-KEY END-WRITE. WRITE REPORT-RECORD AFTER ADVANCING 2 LINES. WRITE REPORT-RECORD BEFORE ADVANCING PAGE.

Creates new records in a file, with format control for print files.

REWRITE

cobol
1
2
3
4
5
6
7
8
REWRITE CUSTOMER-RECORD. REWRITE CUSTOMER-RECORD INVALID KEY PERFORM RECORD-NOT-FOUND END-REWRITE. REWRITE CUSTOMER-RECORD FROM UPDATED-CUSTOMER.

Updates existing records in a file (requires prior READ).

DELETE

cobol
1
2
3
4
5
DELETE CUSTOMER-FILE. DELETE CUSTOMER-FILE RECORD INVALID KEY PERFORM RECORD-NOT-FOUND END-DELETE.

Removes records from a file (requires prior READ for sequential files).

START

cobol
1
2
3
4
5
6
7
8
9
10
START INDEXED-FILE KEY IS GREATER THAN CUSTOMER-ID INVALID KEY PERFORM NO-MATCHING-RECORDS END-START. START INDEXED-FILE KEY IS NOT LESS THAN CUSTOMER-ID. START INDEXED-FILE KEY IS = CUSTOMER-ID.

Positions an indexed or relative file for sequential retrieval with key conditions.

ACCEPT / DISPLAY

cobol
1
2
3
4
5
6
7
ACCEPT CUSTOMER-ID. ACCEPT CURRENT-DATE FROM DATE. ACCEPT SYSTEM-TIME FROM TIME. DISPLAY "Enter customer ID: ". DISPLAY "Total records: " RECORD-COUNT.

Simple console input/output operations (technically not file I/O but related to external interaction).

Example: Complete File 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
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
IDENTIFICATION DIVISION. PROGRAM-ID. FILE-UPDATE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS CUST-ID FILE STATUS IS CUST-FILE-STATUS. SELECT TRANSACTION-FILE ASSIGN TO "TRANSACT.DAT" ORGANIZATION IS SEQUENTIAL ACCESS IS SEQUENTIAL FILE STATUS IS TRANS-FILE-STATUS. SELECT REPORT-FILE ASSIGN TO "REPORT.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS REPORT-FILE-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(6). 05 CUST-NAME PIC X(30). 05 CUST-BALANCE PIC S9(7)V99. 05 CUST-STATUS PIC X. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-CODE PIC X. 88 ADD-RECORD VALUE 'A'. 88 CHANGE-RECORD VALUE 'C'. 88 DELETE-RECORD VALUE 'D'. 05 TRANS-CUST-ID PIC X(6). 05 TRANS-DATA PIC X(50). FD REPORT-FILE. 01 REPORT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 FILE-STATUS-FIELDS. 05 CUST-FILE-STATUS PIC XX. 05 TRANS-FILE-STATUS PIC XX. 05 REPORT-FILE-STATUS PIC XX. 01 FLAGS. 05 EOF-TRANS-FILE PIC X VALUE 'N'. 88 END-OF-TRANS VALUE 'Y'. 01 HEADER-LINE. 05 FILLER PIC X(20) VALUE 'TRANSACTION REPORT - '. 05 HEADER-DATE PIC X(10). 05 FILLER PIC X(50) VALUE SPACES. 01 DETAIL-LINE. 05 DL-TRANS-CODE PIC X(8). 05 DL-CUST-ID PIC X(10). 05 DL-CUST-NAME PIC X(30). 05 DL-STATUS PIC X(15). 05 FILLER PIC X(17) VALUE SPACES. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION. PERFORM PROCESS-TRANSACTIONS UNTIL END-OF-TRANS. PERFORM WRAP-UP. STOP RUN. INITIALIZATION. OPEN I-O CUSTOMER-FILE. IF CUST-FILE-STATUS NOT = "00" DISPLAY "Error opening customer file: " CUST-FILE-STATUS STOP RUN END-IF. OPEN INPUT TRANSACTION-FILE. IF TRANS-FILE-STATUS NOT = "00" DISPLAY "Error opening transaction file: " TRANS-FILE-STATUS CLOSE CUSTOMER-FILE STOP RUN END-IF. OPEN OUTPUT REPORT-FILE. IF REPORT-FILE-STATUS NOT = "00" DISPLAY "Error opening report file: " REPORT-FILE-STATUS CLOSE CUSTOMER-FILE CLOSE TRANSACTION-FILE STOP RUN END-IF. ACCEPT HEADER-DATE FROM DATE. MOVE HEADER-LINE TO REPORT-RECORD. WRITE REPORT-RECORD. MOVE SPACES TO REPORT-RECORD. WRITE REPORT-RECORD. MOVE "ACTION CUST ID CUSTOMER NAME STATUS" TO REPORT-RECORD. WRITE REPORT-RECORD. MOVE SPACES TO REPORT-RECORD. WRITE REPORT-RECORD. READ TRANSACTION-FILE AT END MOVE 'Y' TO EOF-TRANS-FILE END-READ. PROCESS-TRANSACTIONS. EVALUATE TRANS-CODE WHEN 'A' PERFORM ADD-CUSTOMER WHEN 'C' PERFORM CHANGE-CUSTOMER WHEN 'D' PERFORM DELETE-CUSTOMER WHEN OTHER MOVE "INVALID" TO DL-STATUS PERFORM WRITE-REPORT-LINE END-EVALUATE. READ TRANSACTION-FILE AT END MOVE 'Y' TO EOF-TRANS-FILE END-READ. ADD-CUSTOMER. MOVE TRANS-CUST-ID TO CUST-ID. READ CUSTOMER-FILE INVALID KEY PERFORM ADD-NEW-CUSTOMER NOT INVALID KEY MOVE "DUPLICATE" TO DL-STATUS PERFORM WRITE-REPORT-LINE END-READ. ADD-NEW-CUSTOMER. MOVE TRANS-CUST-ID TO CUST-ID. MOVE SPACES TO CUST-NAME. MOVE ZEROS TO CUST-BALANCE. MOVE "A" TO CUST-STATUS. MOVE TRANS-DATA TO CUST-NAME. WRITE CUSTOMER-RECORD INVALID KEY MOVE "ERROR-WRITE" TO DL-STATUS NOT INVALID KEY MOVE "ADDED" TO DL-STATUS END-WRITE. PERFORM WRITE-REPORT-LINE. CHANGE-CUSTOMER. MOVE TRANS-CUST-ID TO CUST-ID. READ CUSTOMER-FILE INVALID KEY MOVE "NOT FOUND" TO DL-STATUS PERFORM WRITE-REPORT-LINE NOT INVALID KEY PERFORM UPDATE-CUSTOMER-RECORD END-READ. UPDATE-CUSTOMER-RECORD. MOVE TRANS-DATA TO CUST-NAME. REWRITE CUSTOMER-RECORD INVALID KEY MOVE "ERROR-REWRITE" TO DL-STATUS NOT INVALID KEY MOVE "UPDATED" TO DL-STATUS END-REWRITE. PERFORM WRITE-REPORT-LINE. DELETE-CUSTOMER. MOVE TRANS-CUST-ID TO CUST-ID. READ CUSTOMER-FILE INVALID KEY MOVE "NOT FOUND" TO DL-STATUS PERFORM WRITE-REPORT-LINE NOT INVALID KEY PERFORM REMOVE-CUSTOMER-RECORD END-READ. REMOVE-CUSTOMER-RECORD. DELETE CUSTOMER-FILE RECORD INVALID KEY MOVE "ERROR-DELETE" TO DL-STATUS NOT INVALID KEY MOVE "DELETED" TO DL-STATUS END-DELETE. PERFORM WRITE-REPORT-LINE. WRITE-REPORT-LINE. EVALUATE TRANS-CODE WHEN 'A' MOVE "ADD" TO DL-TRANS-CODE WHEN 'C' MOVE "CHANGE" TO DL-TRANS-CODE WHEN 'D' MOVE "DELETE" TO DL-TRANS-CODE WHEN OTHER MOVE "UNKNOWN" TO DL-TRANS-CODE END-EVALUATE. MOVE TRANS-CUST-ID TO DL-CUST-ID. IF DL-STATUS = "NOT FOUND" OR DL-STATUS = "INVALID" MOVE SPACES TO DL-CUST-NAME ELSE MOVE CUST-NAME TO DL-CUST-NAME END-IF. MOVE DETAIL-LINE TO REPORT-RECORD. WRITE REPORT-RECORD. WRAP-UP. CLOSE CUSTOMER-FILE. CLOSE TRANSACTION-FILE. MOVE SPACES TO REPORT-RECORD. WRITE REPORT-RECORD. MOVE "END OF REPORT" TO REPORT-RECORD. WRITE REPORT-RECORD. CLOSE REPORT-FILE. DISPLAY "Processing complete."

This comprehensive example demonstrates all the file I/O verbs working together in a typical batch update program.

Table Handling Verbs

Table handling verbs manage array-like structures in COBOL. These verbs allow programs to efficiently search, sort, and manipulate tables, which is essential for working with collections of similar data.

SEARCH

cobol
1
2
3
4
5
6
SEARCH PRODUCT-TABLE AT END MOVE "N" TO FOUND-SW WHEN PRODUCT-CODE(IDX) = SEARCH-CODE MOVE "Y" TO FOUND-SW MOVE PRODUCT-DESC(IDX) TO OUTPUT-DESC END-SEARCH.

Sequential search through a table.

SEARCH ALL

cobol
1
2
3
4
5
6
SEARCH ALL PRODUCT-TABLE AT END MOVE "N" TO FOUND-SW WHEN PRODUCT-CODE(IDX) = SEARCH-CODE MOVE "Y" TO FOUND-SW MOVE PRODUCT-DESC(IDX) TO OUTPUT-DESC END-SEARCH.

Binary search (table must be sorted by the key).

SET

cobol
1
2
3
4
5
SET IDX TO 1. SET PRODUCT-INDEX TO 5. SET IDX UP BY 1. SET IDX DOWN BY 2. SET TAX-TABLE-IDX TO STATE-IDX.

Manipulates index values for table access.

SORT

cobol
1
2
3
4
5
6
7
8
9
10
SORT SORT-FILE ON ASCENDING KEY SORT-KEY USING INPUT-FILE GIVING OUTPUT-FILE. SORT SORT-FILE ON DESCENDING KEY SORT-DEPT ON ASCENDING KEY SORT-NAME INPUT PROCEDURE IS PROCESS-INPUT OUTPUT PROCEDURE IS PROCESS-OUTPUT.

Sorts records from a file, with optional processing.

Example: Table 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
IDENTIFICATION DIVISION. PROGRAM-ID. TABLE-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 STATE-TABLE. 05 STATE-ENTRY OCCURS 50 TIMES INDEXED BY STATE-IDX. 10 STATE-CODE PIC XX. 10 STATE-NAME PIC X(20). 10 STATE-CAPITAL PIC X(20). 10 STATE-POPULATION PIC 9(8). 01 COUNTER PIC 99 VALUE ZERO. 01 SEARCH-STATE PIC XX. 01 FOUND-SW PIC X VALUE 'N'. 88 STATE-FOUND VALUE 'Y'. 88 STATE-NOT-FOUND VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZE-TABLE. DISPLAY "Enter state code to lookup (XX to end): ". ACCEPT SEARCH-STATE. PERFORM UNTIL SEARCH-STATE = "XX" PERFORM SEARCH-FOR-STATE IF STATE-FOUND DISPLAY "State: " STATE-NAME(STATE-IDX) DISPLAY "Capital: " STATE-CAPITAL(STATE-IDX) DISPLAY "Population: " STATE-POPULATION(STATE-IDX) ELSE DISPLAY "State code not found" END-IF DISPLAY "Enter state code to lookup (XX to end): " ACCEPT SEARCH-STATE END-PERFORM. DISPLAY "Demonstration of SET and reference modification:" PERFORM VARYING STATE-IDX FROM 1 BY 1 UNTIL STATE-IDX > COUNTER IF STATE-CODE(STATE-IDX)(1:1) = "A" DISPLAY STATE-NAME(STATE-IDX) END-IF END-PERFORM. STOP RUN. INITIALIZE-TABLE. *> Populate some sample data SET STATE-IDX TO 1. MOVE "AL" TO STATE-CODE(STATE-IDX). MOVE "Alabama" TO STATE-NAME(STATE-IDX). MOVE "Montgomery" TO STATE-CAPITAL(STATE-IDX). MOVE 5024279 TO STATE-POPULATION(STATE-IDX). SET STATE-IDX UP BY 1. MOVE "AK" TO STATE-CODE(STATE-IDX). MOVE "Alaska" TO STATE-NAME(STATE-IDX). MOVE "Juneau" TO STATE-CAPITAL(STATE-IDX). MOVE 733391 TO STATE-POPULATION(STATE-IDX). SET STATE-IDX UP BY 1. MOVE "AZ" TO STATE-CODE(STATE-IDX). MOVE "Arizona" TO STATE-NAME(STATE-IDX). MOVE "Phoenix" TO STATE-CAPITAL(STATE-IDX). MOVE 7151502 TO STATE-POPULATION(STATE-IDX). SET STATE-IDX UP BY 1. MOVE "AR" TO STATE-CODE(STATE-IDX). MOVE "Arkansas" TO STATE-NAME(STATE-IDX). MOVE "Little Rock" TO STATE-CAPITAL(STATE-IDX). MOVE 3011524 TO STATE-POPULATION(STATE-IDX). SET STATE-IDX UP BY 1. MOVE "CA" TO STATE-CODE(STATE-IDX). MOVE "California" TO STATE-NAME(STATE-IDX). MOVE "Sacramento" TO STATE-CAPITAL(STATE-IDX). MOVE 39538223 TO STATE-POPULATION(STATE-IDX). MOVE STATE-IDX TO COUNTER. SEARCH-FOR-STATE. MOVE 'N' TO FOUND-SW. SET STATE-IDX TO 1. SEARCH STATE-ENTRY AT END SET STATE-NOT-FOUND TO TRUE WHEN STATE-CODE(STATE-IDX) = SEARCH-STATE SET STATE-FOUND TO TRUE END-SEARCH.

This example demonstrates how to use SEARCH and SET to work with COBOL tables.

Exercise: Identifying and Using COBOL Verbs

Practice identifying and using COBOL verbs with the following exercises:

Exercise 1: Identify Verb Categories

Identify the category of each COBOL verb in the following program:

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
PROCEDURE DIVISION. MAIN-PROCESS. OPEN INPUT CUSTOMER-FILE. OPEN OUTPUT REPORT-FILE. MOVE ZEROS TO RECORD-COUNT. MOVE SPACES TO REPORT-HEADER. READ CUSTOMER-FILE AT END MOVE 'Y' TO EOF-FLAG END-READ. PERFORM UNTIL EOF-FLAG = 'Y' ADD 1 TO RECORD-COUNT IF CUSTOMER-BALANCE > 1000 COMPUTE INTEREST = CUSTOMER-BALANCE * 0.05 MOVE CUSTOMER-ID TO REPORT-CUSTOMER-ID MOVE CUSTOMER-NAME TO REPORT-CUSTOMER-NAME MOVE INTEREST TO REPORT-INTEREST WRITE REPORT-RECORD END-IF READ CUSTOMER-FILE AT END MOVE 'Y' TO EOF-FLAG END-READ END-PERFORM. DISPLAY "Processed " RECORD-COUNT " records.". CLOSE CUSTOMER-FILE. CLOSE REPORT-FILE. STOP RUN.

Exercise 2: Complete the Program

Fill in the missing COBOL verbs to make this program work correctly:

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
PROCEDURE DIVISION. MAIN-PROCESS. _______ INITIALIZATION. _______ PROCESS-DATA UNTIL END-OF-FILE. _______ FINALIZATION. _______ RUN. INITIALIZATION. _______ INPUT CUSTOMER-FILE. _______ OUTPUT REPORT-FILE. _______ ZEROS TO TOTAL-BALANCE. _______ SPACES TO PRINT-LINE. _______ CUSTOMER-RECORD AT END _______ 'Y' TO END-OF-FILE END-READ. PROCESS-DATA. _______ CUSTOMER-ID TO PRINT-ID. _______ CUSTOMER-NAME TO PRINT-NAME. _______ CUSTOMER-BALANCE TO PRINT-BALANCE. _______ TOTAL-BALANCE BY CUSTOMER-BALANCE. _______ PRINT-RECORD. _______ CUSTOMER-RECORD AT END _______ 'Y' TO END-OF-FILE END-READ. FINALIZATION. _______ "Total balance: " TOTAL-BALANCE. _______ CUSTOMER-FILE. _______ REPORT-FILE.

Exercise 3: Create a Program

Write a COBOL program that reads a file of product records, sorts them by product category and then by price, and writes a formatted report. Try to use at least one verb from each category we've covered.

Test Your Knowledge

1. Which category of COBOL verbs is primarily used for arithmetic operations?

  • I/O verbs
  • Computational verbs
  • Control flow verbs
  • Data movement verbs

2. What is the primary purpose of the MOVE verb in COBOL?

  • To perform arithmetic operations
  • To transfer control to another part of the program
  • To copy data from one memory location to another
  • To handle file input and output

3. Which COBOL verb is used to execute a paragraph or section and then return control?

  • GO TO
  • CALL
  • PERFORM
  • EXECUTE

4. Which of the following is NOT a valid I/O verb in COBOL?

  • READ
  • WRITE
  • OPEN
  • TRANSFER

5. What is the purpose of the SEARCH verb in COBOL?

  • To search through text strings for specific characters
  • To find records in a file based on key values
  • To look up values in a table or array
  • To scan the program for syntax errors

Frequently Asked Questions