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.
1verb-name operand1, operand2 ... [optional-phrases]
COBOL verbs typically appear at the beginning of a statement, followed by their operands and optional phrases.
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.
1234ADD 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.
1234SUBTRACT 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.
1234MULTIPLY 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.
1234DIVIDE 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.
1234COMPUTE 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.
12345678910111213141516171819202122COMPUTE 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 transfer data between memory locations, initialize fields, and manipulate strings. These operations are essential for data preparation, formatting, and transformation.
123456MOVE "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.
123456INITIALIZE 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.
1234567STRING "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.
1234567UNSTRING 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.
12345INSPECT 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.
12345SET 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.
A special form of MOVE that copies fields with matching names between group items:
123456789101112131401 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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758*> 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 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.
12345678910111213IF 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.
123456789101112131415161718192021EVALUATE 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.
12345678910111213141516171819202122232425*> 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.
123456789GO 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).
1234567891011121314CALL "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.
1234567891011EXIT. *> 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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697PROCEDURE 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.
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.
1234567OPEN 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.
123CLOSE CUSTOMER-FILE. CLOSE REPORT-FILE TRANSACTION-FILE. CLOSE MASTER-FILE WITH LOCK.
Terminates file processing and releases resources.
1234567891011121314READ 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.
1234567891011WRITE 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.
12345678REWRITE 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).
12345DELETE 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).
12345678910START 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.
1234567ACCEPT 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).
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227IDENTIFICATION 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 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.
123456SEARCH 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.
123456SEARCH 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).
12345SET 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.
12345678910SORT 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.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192IDENTIFICATION 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.
Practice identifying and using COBOL verbs with the following exercises:
Identify the category of each COBOL verb in the following program:
123456789101112131415161718192021222324252627282930313233PROCEDURE 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.
Fill in the missing COBOL verbs to make this program work correctly:
1234567891011121314151617181920212223242526272829303132PROCEDURE 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.
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.
1. Which category of COBOL verbs is primarily used for arithmetic operations?
2. What is the primary purpose of the MOVE verb in COBOL?
3. Which COBOL verb is used to execute a paragraph or section and then return control?
4. Which of the following is NOT a valid I/O verb in COBOL?
5. What is the purpose of the SEARCH verb in COBOL?