MainframeMaster

COBOL Tutorial

Progress0 of 0 lessons

COBOL TABLE Clause - Quick Reference

The TABLE clause in COBOL is used to define table structures and arrays for organizing related data elements. It provides a way to create structured data collections that can be efficiently accessed and manipulated using index variables and OCCURS clauses.

Primary Use

Define table structures and arrays

Division

DATA DIVISION

Type

Data structure clause

Status

Optional clause

Overview

The TABLE clause is used in COBOL to define structured data arrays and tables. It is typically used in conjunction with the OCCURS clause to create organized collections of related data elements. TABLE structures provide efficient access to data through indexing and are particularly useful for storing lookup tables, configuration data, and collections of similar records. They offer better data organization compared to individual fields and enable structured data processing.

Syntax

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
level-number table-name OCCURS integer TIMES. * Examples: 01 SIMPLE-TABLE. 05 TABLE-ITEM OCCURS 10 TIMES PIC 9(3). 01 COMPLEX-TABLE. 05 TABLE-ENTRY OCCURS 100 TIMES. 10 ENTRY-ID PIC 9(5). 10 ENTRY-NAME PIC X(20). 10 ENTRY-VALUE PIC 9(7)V99. 01 LOOKUP-TABLE. 05 LOOKUP-ITEM OCCURS 50 TIMES. 10 LOOKUP-CODE PIC X(3). 10 LOOKUP-DESC PIC X(30).

Practical Examples

Basic TABLE Usage

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
* Basic TABLE structure example IDENTIFICATION DIVISION. PROGRAM-ID. BASIC-TABLE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 SIMPLE-ARRAY. 05 ARRAY-ELEMENT OCCURS 5 TIMES PIC 9(3). 01 INDEX-VARIABLE PIC 9(2) VALUE 1. PROCEDURE DIVISION. MAIN-LOGIC. * Initialize table elements MOVE 100 TO ARRAY-ELEMENT(1) MOVE 200 TO ARRAY-ELEMENT(2) MOVE 300 TO ARRAY-ELEMENT(3) MOVE 400 TO ARRAY-ELEMENT(4) MOVE 500 TO ARRAY-ELEMENT(5) * Display all elements PERFORM VARYING INDEX-VARIABLE FROM 1 BY 1 UNTIL INDEX-VARIABLE > 5 DISPLAY "Element " INDEX-VARIABLE ": " ARRAY-ELEMENT(INDEX-VARIABLE) END-PERFORM * Calculate sum of all elements MOVE 0 TO WS-SUM PERFORM VARYING INDEX-VARIABLE FROM 1 BY 1 UNTIL INDEX-VARIABLE > 5 ADD ARRAY-ELEMENT(INDEX-VARIABLE) TO WS-SUM END-PERFORM DISPLAY "Sum of all elements: " WS-SUM STOP RUN.

Explanation: This example demonstrates basic TABLE usage with a simple array. The program defines a table with 5 elements, initializes each element with a value, displays all elements using a loop, and calculates the sum of all elements. This shows how TABLE structures provide organized storage and efficient access to related data elements using index variables.

Complex TABLE Structure

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
* Complex TABLE structure example IDENTIFICATION DIVISION. PROGRAM-ID. COMPLEX-TABLE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-TABLE. 05 EMPLOYEE-ENTRY OCCURS 10 TIMES. 10 EMP-ID PIC 9(5). 10 EMP-NAME PIC X(30). 10 EMP-DEPT PIC X(10). 10 EMP-SALARY PIC 9(7)V99. 10 EMP-HIRE-DATE PIC 9(8). 01 TABLE-INDEX PIC 9(2) VALUE 1. 01 SEARCH-ID PIC 9(5). 01 FOUND-FLAG PIC X VALUE 'N'. 88 EMPLOYEE-FOUND VALUE 'Y'. PROCEDURE DIVISION. MAIN-LOGIC. * Initialize employee table PERFORM INITIALIZE-EMPLOYEE-TABLE * Search for employee by ID MOVE 10001 TO SEARCH-ID PERFORM SEARCH-EMPLOYEE IF EMPLOYEE-FOUND DISPLAY "Employee found: " EMP-NAME(TABLE-INDEX) DISPLAY "Department: " EMP-DEPT(TABLE-INDEX) DISPLAY "Salary: " EMP-SALARY(TABLE-INDEX) ELSE DISPLAY "Employee not found" END-IF * Display all employees in a department PERFORM DISPLAY-DEPARTMENT-EMPLOYEES STOP RUN. INITIALIZE-EMPLOYEE-TABLE. * Initialize first employee MOVE 10001 TO EMP-ID(1) MOVE "John Smith" TO EMP-NAME(1) MOVE "IT" TO EMP-DEPT(1) MOVE 75000.00 TO EMP-SALARY(1) MOVE 20200101 TO EMP-HIRE-DATE(1) * Initialize second employee MOVE 10002 TO EMP-ID(2) MOVE "Jane Doe" TO EMP-NAME(2) MOVE "HR" TO EMP-DEPT(2) MOVE 65000.00 TO EMP-SALARY(2) MOVE 20200215 TO EMP-HIRE-DATE(2) * Continue for other employees... SEARCH-EMPLOYEE. PERFORM VARYING TABLE-INDEX FROM 1 BY 1 UNTIL TABLE-INDEX > 10 OR EMPLOYEE-FOUND IF EMP-ID(TABLE-INDEX) = SEARCH-ID SET EMPLOYEE-FOUND TO TRUE END-IF END-PERFORM. DISPLAY-DEPARTMENT-EMPLOYEES. DISPLAY "Employees in IT department:" PERFORM VARYING TABLE-INDEX FROM 1 BY 1 UNTIL TABLE-INDEX > 10 IF EMP-DEPT(TABLE-INDEX) = "IT" DISPLAY " " EMP-NAME(TABLE-INDEX) " - " EMP-SALARY(TABLE-INDEX) END-IF END-PERFORM.

Explanation: This example shows a complex TABLE structure for employee data. The table contains multiple fields for each employee (ID, name, department, salary, hire date). The program demonstrates how to initialize the table, search for specific employees, and display employees by department. This illustrates how TABLE structures can organize complex related data and provide efficient access patterns for business applications.

Lookup TABLE

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
* Lookup TABLE example IDENTIFICATION DIVISION. PROGRAM-ID. LOOKUP-TABLE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 STATE-CODE-TABLE. 05 STATE-ENTRY OCCURS 50 TIMES. 10 STATE-CODE PIC X(2). 10 STATE-NAME PIC X(20). 01 LOOKUP-INDEX PIC 9(2) VALUE 1. 01 SEARCH-CODE PIC X(2). 01 FOUND-STATE PIC X(20). 01 FOUND-FLAG PIC X VALUE 'N'. 88 STATE-FOUND VALUE 'Y'. PROCEDURE DIVISION. MAIN-LOGIC. * Initialize state code lookup table PERFORM INITIALIZE-STATE-TABLE * Look up state names by code MOVE "CA" TO SEARCH-CODE PERFORM LOOKUP-STATE IF STATE-FOUND DISPLAY "State code " SEARCH-CODE " is " FOUND-STATE ELSE DISPLAY "State code " SEARCH-CODE " not found" END-IF MOVE "NY" TO SEARCH-CODE PERFORM LOOKUP-STATE IF STATE-FOUND DISPLAY "State code " SEARCH-CODE " is " FOUND-STATE ELSE DISPLAY "State code " SEARCH-CODE " not found" END-IF STOP RUN. INITIALIZE-STATE-TABLE. * Initialize state codes and names MOVE "AL" TO STATE-CODE(1) MOVE "Alabama" TO STATE-NAME(1) MOVE "AK" TO STATE-CODE(2) MOVE "Alaska" TO STATE-NAME(2) MOVE "AZ" TO STATE-CODE(3) MOVE "Arizona" TO STATE-NAME(3) MOVE "CA" TO STATE-CODE(4) MOVE "California" TO STATE-NAME(4) MOVE "NY" TO STATE-CODE(5) MOVE "New York" TO STATE-NAME(5) * Continue for other states... LOOKUP-STATE. MOVE "N" TO FOUND-FLAG PERFORM VARYING LOOKUP-INDEX FROM 1 BY 1 UNTIL LOOKUP-INDEX > 50 OR STATE-FOUND IF STATE-CODE(LOOKUP-INDEX) = SEARCH-CODE MOVE STATE-NAME(LOOKUP-INDEX) TO FOUND-STATE SET STATE-FOUND TO TRUE END-IF END-PERFORM.

Explanation: This example demonstrates using a TABLE structure as a lookup table. The program defines a table that maps state codes to state names, initializes it with data, and provides a lookup function to find state names by their codes. This shows how TABLE structures can be used for data validation, code-to-description mapping, and other lookup operations that are common in business applications.

Multi-dimensional TABLE

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
* Multi-dimensional TABLE example IDENTIFICATION DIVISION. PROGRAM-ID. MULTI-DIM-TABLE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 SALES-TABLE. 05 SALES-ENTRY OCCURS 12 TIMES. * Months 10 PRODUCT-SALES OCCURS 5 TIMES. * Products 15 SALES-AMOUNT PIC 9(7)V99. 15 SALES-COUNT PIC 9(5). 01 MONTH-INDEX PIC 9(2) VALUE 1. 01 PRODUCT-INDEX PIC 9(1) VALUE 1. 01 TOTAL-SALES PIC 9(9)V99. 01 PRODUCT-TOTALS. 05 PRODUCT-TOTAL OCCURS 5 TIMES PIC 9(8)V99. PROCEDURE DIVISION. MAIN-LOGIC. * Initialize sales table with sample data PERFORM INITIALIZE-SALES-TABLE * Calculate total sales for each product PERFORM CALCULATE-PRODUCT-TOTALS * Display product totals PERFORM DISPLAY-PRODUCT-TOTALS * Calculate grand total MOVE 0 TO TOTAL-SALES PERFORM VARYING PRODUCT-INDEX FROM 1 BY 1 UNTIL PRODUCT-INDEX > 5 ADD PRODUCT-TOTAL(PRODUCT-INDEX) TO TOTAL-SALES END-PERFORM DISPLAY "Grand total sales: " TOTAL-SALES STOP RUN. INITIALIZE-SALES-TABLE. * Initialize with sample sales data PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 PERFORM VARYING PRODUCT-INDEX FROM 1 BY 1 UNTIL PRODUCT-INDEX > 5 * Generate sample data COMPUTE SALES-AMOUNT(MONTH-INDEX, PRODUCT-INDEX) = (MONTH-INDEX * 1000) + (PRODUCT-INDEX * 100) MOVE 50 TO SALES-COUNT(MONTH-INDEX, PRODUCT-INDEX) END-PERFORM END-PERFORM. CALCULATE-PRODUCT-TOTALS. PERFORM VARYING PRODUCT-INDEX FROM 1 BY 1 UNTIL PRODUCT-INDEX > 5 MOVE 0 TO PRODUCT-TOTAL(PRODUCT-INDEX) PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 ADD SALES-AMOUNT(MONTH-INDEX, PRODUCT-INDEX) TO PRODUCT-TOTAL(PRODUCT-INDEX) END-PERFORM END-PERFORM. DISPLAY-PRODUCT-TOTALS. DISPLAY "Product Sales Totals:" PERFORM VARYING PRODUCT-INDEX FROM 1 BY 1 UNTIL PRODUCT-INDEX > 5 DISPLAY "Product " PRODUCT-INDEX ": " PRODUCT-TOTAL(PRODUCT-INDEX) END-PERFORM.

Explanation: This example demonstrates a multi-dimensional TABLE structure for sales data. The table has two dimensions: months (12) and products (5). The program shows how to initialize a multi-dimensional table, calculate totals across dimensions, and display summary information. This illustrates how TABLE structures can handle complex data relationships and provide efficient access to multi-dimensional data for business analysis and reporting.

Best Practices and Considerations

Important Considerations

  • TABLE structures allocate memory for all occurrences
  • Use appropriate index variables for access
  • Consider memory usage for large tables
  • Validate index bounds to prevent errors
  • Use meaningful names for table elements

Advantages

  • Organized data storage and access
  • Efficient indexed access to elements
  • Structured data processing
  • Better data organization
  • Supports complex data relationships

Limitations

  • Fixed size allocation for all occurrences
  • Memory usage increases with table size
  • Requires index validation
  • May not be suitable for dynamic data
  • Can be complex for very large tables

Best Practices

  • • Use meaningful names for table elements
  • • Validate index bounds before access
  • • Consider memory usage for large tables
  • • Use appropriate data types for table elements
  • • Document table structure and usage

Test Your Knowledge

1. What is the primary purpose of the TABLE clause in COBOL?

  • To create database tables
  • To define table structures and arrays for data organization
  • To create file tables
  • To define table relationships

2. In which COBOL division is the TABLE clause typically used?

  • IDENTIFICATION DIVISION
  • ENVIRONMENT DIVISION
  • DATA DIVISION
  • PROCEDURE DIVISION

3. What is the relationship between TABLE and OCCURS?

  • They are the same thing
  • TABLE is used with OCCURS to define arrays
  • OCCURS is used with TABLE to define arrays
  • They are completely unrelated

4. What are the main benefits of using TABLE structures?

  • Reduced memory usage
  • Better data organization and structured access
  • Faster file operations
  • Enhanced error handling

5. How do you access elements in a COBOL table?

  • Using array notation like other languages
  • Using subscript notation with parentheses
  • Using index variables with OCCURS
  • All of the above