The procedure division is a series of sentences, each made of one or more
statements and ended by a full stop. A statement starts with a verb. Since COBOL-85 a statement
can be closed by a scope terminator (END-IF…) so that several can sit in one sentence, and
modern code puts a full stop only at the end of a paragraph.
Shape of a statement
- Imperative statements do something (
MOVE,DISPLAY,ADDwithoutSIZE ERROR). - Conditional statements hold a condition phrase and branch (
IF,EVALUATE,SEARCH,READ … AT END,ADD … ON SIZE ERROR). Without its terminator one runs to the next full stop. - Delimited scope statements are closed by an explicit terminator.
- Phrases shared by many verbs:
ROUNDED(with a mode in 2002:ROUNDED MODE IS NEAREST-EVEN,TRUNCATION…),ON SIZE ERROR/NOT ON SIZE ERROR,ON OVERFLOW,ON EXCEPTION,AT END/NOT AT END,INVALID KEY/NOT INVALID KEY,AT END-OF-PAGE,GIVING,CORRESPONDING,BY CONTENT.
| Statement | Terminator | Statement | Terminator |
|---|---|---|---|
ACCEPT | END-ACCEPT | MULTIPLY | END-MULTIPLY |
ADD | END-ADD | PERFORM | END-PERFORM |
CALL | END-CALL | READ | END-READ |
COMPUTE | END-COMPUTE | RECEIVE | END-RECEIVE |
DELETE | END-DELETE | RETURN | END-RETURN |
DISPLAY | END-DISPLAY (2002) | REWRITE | END-REWRITE |
DIVIDE | END-DIVIDE | SEARCH | END-SEARCH |
EVALUATE | END-EVALUATE | SEND | END-SEND |
IF | END-IF | START | END-START |
INVOKE | END-INVOKE | STRING | END-STRING |
JSON | END-JSON | SUBTRACT | END-SUBTRACT |
XML | END-XML | UNSTRING | END-UNSTRING |
MODIFY (Micro Focus, GnuCOBOL) | END-MODIFY | WRITE | END-WRITE |
CHAIN (older Micro Focus) | END-CHAIN | EXEC | END-EXEC |
PROCESS-ORDER.
READ ORDERS NEXT RECORD
AT END SET NO-MORE-ORDERS TO TRUE
NOT AT END
IF ORDER-QTY > ZERO
COMPUTE LINE-TOTAL ROUNDED = ORDER-QTY * UNIT-PRICE
ON SIZE ERROR PERFORM REPORT-OVERFLOW
END-COMPUTE
ADD LINE-TOTAL TO GRAND-TOTAL
ELSE
CONTINUE
END-IF
END-READ.
All statements
“Std” names the first standard to hold a statement; some statements belong only to one compiler family.
| Statement | What it does | Main forms and phrases | Std |
|---|---|---|---|
ACCEPT | Reads data into an item | ACCEPT x (from console); FROM DATE [YYYYMMDD], DAY [YYYYDDD], DAY-OF-WEEK, TIME, COMMAND-LINE, ENVIRONMENT "name", ARGUMENT-NUMBER, mnemonic; screen form ACCEPT scr-item or AT LINE n COLUMN m | 60 |
ADD | Sums | ADD a b TO c d; ADD a TO b GIVING c; ADD CORRESPONDING g1 TO g2; ROUNDED, ON SIZE ERROR | 60 |
ALLOCATE | Gets storage for a BASED item or a given size; RETURNING pointer | ALLOCATE n CHARACTERS INITIALIZED RETURNING p | 2002 |
ALTER | Changes the target of a GO TO paragraph at run time | ALTER p1 TO PROCEED TO p2 | 60 (obsolete in 85, deleted in 2002) |
CALL | Runs another program or a C function | CALL "name" | id USING BY REFERENCE | CONTENT | VALUE a … RETURNING r; ON EXCEPTION / NOT ON EXCEPTION (or ON OVERFLOW); CALL pointer; CALL STATIC; CALL … WITH ... CONVENTION (STDCALL, CDECL) in Micro Focus | 65 |
CANCEL | Releases a called program’s storage so the next call starts fresh | CANCEL "name" | 74 |
CLOSE | Closes files | CLOSE f1 f2; WITH LOCK, REEL/UNIT [FOR REMOVAL], NO REWIND | 60 |
COMMIT / ROLLBACK | End or undo a transaction on files with transaction control | COMMIT | 2023; earlier as extensions (GnuCOBOL, Micro Focus) |
COMPUTE | Evaluates an arithmetic expression | COMPUTE x [ROUNDED] = expr; operators + - * / **, functions | 65 |
CONTINUE | Does nothing (placeholder, e.g. in IF…ELSE) | CONTINUE; 2023: CONTINUE AFTER n SECONDS | 85 |
DELETE | Removes the last-read record of an indexed or relative file | DELETE f RECORD [INVALID KEY …] | 74 |
DELETE FILE | Deletes a file by name | DELETE FILE f1 f2 | 2023; Micro Focus and GnuCOBOL earlier |
DISABLE / ENABLE | Communication facility: switch queues or terminals on and off | ENABLE INPUT TERMINAL cd WITH KEY k | 74 (removed in 2002) |
DISPLAY | Writes items to the console or screen | DISPLAY a b UPON mnemonic; WITH NO ADVANCING; screen form AT LINE 5 COLUMN 10, FOREGROUND-COLOR, ERASE EOS | 60 |
DIVIDE | Divides | DIVIDE a INTO b; DIVIDE a INTO b GIVING c REMAINDER r; DIVIDE a BY b GIVING c | 60 |
ENTER | Hook to another language (obsolete) | ENTER language [routine] | 60 (obsolete in 85, deleted in 2002) |
ENTRY | Adds an alternative entry point to a program | ENTRY "name" USING … | IBM, GnuCOBOL, Micro Focus |
EVALUATE | Multi-way branch (switch) | EVALUATE x ALSO y WHEN 1 ALSO 2… WHEN OTHER … END-EVALUATE; EVALUATE TRUE WHEN cond; values with THRU, ANY, NOT | 85 |
EXIT | Marks a paragraph end, or leaves a construct | EXIT; EXIT PARAGRAPH; EXIT SECTION; EXIT PERFORM [CYCLE]; EXIT PROGRAM; EXIT FUNCTION; EXIT METHOD; EXIT INLINE | 60; the variants 2002 |
EXHIBIT, READY TRACE, RESET TRACE | Debug output and tracing | EXHIBIT NAMED a b | Micro Focus, GnuCOBOL, other compilers (extensions) |
FREE | Releases storage from ALLOCATE | FREE pointer | FREE based-item | 2002 |
GENERATE | Report Writer: produces a detail or summary line | GENERATE detail-name | report-name | 74 |
GO TO | Transfer of control | GO TO p; GO TO p1 p2 p3 DEPENDING ON n; GO TO. (alterable) | 60 |
GOBACK | Returns from a program or ends the run unit if main | GOBACK [RETURNING n] | IBM, Micro Focus, GnuCOBOL; 2002 |
IF | Condition | IF cond [THEN] stmts [ELSE stmts] END-IF; NEXT SENTENCE to jump past the full stop | 60 |
INITIALIZE | Sets items to default values by category | INITIALIZE g [WITH FILLER] [ALL | category TO VALUE] [THEN REPLACING category DATA BY x] [THEN TO DEFAULT] | 85 |
INITIATE / TERMINATE | Report Writer: begin and end a report | INITIATE report | 74 |
INSPECT | Counts, replaces, converts characters | INSPECT x TALLYING n FOR ALL "a" | LEADING | CHARACTERS [BEFORE | AFTER INITIAL "z"]; REPLACING ALL | FIRST | LEADING a BY b; CONVERTING a TO b | 74 |
INVOKE | Calls a method on an object or class | INVOKE obj "method" USING a RETURNING r; INVOKE class "NEW" | 2002 |
JSON GENERATE / JSON PARSE | Writes or reads JSON text | JSON GENERATE txt FROM rec [COUNT n] [NAME OF …] [SUPPRESS …]; JSON PARSE txt INTO rec [WITH DETAIL] [NAME OF …]; special register JSON-CODE | 2023; IBM Enterprise COBOL 6 and GnuCOBOL 3.2 have it as an extension |
MERGE | Merges sorted files | MERGE w ON ASCENDING KEY k USING f1 f2 OUTPUT PROCEDURE p | GIVING g | 74 |
MOVE | Copies data with conversion | MOVE a TO b c; MOVE CORRESPONDING g1 TO g2; figurative constants | 60 |
MULTIPLY | Multiplies | MULTIPLY a BY b; MULTIPLY a BY b GIVING c | 60 |
OPEN | Opens files | OPEN INPUT | OUTPUT | I-O | EXTEND f1 f2; WITH LOCK; SHARING WITH; NO REWIND | 60 |
PERFORM | Loops and calls paragraphs | PERFORM p; PERFORM p THRU q; PERFORM p n TIMES; PERFORM p UNTIL cond; WITH TEST BEFORE | AFTER; PERFORM VARYING i FROM 1 BY 1 UNTIL i > n AFTER j …; inline form with END-PERFORM; PERFORM UNTIL EXIT (2023) | 60; inline 85 |
PURGE | Communication facility: cancels a partial message | PURGE cd | 74 (removed in 2002) |
RAISE | Raises an exception (exception condition or an object) | RAISE EXCEPTION obj; RAISE EC-SIZE-OVERFLOW | 2002 |
READ | Reads a record | READ f [NEXT | PREVIOUS] RECORD [INTO x] [KEY IS k] [AT END | INVALID KEY …] [WITH LOCK | NO LOCK] | 60 |
RECEIVE | Communication facility: gets a message; 2023 reuses it for asynchronous messaging | RECEIVE cd MESSAGE INTO x NO DATA … WITH DATA | 74; 2023 |
RELEASE | Passes a record to a sort (input procedure) | RELEASE rec [FROM x] | 68 |
RESUME | Ends a declarative error handler | RESUME [AT] NEXT STATEMENT | label | 2002 |
RETURN | Gets the next record from a sort or merge (output procedure) | RETURN w RECORD [INTO x] AT END … | 68 |
REWRITE | Replaces the last-read record | REWRITE rec [FROM x] [INVALID KEY …] | 74 |
SEARCH | Looks for a table entry | SEARCH t [VARYING i] AT END … WHEN cond stmts; SEARCH ALL t WHEN key = x (binary search; table with ASCENDING KEY) | 74 |
SEND | Communication facility; 2023 asynchronous message send | SEND cd FROM x WITH EGI | 74; 2023 |
SET | Index, pointer, condition, switch and attribute assignments | SET i TO 1; SET i UP BY 1; SET cond TO TRUE | FALSE; SET p TO ADDRESS OF x; SET ADDRESS OF x TO p; SET sw TO ON | OFF; SET obj TO NULL; SET proc-ptr TO ENTRY "x"; SET LAST EXCEPTION TO OFF | 74; extended 2002 |
SORT | Sorts a file or a table | SORT w ON ASCENDING KEY k [WITH DUPLICATES IN ORDER] [COLLATING SEQUENCE s] USING f1 | INPUT PROCEDURE p GIVING g | OUTPUT PROCEDURE q; SORT table ON ASCENDING KEY k (2002 table sort) | 68; table 2002 |
START | Positions an indexed or relative file | START f KEY IS >= k [INVALID KEY …]; FIRST, LAST (2002) | 74 |
STOP | Ends the run | STOP RUN [WITH ERROR | NORMAL STATUS n]; STOP literal (pause; obsolete) | 60 |
STRING | Concatenates | STRING a b DELIMITED BY SIZE | SPACE | "x" INTO t [WITH POINTER p] [ON OVERFLOW …] | 74 |
SUBTRACT | Subtracts | SUBTRACT a b FROM c; SUBTRACT a FROM b GIVING c; CORRESPONDING | 60 |
SUPPRESS | Report Writer: skips printing a report group | SUPPRESS PRINTING | 74 |
UNLOCK | Releases record locks | UNLOCK f [RECORD | RECORDS] | 2002; earlier in extensions |
UNSTRING | Splits text | UNSTRING s DELIMITED BY [ALL] "," OR "x" INTO a [DELIMITER IN d] [COUNT IN c] b … [WITH POINTER p] [TALLYING IN n] [ON OVERFLOW …] | 74 |
USE | Declarative: error handler or report hook | USE AFTER STANDARD EXCEPTION | ERROR PROCEDURE ON f; USE BEFORE REPORTING g; USE AFTER EXCEPTION CONDITION ec | 60 |
VALIDATE | Checks data against its VALIDATE clauses | VALIDATE x | 2002 (optional in 2014) |
WRITE | Writes a record | WRITE rec [FROM x] [BEFORE | AFTER ADVANCING n LINES | PAGE | mnemonic] [AT END-OF-PAGE …] [INVALID KEY …] | 60 |
XML GENERATE / XML PARSE | Writes or reads XML text | XML GENERATE txt FROM rec [COUNT n]; XML PARSE txt PROCESSING PROCEDURE p; special registers XML-CODE, XML-EVENT, XML-TEXT, XML-NTEXT | IBM 3.x; 2014 |
EXAMINE, TRANSFORM, NOTE | Early forms of INSPECT and comments | 60 to 68; EXAMINE replaced by INSPECT in 1974 | |
EXEC … END-EXEC | Embedded SQL, CICS and other preprocessor blocks | See Embedded SQL and CICS | IBM, others |
COPY, REPLACE, >>-directives | Compiler-directing; not run time | See Compiler directives | 60 |
PERFORM in detail
PERFORM INIT-RTN
PERFORM PARA-A THRU PARA-C
PERFORM 5 TIMES
DISPLAY "HELLO"
END-PERFORM
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
ADD T(I, J) TO TOTAL
END-PERFORM
END-PERFORM
PERFORM WITH TEST AFTER UNTIL DONE
PERFORM STEP
END-PERFORM
PERFORM without a test runs the named paragraphs once and returns. WITH TEST BEFORE (the default) checks the
condition first, WITH TEST AFTER runs the body once before checking. Perform ranges that overlap or end
in a GO TO outside the range are legal only in strictly controlled shapes; the compiler cannot always detect
them. EXIT PERFORM leaves an inline loop and EXIT PERFORM CYCLE goes to the next pass (2002).
EVALUATE and conditions
EVALUATE TRUE
WHEN AGE < 13 MOVE "CHILD" TO CLASS-NAME
WHEN AGE < 20 MOVE "TEEN" TO CLASS-NAME
WHEN OTHER MOVE "ADULT" TO CLASS-NAME
END-EVALUATE
EVALUATE CODE-A ALSO CODE-B
WHEN 1 ALSO ANY PERFORM ONE-ANY
WHEN 2 THRU 5 ALSO 9 PERFORM RANGE-NINE
END-EVALUATE
Conditions themselves (relations, class, sign, condition-name, abbreviated forms) are on Expressions and conditions.
Declaratives, sections and control flow
DECLARATIVES.…END DECLARATIVES.opens the procedure division; each declarative is a section that starts with aUSEsentence.- A paragraph is entered by falling through from the one above, or by
PERFORMorGO TO. Sections group paragraphs and are performed as a whole. NEXT SENTENCEjumps past the next full stop (not past theEND-IF);CONTINUEdoes nothing.- 2002 exception handling:
RAISE,RESUME,USE AFTER EXCEPTION CONDITION, and the directive>>TURNto switch checking of an exception condition on.