MainframeMaster

COBOL Tutorial

COBOL BINARY-LONG

The BINARY-LONG data type in COBOL represents a specialized 32-bit integer format designed for seamless interoperability with C programming language applications, specifically matching the characteristics of C's long data type on 32-bit platforms. This data type provides a consistent 32-bit integer representation regardless of the platform, making it ideal for applications requiring fixed-size integer values for database integration, file processing, network communication, and cross-platform data exchange where predictable size and range are essential for maintaining data integrity across different systems.

Understanding BINARY-LONG

BINARY-LONG provides a fixed 32-bit integer representation (4 bytes) that matches the traditional C long data type on 32-bit systems. Unlike BINARY-C-LONG which varies by platform, BINARY-LONG maintains consistent size across all platforms, making it ideal for portable data structures.

Key Characteristics:

  • Fixed 32-bit (4 bytes) storage on all platforms
  • Range: -2,147,483,648 to 2,147,483,647 (signed)
  • Range: 0 to 4,294,967,295 (unsigned)
  • Platform-independent size
  • Optimal for database keys and counters
cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DATA DIVISION. WORKING-STORAGE SECTION. 01 DATABASE-KEYS. 05 CUSTOMER-ID USAGE BINARY-LONG. 05 ORDER-NUMBER USAGE BINARY-LONG. 05 PRODUCT-CODE USAGE BINARY-LONG. 05 TRANSACTION-ID USAGE BINARY-LONG. 01 COUNTERS-AND-LIMITS. 05 RECORD-COUNT USAGE BINARY-LONG. 05 MAX-RECORDS USAGE BINARY-LONG VALUE 1000000. 05 BUFFER-SIZE USAGE BINARY-LONG VALUE 8192. 01 SIGNED-VALUES. 05 BALANCE-OFFSET PIC S9(10) USAGE BINARY-LONG. 05 DELTA-AMOUNT PIC S9(10) USAGE BINARY-LONG. PROCEDURE DIVISION. MOVE 123456789 TO CUSTOMER-ID. MOVE 987654321 TO ORDER-NUMBER. MOVE 0 TO RECORD-COUNT.

Database Integration

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
*> Database operations with BINARY-LONG keys DATA DIVISION. WORKING-STORAGE SECTION. 01 DB-RECORD-STRUCTURE. 05 PK-ID USAGE BINARY-LONG. 05 FK-CUSTOMER-ID USAGE BINARY-LONG. 05 FK-PRODUCT-ID USAGE BINARY-LONG. 05 QUANTITY USAGE BINARY-LONG. 05 UNIT-PRICE PIC S9(7)V99 COMP-3. 05 TOTAL-AMOUNT PIC S9(9)V99 COMP-3. 01 QUERY-PARAMETERS. 05 START-ID USAGE BINARY-LONG. 05 END-ID USAGE BINARY-LONG. 05 BATCH-SIZE USAGE BINARY-LONG VALUE 1000. 01 SEQUENCE-GENERATORS. 05 NEXT-ORDER-ID USAGE BINARY-LONG. 05 NEXT-CUSTOMER-ID USAGE BINARY-LONG. 05 LAST-SEQUENCE USAGE BINARY-LONG. PROCEDURE DIVISION. GENERATE-NEW-ORDER-ID. *> Get next sequence value CALL "get_next_sequence" USING BY REFERENCE "ORDER_SEQ" BY REFERENCE NEXT-ORDER-ID END-CALL. MOVE NEXT-ORDER-ID TO PK-ID. DISPLAY "Generated Order ID: " PK-ID. BATCH-PROCESS-RECORDS. MOVE 1 TO START-ID. MOVE 1000 TO END-ID. PERFORM UNTIL START-ID > 1000000 CALL "process_batch" USING BY VALUE START-ID BY VALUE END-ID BY VALUE BATCH-SIZE END-CALL ADD BATCH-SIZE TO START-ID ADD BATCH-SIZE TO END-ID END-PERFORM. SEARCH-BY-RANGE. MOVE 100000 TO START-ID. MOVE 200000 TO END-ID. EXEC SQL SELECT customer_id, order_number, total_amount FROM orders WHERE order_id BETWEEN :START-ID AND :END-ID ORDER BY order_id END-EXEC.

File Processing and I/O

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
*> File processing with BINARY-LONG DATA DIVISION. WORKING-STORAGE SECTION. 01 FILE-HEADER. 05 MAGIC-NUMBER USAGE BINARY-LONG VALUE X"12345678". 05 VERSION-NUMBER USAGE BINARY-LONG VALUE 1. 05 RECORD-COUNT USAGE BINARY-LONG. 05 FILE-SIZE USAGE BINARY-LONG. 05 CHECKSUM USAGE BINARY-LONG. 01 INDEX-ENTRY. 05 RECORD-ID USAGE BINARY-LONG. 05 OFFSET-POSITION USAGE BINARY-LONG. 05 RECORD-LENGTH USAGE BINARY-LONG. 05 STATUS-FLAGS USAGE BINARY-LONG. 01 PROCESSING-STATS. 05 RECORDS-PROCESSED USAGE BINARY-LONG. 05 ERRORS-FOUND USAGE BINARY-LONG. 05 WARNINGS-COUNT USAGE BINARY-LONG. 05 ELAPSED-TIME USAGE BINARY-LONG. PROCEDURE DIVISION. WRITE-FILE-HEADER. MOVE 0 TO RECORD-COUNT. MOVE 0 TO FILE-SIZE. WRITE FILE-HEADER-RECORD FROM FILE-HEADER. DISPLAY "File header written:". DISPLAY " Magic: " MAGIC-NUMBER. DISPLAY " Version: " VERSION-NUMBER. CREATE-INDEX-ENTRY. ADD 1 TO RECORD-COUNT. MOVE RECORD-COUNT TO RECORD-ID. MOVE WS-CURRENT-POSITION TO OFFSET-POSITION. MOVE WS-RECORD-LENGTH TO RECORD-LENGTH. MOVE 0 TO STATUS-FLAGS. WRITE INDEX-RECORD FROM INDEX-ENTRY. CALCULATE-STATISTICS. DIVIDE ELAPSED-TIME BY 1000 GIVING WS-SECONDS. DIVIDE RECORDS-PROCESSED BY WS-SECONDS GIVING WS-RATE. DISPLAY "Processing Statistics:". DISPLAY " Records: " RECORDS-PROCESSED. DISPLAY " Errors: " ERRORS-FOUND. DISPLAY " Rate: " WS-RATE " records/second".

Best Practices

  • Use for database keys and foreign key relationships
  • Ideal for counters, sequence numbers, and array indices
  • Perfect for file headers and metadata structures
  • Validate values against the 32-bit integer range
  • Consider unsigned vs signed based on data requirements

Frequently Asked Questions

Q: What's the difference between BINARY-LONG and BINARY-C-LONG?

BINARY-LONG is always 32 bits (4 bytes) regardless of platform, while BINARY-C-LONG matches the C long type which varies by platform (32-bit on 32-bit systems, 64-bit on 64-bit systems). Use BINARY-LONG for consistent portable data structures.

Q: Can BINARY-LONG handle values larger than 2 billion?

For signed BINARY-LONG, the maximum value is 2,147,483,647. For unsigned, it's 4,294,967,295. If you need larger values, consider using BINARY-C-LONG on 64-bit platforms or multiple fields for extended precision.