> "Show me your data structures, and I won't need to see your code." — paraphrased from Fred Brooks
In This Chapter
Chapter 4: Data Description Mastery
"Show me your data structures, and I won't need to see your code." — paraphrased from Fred Brooks
If COBOL's PROCEDURE DIVISION is the engine of your program, then the DATA DIVISION is the blueprint that determines what the engine can build. In your first COBOL course, you learned the basics: how to declare variables with level numbers, assign PICTURE clauses, and move data around. In this chapter, we go much deeper. We will dissect every element of data description that separates a novice COBOL programmer from a seasoned professional — the kind of developer who can look at a record layout and immediately understand the business domain it represents.
This chapter matters because in enterprise COBOL systems, the DATA DIVISION often constitutes 40-60% of a program's source code. At GlobalBank, Maria Chen estimates that the ACCT-MASTER record layout alone has been read by over a hundred developers across three decades. "If you get the data description wrong," she tells Derek Washington on his first day reviewing the banking core, "every program that touches that record inherits your mistake."
We will cover PICTURE clauses in full depth, explore every USAGE option and its storage implications, master the special level numbers (66, 77, 88), learn to overlay storage with REDEFINES, build tables with OCCURS, and practice the art of writing data descriptions that are both efficient and self-documenting. By the end of this chapter, you will be able to design record layouts worthy of production enterprise systems.
4.1 The Architecture of the DATA DIVISION
Before we dive into individual clauses, let us establish the structural context. The DATA DIVISION contains up to four sections:
DATA DIVISION.
FILE SECTION. *> Record layouts for files
WORKING-STORAGE SECTION. *> Program variables
LOCAL-STORAGE SECTION. *> Per-invocation variables (COBOL 2002+)
LINKAGE SECTION. *> Parameters from calling programs
Each section serves a distinct purpose, but the syntax for describing data items is consistent across all four. Every data item has three essential attributes:
- Level number — determines the item's position in the hierarchy
- Data name (or FILLER) — the identifier used to reference the item
- Clauses — PICTURE, USAGE, VALUE, and others that define the item's characteristics
💡 Key Insight: COBOL's data description language is essentially a schema definition language. Long before XML Schema, JSON Schema, or Protocol Buffers existed, COBOL programmers were defining precise, self-documenting data structures in the DATA DIVISION. This is one of the reasons COBOL systems have proven so durable — the data contracts are explicit and unambiguous.
4.2 PICTURE Clauses in Depth
The PICTURE clause (abbreviated PIC) is the most fundamental data description element. It defines two things simultaneously: the type of data an item can hold and the format in which that data is stored or displayed.
4.2.1 Numeric PICTURE Symbols
Numeric items use these core symbols:
| Symbol | Meaning | Example |
|---|---|---|
9 |
Numeric digit (0-9) | PIC 9(5) — five-digit number |
V |
Implied decimal point | PIC 9(5)V99 — five digits, two decimal places |
S |
Sign (positive or negative) | PIC S9(5)V99 — signed number |
P |
Assumed decimal scaling | PIC 9(3)PP — number × 100 |
Let us examine each in detail.
The 9 Symbol: Numeric Digits
The 9 symbol represents a single numeric digit position. Parenthetical notation provides shorthand:
01 WS-COUNTER PIC 9(5).
*> Equivalent to:
01 WS-COUNTER PIC 99999.
Both declarations create a five-digit numeric field that can hold values from 00000 to 99999. Note that COBOL numeric fields are fixed-width — a value of 42 is stored as 00042 in a PIC 9(5) field.
The V Symbol: Implied Decimal Point
The V marks where the decimal point logically exists, without occupying any storage:
01 WS-RATE PIC 9(3)V9(4).
*> Can hold: 123.4567
*> Stored as: 1234567 (7 bytes in DISPLAY usage)
*> The decimal point exists only in the compiler's knowledge
This is a crucial concept. The V does not generate a physical period in storage. The compiler tracks the decimal position and ensures that arithmetic operations align decimal points correctly.
The S Symbol: Signed Numbers
Without an S, a numeric field can only hold non-negative values. With S, it can hold positive or negative values:
01 WS-BALANCE PIC S9(7)V99.
*> Can hold: -9999999.99 to +9999999.99
⚠️ Critical Warning: Always use S for fields that might be negative. A common bug in legacy COBOL code is forgetting the sign indicator on a balance field, which silently converts negative values to positive. At GlobalBank, Derek Washington spent his first week tracking down a reconciliation error caused by exactly this problem in a 1990s-era subroutine — a field declared as PIC 9(9)V99 instead of PIC S9(9)V99 was silently dropping the sign on refund transactions.
How the sign is stored depends on the USAGE clause (we will cover this in Section 4.3), but in DISPLAY usage, the sign is typically embedded in the last byte using a "zoned decimal" encoding.
The P Symbol: Decimal Scaling
The P symbol is rarely used but important to understand. It represents assumed decimal positions that do not occupy storage:
01 WS-MILLIONS PIC 9(3)PPP.
*> Can hold values like: 1000, 2000, ..., 999000
*> Stored as: 3 bytes (only the significant digits)
*> PIC 9(3)PPP means value = stored-digits × 1000
01 WS-FRACTION PIC PPP9(3).
*> Can hold values like: 0.000001 to 0.000999
*> Stored as: 3 bytes
*> PIC PPP9(3) means value = stored-digits × 0.000001
The P is useful when you need to store very large or very small numbers with limited precision. In practice, you will encounter it most often in legacy scientific or statistical programs.
4.2.2 Alphanumeric PICTURE Symbols
| Symbol | Meaning | Example |
|---|---|---|
X |
Any character | PIC X(30) — 30-character field |
A |
Alphabetic only (A-Z, a-z, space) | PIC A(20) — 20 alphabetic characters |
01 WS-CUSTOMER-NAME PIC X(40).
*> Can hold any combination of characters
*> "JOHN SMITH", "O'Brien", "José García", "12345"
01 WS-STATE-CODE PIC AA.
*> Only alphabetic characters and spaces
*> "CA", "NY", "TX" — valid
*> "A1" — would cause a runtime error or undefined behavior
💡 Practical Note: In modern COBOL practice, PIC X is overwhelmingly preferred over PIC A. The alphabetic restriction of PIC A is rarely useful and can cause unexpected issues with data that contains hyphens, apostrophes, or accented characters. Maria Chen's coding standard at GlobalBank mandates PIC X for all text fields: "We stopped using PIC A in the 1990s. Real names have hyphens, apostrophes, and characters we never anticipated."
4.2.3 Edited PICTURE Symbols (Numeric Editing)
Edited pictures transform numeric data into human-readable display format. These are used for report lines, screen output, and formatted records:
| Symbol | Meaning | Example |
|---|---|---|
Z |
Zero-suppress (replace leading zeros with spaces) | PIC ZZ,ZZ9 |
* |
Zero-suppress with asterisk fill (check protection) | PIC **,**9.99 |
$` | Currency sign | `PIC $ZZ,ZZ9.99 |
||
+ |
Plus/minus sign (shows + or -) | PIC +9(5).99 |
- |
Minus sign (shows - or space) | PIC -9(5).99 |
B |
Insert blank space | PIC 9(3)B9(3) |
0 |
Insert zero | PIC 9(3)09(3) |
/ |
Insert slash | PIC 99/99/9999 |
. |
Decimal point (physical) | PIC ZZ9.99 |
, |
Comma insertion | PIC ZZZ,ZZ9 |
CR |
Credit symbol (appears if negative) | PIC 9(5).99CR |
DB |
Debit symbol (appears if negative) | PIC 9(5).99DB |
Let us work through detailed examples:
01 WS-RAW-AMOUNT PIC S9(7)V99.
01 WS-EDIT-BASIC PIC ZZZ,ZZ9.99.
01 WS-EDIT-CURRENCY PIC $ZZZ,ZZ9.99.
01 WS-EDIT-SIGNED PIC -ZZZ,ZZ9.99.
01 WS-EDIT-CHECK PIC $***,**9.99.
01 WS-EDIT-CREDIT PIC $ZZZ,ZZ9.99CR.
Given WS-RAW-AMOUNT = +1234.56:
| Target Field | Result |
|---|---|
WS-EDIT-BASIC |
1,234.56 |
WS-EDIT-CURRENCY |
$ 1,234.56 |
WS-EDIT-SIGNED |
1,234.56 (space, not minus) |
WS-EDIT-CHECK |
$**1,234.56 |
WS-EDIT-CREDIT |
$ 1,234.56 (spaces, not CR) |
Given WS-RAW-AMOUNT = -1234.56:
| Target Field | Result |
|---|---|
WS-EDIT-SIGNED |
- 1,234.56 |
WS-EDIT-CREDIT |
$ 1,234.56CR |
Floating Insertion
When $, +, or - is repeated, they "float" — only one appears, immediately to the left of the first significant digit:
01 WS-FLOAT-DOLLAR PIC $$$$,$$9.99.
*> Value 1234.56 produces: " $1,234.56"
*> Value 0.50 produces: " $0.50"
01 WS-FLOAT-SIGN PIC ----,--9.99.
*> Value -1234.56 produces: " -1,234.56"
*> Value +1234.56 produces: " 1,234.56"
```
📊 **Comparison Table: Fixed vs. Floating Currency Sign**
| Declaration | Value = 1234.56 | Value = 0.50 |
|------------|-----------------|--------------|
| `PIC $9,999,999.99` | `$0,001,234.56` | `$0,000,000.50` |
| `PIC $Z,ZZZ,ZZ9.99` | `$ 1,234.56` | `$ 0.50` |
| `PIC $$,$$$,$$9.99` | ` $1,234.56` | ` $0.50` |
### 4.2.4 Date Formatting with Edited Pictures
A common use of insertion characters is date formatting:
```cobol
01 WS-DATE-RAW PIC 9(8).
*> Contains: 20260315
01 WS-DATE-SLASH PIC 9(4)/99/99.
*> After MOVE: "2026/03/15"
01 WS-DATE-DASH PIC 9(4)B99B99.
*> After MOVE: "2026 03 15"
🧪 Try It Yourself: Picture Clause Lab
Write a small program with these declarations and use DISPLAY to show how each edited field renders:
IDENTIFICATION DIVISION.
PROGRAM-ID. PICLAB.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AMOUNT PIC S9(7)V99 VALUE -45678.90.
01 WS-EDIT-1 PIC ZZZ,ZZ9.99.
01 WS-EDIT-2 PIC $$$,$$$, MATH4 $,$$$,$$9.99-.
05 FILLER PIC X(3) VALUE SPACES.
05 RPT-DTL-STATUS PIC X(8).
05 FILLER PIC X(36) VALUE SPACES.
4.15 Debugging Data Description Issues
When things go wrong with data descriptions, the symptoms are often confusing. Here are common issues and how to diagnose them.
Problem: "My number displays as garbage characters" - Cause: The field is COMP or COMP-3, but you are trying to DISPLAY it directly or write it to a text file. Binary and packed decimal are not human-readable. - Fix: MOVE the value to a DISPLAY-usage edited field before displaying.
Problem: "My arithmetic gives wrong results"
- Cause: Missing S (sign) in the PIC clause — negative intermediate results lose their sign.
- Fix: Always use S on fields that participate in arithmetic where results might be negative.
Problem: "My record has extra bytes I can't account for" - Cause: Slack bytes from SYNC or misalignment. Or SIGN IS SEPARATE adding an extra byte. - Fix: Check for SYNC clauses. Use a hex dump to see the actual record content.
Problem: "REDEFINES fields show garbage after I move data" - Cause: You are reading the wrong variant. Check the record type before accessing type-specific fields. - Fix: Always validate the record type discriminator before accessing REDEFINES variants.
Problem: "My OCCURS DEPENDING ON record has wrong length" - Cause: The DEPENDING ON field was not set before the WRITE. - Fix: Always set the ODO object before referencing the table or writing the record.
🧪 Debugging Exercise: Given this code, identify the three bugs:
01 WS-AMOUNT PIC 9(7)V99 COMP-3.
01 WS-COUNTER PIC 9(3).
01 WS-RESULT PIC 9(7)V99.
PROCEDURE DIVISION.
MOVE 1234567.89 TO WS-AMOUNT
COMPUTE WS-RESULT = WS-AMOUNT * -1
DISPLAY "AMOUNT: " WS-AMOUNT
DISPLAY "RESULT: " WS-RESULT
Bugs: (1) WS-AMOUNT has no S — it cannot hold negative values if needed. (2) WS-RESULT has no S — the negative result of the COMPUTE will lose its sign. (3) DISPLAYing WS-AMOUNT directly shows packed decimal bytes, not readable text. You should MOVE it to a DISPLAY-usage edited field first.
4.16 Advanced REDEFINES Patterns
REDEFINES is one of COBOL's most powerful — and most frequently misused — data description features. In this section, we explore patterns that go beyond the basics, drawing on real production scenarios from GlobalBank and MedClaim.
4.16.1 Multiple REDEFINES on the Same Area
A single data area can have more than one REDEFINES overlay:
01 WS-DATE-AREA PIC X(08).
01 WS-DATE-NUMERIC REDEFINES WS-DATE-AREA
PIC 9(08).
01 WS-DATE-PARTS REDEFINES WS-DATE-AREA.
05 WS-DT-YYYY PIC 9(04).
05 WS-DT-MM PIC 9(02).
05 WS-DT-DD PIC 9(02).
01 WS-DATE-DISPLAY REDEFINES WS-DATE-AREA.
05 WS-DT-CC PIC 9(02).
05 WS-DT-YY PIC 9(02).
05 WS-DT-MONTH PIC 9(02).
05 WS-DT-DAY PIC 9(02).
Each REDEFINES refers back to the original item (WS-DATE-AREA), not to the previous REDEFINES. All three overlays share the same eight bytes of storage, and the programmer chooses which view to use based on the operation needed.
4.16.2 REDEFINES for External Interface Translation
When GlobalBank receives data from external partners, the format often differs from internal conventions. Derek Washington uses REDEFINES to create translation layers:
*--- External partner sends amount as display numeric ---
01 EXT-AMOUNT-DISPLAY PIC X(12).
01 EXT-AMOUNT-NUMERIC REDEFINES EXT-AMOUNT-DISPLAY
PIC 9(10)V99.
*--- Validate before treating as numeric ---
IF EXT-AMOUNT-DISPLAY IS NUMERIC
ADD EXT-AMOUNT-NUMERIC TO WS-RUNNING-TOTAL
ELSE
PERFORM HANDLE-BAD-AMOUNT
END-IF
The validation step is critical: the REDEFINES allows you to examine the raw bytes as alphanumeric first, then treat them as numeric only after confirming the content is valid. Without this pattern, a non-numeric external field would cause an S0C7 ABEND the moment you attempted arithmetic.
4.16.3 REDEFINES for Bitwise Flag Interpretation
Some legacy systems pack multiple boolean flags into a single byte. REDEFINES lets you decode them:
01 WS-FLAGS-BYTE PIC X(01).
01 WS-FLAGS-DETAIL REDEFINES WS-FLAGS-BYTE.
05 WS-FLAG-HIGH-NIBBLE PIC X(01).
*> Use condition names on the raw byte:
01 WS-FLAG-BYTE-88 REDEFINES WS-FLAGS-BYTE PIC X(01).
88 FLAG-ACTIVE VALUE X'80' THRU X'FF'.
88 FLAG-FROZEN VALUE X'40' X'41' X'C0' X'C1'.
This technique is common when interfacing with assembler-written subsystems that use individual bits as flags.
4.16.4 The REDEFINES-with-OCCURS Pattern
A powerful combination lets you access a block of data either as individual fields or as a table:
01 WS-QUARTERLY-AMOUNTS.
05 WS-Q1-AMT PIC S9(9)V99 COMP-3.
05 WS-Q2-AMT PIC S9(9)V99 COMP-3.
05 WS-Q3-AMT PIC S9(9)V99 COMP-3.
05 WS-Q4-AMT PIC S9(9)V99 COMP-3.
01 WS-QUARTERLY-TABLE REDEFINES WS-QUARTERLY-AMOUNTS.
05 WS-QTR-AMT PIC S9(9)V99 COMP-3
OCCURS 4 TIMES.
Now you can reference individual quarters by name (WS-Q1-AMT) for clarity in business logic, or loop through them with a subscript (WS-QTR-AMT(WS-IDX)) for accumulation. This is one of the most common and most useful REDEFINES patterns in production COBOL.
4.17 OCCURS DEPENDING ON: Edge Cases and Pitfalls
OCCURS DEPENDING ON (ODO) is straightforward in simple cases, but production systems reveal several edge cases that every COBOL developer must understand.
4.17.1 The "Phantom Data" Problem
When the ODO object is set to a value smaller than the data that was previously in the table, the bytes beyond the active portion still exist in memory — they are simply ignored by COBOL. However, they are not cleared:
01 WS-BATCH.
05 WS-ITEM-COUNT PIC 9(3) COMP.
05 WS-ITEMS OCCURS 1 TO 100
DEPENDING ON WS-ITEM-COUNT.
10 WS-ITEM-ID PIC X(10).
10 WS-ITEM-AMT PIC S9(7)V99 COMP-3.
* Load 50 items
MOVE 50 TO WS-ITEM-COUNT
PERFORM VARYING WS-IDX FROM 1 BY 1
UNTIL WS-IDX > 50
MOVE INPUT-ID(WS-IDX) TO WS-ITEM-ID(WS-IDX)
MOVE INPUT-AMT(WS-IDX) TO WS-ITEM-AMT(WS-IDX)
END-PERFORM
* Now reduce to 10 items
MOVE 10 TO WS-ITEM-COUNT
*> Items 11-50 still exist in memory but are "inactive"
*> A WRITE of this record sends only items 1-10
If you later increase WS-ITEM-COUNT back to 30, items 11-30 contain stale data from the previous load. Always initialize entries when increasing the count:
MOVE 30 TO WS-ITEM-COUNT
PERFORM VARYING WS-IDX FROM 11 BY 1
UNTIL WS-IDX > 30
INITIALIZE WS-ITEMS(WS-IDX)
END-PERFORM
4.17.2 ODO and Record Length Calculation
When an ODO record is written to a variable-length file, the system calculates the record length based on the current value of the ODO object. The formula is:
Record length = fixed portion + (ODO-count * entry-size)
For the WS-BATCH example above, each WS-ITEMS entry is 15 bytes (10 for ID + 5 for COMP-3 amount). The fixed portion is 2 bytes (WS-ITEM-COUNT as COMP). So:
Length with 50 items = 2 + (50 * 15) = 752 bytes
Length with 10 items = 2 + (10 * 15) = 152 bytes
Length with 0 items = 2 + (0 * 15) = 2 bytes
⚠️ Critical Rule: Always set the ODO object to the correct value before issuing a WRITE. If the ODO object is incorrect, the wrong number of bytes will be written, and subsequent reads will misinterpret the data.
4.17.3 ODO with Fields After the Table
If data items follow the ODO table in the same record, those items "float" — their physical position changes depending on the current ODO count:
01 WS-MESSAGE-RECORD.
05 WS-MSG-COUNT PIC 9(2) COMP.
05 WS-MSG-LINE PIC X(80)
OCCURS 1 TO 20
DEPENDING ON WS-MSG-COUNT.
05 WS-MSG-TRAILER PIC X(20).
*> WS-MSG-TRAILER's offset changes as WS-MSG-COUNT changes!
This is called a complex ODO and can cause subtle bugs. When WS-MSG-COUNT is 5, WS-MSG-TRAILER starts at byte 403 (2 + 580 + 1). When WS-MSG-COUNT is 10, it starts at byte 803. The compiler handles this correctly as long as WS-MSG-COUNT is accurate*, but any mismatch produces corrupted data. Priya Kapoor's advice: "If you can avoid putting fields after an ODO table, avoid it. If you cannot, document it heavily and triple-check every path that modifies the count."
4.18 Group-Level MOVE Behavior: Deep Dive
Understanding exactly how COBOL handles group-level MOVEs prevents an entire class of bugs that plague COBOL programs.
4.18.1 Group-to-Group MOVEs
When you MOVE one group item to another, COBOL treats both as simple alphanumeric strings. The move is a byte-for-byte copy with left-justification and space-padding:
01 WS-SOURCE.
05 WS-SRC-ID PIC 9(5) COMP.
05 WS-SRC-NAME PIC X(20).
05 WS-SRC-AMOUNT PIC S9(7)V99 COMP-3.
01 WS-TARGET.
05 WS-TGT-ID PIC 9(5) COMP.
05 WS-TGT-NAME PIC X(20).
05 WS-TGT-AMOUNT PIC S9(7)V99 COMP-3.
MOVE WS-SOURCE TO WS-TARGET
*> This works ONLY because both groups have identical
*> layouts. The bytes are copied without conversion.
This works correctly only when both group items have identical subordinate structures. If the layouts differ — even slightly — the byte-for-byte copy will misalign fields:
01 WS-SOURCE-V2.
05 WS-SRC2-ID PIC 9(5) COMP.
05 WS-SRC2-CODE PIC X(3). *> Extra field!
05 WS-SRC2-NAME PIC X(20).
05 WS-SRC2-AMOUNT PIC S9(7)V99 COMP-3.
MOVE WS-SOURCE-V2 TO WS-TARGET
*> DISASTER: WS-TGT-NAME now contains 3 bytes of
*> WS-SRC2-CODE followed by 17 bytes of WS-SRC2-NAME
4.18.2 MOVE SPACES vs. INITIALIZE
This distinction is so important it bears repeating with a concrete example:
01 WS-CUSTOMER.
05 WS-CUST-NAME PIC X(30).
05 WS-CUST-BALANCE PIC S9(9)V99 COMP-3.
05 WS-CUST-STATUS PIC X(1).
*--- WRONG: MOVE SPACES corrupts COMP-3 field ---
MOVE SPACES TO WS-CUSTOMER
*> WS-CUST-BALANCE now contains X'404040404040'
*> (EBCDIC spaces). This is NOT valid packed decimal.
*> Any arithmetic on WS-CUST-BALANCE will ABEND (S0C7).
*--- CORRECT: INITIALIZE respects types ---
INITIALIZE WS-CUSTOMER
*> WS-CUST-NAME = SPACES (correct for alphanumeric)
*> WS-CUST-BALANCE = +0000000000 in COMP-3 (correct)
*> WS-CUST-STATUS = SPACE (correct for alphanumeric)
💡 The Rule: Never use MOVE SPACES or MOVE LOW-VALUES to a group item that contains COMP or COMP-3 subordinates. Always use INITIALIZE. If you see MOVE SPACES TO record-name in legacy code and the record contains numeric computational fields, it is a latent bug waiting for a code path that performs arithmetic on those fields.
🧪 Try It Yourself: FILLER and Layout Verification
Design a record layout for a student enrollment system with these requirements:
- Student ID (9 digits), Student Name (first 20 + last 30), Date of Birth (YYYYMMDD with REDEFINES for year/month/day), GPA (format V99 as COMP-3), Credit Hours (3 digits as COMP), Enrollment Status with 88-levels for Active, Graduated, Withdrawn, Suspended, and a 15-byte FILLER for future expansion.
- Calculate the total byte count of your record manually.
- Create a second group that REDEFINES the name area as a single 50-character field for searching.
- Write INITIALIZE code and verify that it correctly handles all field types.
4.19 Chapter Summary
In this chapter, we mastered the full depth of COBOL's data description facilities:
- PICTURE clauses: Numeric (9, V, S, P), alphanumeric (X, A), and edited (Z, *, $, +, -, B, 0, /, CR, DB) symbols give you precise control over data format and display
- USAGE clause: DISPLAY (default, human-readable), COMP (binary, fast arithmetic), COMP-3 (packed decimal, essential for financial data), COMP-1/COMP-2 (floating point, avoid for money), COMP-5 (native binary, for system APIs)
- Level numbers: 01-49 for hierarchy, 66 for RENAMES, 77 for standalone items, 88 for condition names (COBOL's enumerations)
- REDEFINES: Overlays storage for variant records, data conversion, and alternative views of the same data
- OCCURS: Fixed and variable-length tables, with INDEXED BY for performance
- Supporting clauses: VALUE, JUSTIFIED, BLANK WHEN ZERO, SIGN, SYNCHRONIZED
The key themes of this chapter are Readability is a Feature — well-designed data descriptions are living documentation that communicates business semantics — and Defensive Programming — choosing the right USAGE, always including S for signed fields, using INITIALIZE instead of MOVE SPACES, and validating record types before accessing REDEFINES variants.
In Chapter 5, we will build on this foundation to explore numeric precision and arithmetic in depth — why COMP-3 prevents the rounding errors that COMP-1 and COMP-2 introduce, how COMPUTE handles intermediate results, and the patterns that financial COBOL programmers use to ensure every penny is accounted for.
Key Terms Introduced
| Term | Definition |
|---|---|
| PICTURE clause | Defines the data type and format of an elementary item |
| USAGE clause | Determines the physical storage format of a data item |
| Packed decimal | COMP-3 format storing two digits per byte, essential for exact decimal arithmetic |
| Condition name | An 88-level entry that tests for specific values of its parent item |
| REDEFINES | Overlays one data description on the storage of another |
| OCCURS | Creates a table (array) of repeating data items |
| OCCURS DEPENDING ON | Creates a variable-length table whose size is determined at runtime |
| INDEXED BY | Defines a hardware-optimized index for table access |
| Slack bytes | Invisible padding inserted by the compiler for binary field alignment |
| Figurative constant | Special COBOL values: ZERO, SPACE, HIGH-VALUE, LOW-VALUE |
| FILLER | A data item that occupies space but is never referenced by name |
| Group item | A data item with subordinate items; always treated as alphanumeric |
| Elementary item | A data item with a PIC clause; holds actual data |