The MODE specification represents sophisticated access pattern control mechanisms within COBOL file handling environments, providing comprehensive data retrieval strategies, advanced access mode management, and optimized file processing capabilities that enable flexible data access patterns, efficient record retrieval operations, and intelligent file navigation techniques. These mechanisms embody modern data access principles by supporting versatile access methodologies, enabling optimized I/O operations, and facilitating comprehensive file processing requirements while maintaining performance efficiency, ensuring consistent access behavior, and enabling scalable data processing architectures across enterprise applications requiring sophisticated file access control, predictable data retrieval patterns, and reliable file operation management throughout complex business processing scenarios.
123456789101112131415161718192021222324252627282930313233343536*> ACCESS MODE specifications in FILE-CONTROL SELECT file-name ASSIGN TO external-name ORGANIZATION IS {SEQUENTIAL | INDEXED | RELATIVE} ACCESS MODE IS {SEQUENTIAL | RANDOM | DYNAMIC} [RECORD KEY IS key-field] [ALTERNATE RECORD KEY IS alt-key-field] [FILE STATUS IS status-field]. *> Examples: *> Sequential access mode SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-CUST-STATUS. *> Random access mode SELECT INVENTORY-FILE ASSIGN TO "INVENTORY.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS ITEM-CODE FILE STATUS IS WS-INV-STATUS. *> Dynamic access mode SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS EMP-ID ALTERNATE RECORD KEY IS EMP-SSN FILE STATUS IS WS-EMP-STATUS. *> Relative file with random access SELECT TRANSACTION-FILE ASSIGN TO "TRANS.DAT" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS WS-RECORD-NUMBER FILE STATUS IS WS-TRANS-STATUS.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444IDENTIFICATION DIVISION. PROGRAM-ID. ACCESS-MODE-DEMONSTRATION. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> Sequential access file SELECT SALES-SEQUENTIAL ASSIGN TO "SALES-SEQ.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-SEQ-STATUS. *> Random access indexed file SELECT CUSTOMER-RANDOM ASSIGN TO "CUST-RND.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUST-ID FILE STATUS IS WS-RND-STATUS. *> Dynamic access indexed file SELECT PRODUCT-DYNAMIC ASSIGN TO "PROD-DYN.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS PROD-ID ALTERNATE RECORD KEY IS PROD-NAME WITH DUPLICATES FILE STATUS IS WS-DYN-STATUS. *> Relative file with dynamic access SELECT ORDER-RELATIVE ASSIGN TO "ORDER-REL.DAT" ORGANIZATION IS RELATIVE ACCESS MODE IS DYNAMIC RELATIVE KEY IS WS-RELATIVE-KEY FILE STATUS IS WS-REL-STATUS. DATA DIVISION. FILE SECTION. FD SALES-SEQUENTIAL. 01 SALES-RECORD. 05 SALE-ID PIC X(8). 05 SALE-DATE PIC 9(8). 05 SALE-AMOUNT PIC 9(8)V99. 05 CUSTOMER-ID PIC X(6). 05 SALESPERSON PIC X(20). FD CUSTOMER-RANDOM. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(6). 05 CUST-NAME PIC X(30). 05 CUST-ADDRESS PIC X(50). 05 CUST-CREDIT-LIMIT PIC 9(8)V99. 05 CUST-BALANCE PIC 9(8)V99. FD PRODUCT-DYNAMIC. 01 PRODUCT-RECORD. 05 PROD-ID PIC X(8). 05 PROD-NAME PIC X(30). 05 PROD-CATEGORY PIC X(15). 05 PROD-PRICE PIC 9(6)V99. 05 PROD-QUANTITY PIC 9(6). FD ORDER-RELATIVE. 01 ORDER-RECORD. 05 ORDER-ID PIC X(10). 05 ORDER-DATE PIC 9(8). 05 ORDER-CUSTOMER PIC X(6). 05 ORDER-TOTAL PIC 9(8)V99. 05 ORDER-STATUS PIC X(10). WORKING-STORAGE SECTION. *> File status variables 01 WS-FILE-STATUS. 05 WS-SEQ-STATUS PIC X(2). 05 WS-RND-STATUS PIC X(2). 05 WS-DYN-STATUS PIC X(2). 05 WS-REL-STATUS PIC X(2). *> Access mode control variables 01 WS-ACCESS-CONTROL. 05 WS-RELATIVE-KEY PIC 9(6). 05 WS-SEARCH-KEY PIC X(8). 05 WS-ACCESS-METHOD PIC X(15). 05 WS-OPERATION-COUNT PIC 9(6) VALUE 0. *> Processing statistics 01 WS-PROCESSING-STATS. 05 WS-SEQUENTIAL-READS PIC 9(6) VALUE 0. 05 WS-RANDOM-READS PIC 9(6) VALUE 0. 05 WS-DYNAMIC-READS PIC 9(6) VALUE 0. 05 WS-TOTAL-OPERATIONS PIC 9(8) VALUE 0. *> Sample search keys 01 WS-SAMPLE-KEYS. 05 WS-CUSTOMER-KEYS. 10 FILLER PIC X(6) VALUE "CUST01". 10 FILLER PIC X(6) VALUE "CUST02". 10 FILLER PIC X(6) VALUE "CUST03". 10 FILLER PIC X(6) VALUE "CUST04". 10 FILLER PIC X(6) VALUE "CUST05". 05 WS-CUST-KEY-TABLE REDEFINES WS-CUSTOMER-KEYS. 10 WS-CUST-KEY-ENTRY OCCURS 5 TIMES PIC X(6). PROCEDURE DIVISION. MAIN-ACCESS-MODE-DEMO. DISPLAY "=== COBOL ACCESS MODE DEMONSTRATION ===" DISPLAY SPACES PERFORM DEMONSTRATE-SEQUENTIAL-ACCESS PERFORM DEMONSTRATE-RANDOM-ACCESS PERFORM DEMONSTRATE-DYNAMIC-ACCESS PERFORM DEMONSTRATE-RELATIVE-ACCESS PERFORM DISPLAY-ACCESS-STATISTICS DISPLAY "=== ACCESS MODE DEMO COMPLETE ===" STOP RUN. DEMONSTRATE-SEQUENTIAL-ACCESS. DISPLAY "=== SEQUENTIAL ACCESS MODE ===" DISPLAY SPACES MOVE "SEQUENTIAL" TO WS-ACCESS-METHOD DISPLAY "Demonstrating sequential file access..." OPEN INPUT SALES-SEQUENTIAL IF WS-SEQ-STATUS = "00" DISPLAY "Sequential file opened successfully" PERFORM PROCESS-SEQUENTIAL-RECORDS CLOSE SALES-SEQUENTIAL ELSE DISPLAY "Error opening sequential file: " WS-SEQ-STATUS END-IF DISPLAY "Sequential access characteristics:" DISPLAY " • Records read in physical order" DISPLAY " • Only READ NEXT operation available" DISPLAY " • Most efficient for full file processing" DISPLAY " • Minimal system overhead" DISPLAY "Sequential reads performed: " WS-SEQUENTIAL-READS DISPLAY SPACES. PROCESS-SEQUENTIAL-RECORDS. 01 WS-RECORD-COUNT PIC 9(6) VALUE 0. 01 WS-TOTAL-SALES PIC 9(10)V99 VALUE 0. READ SALES-SEQUENTIAL AT END DISPLAY " End of sequential file reached" NOT AT END PERFORM PROCESS-SALES-RECORD END-READ PERFORM UNTIL WS-SEQ-STATUS NOT = "00" READ SALES-SEQUENTIAL AT END CONTINUE NOT AT END PERFORM PROCESS-SALES-RECORD END-READ END-PERFORM DISPLAY " Total sales records: " WS-RECORD-COUNT DISPLAY " Total sales amount: $" WS-TOTAL-SALES. PROCESS-SALES-RECORD. ADD 1 TO WS-RECORD-COUNT ADD 1 TO WS-SEQUENTIAL-READS ADD SALE-AMOUNT TO WS-TOTAL-SALES IF WS-RECORD-COUNT <= 3 DISPLAY " Sale: " SALE-ID " Amount: $" SALE-AMOUNT END-IF. DEMONSTRATE-RANDOM-ACCESS. DISPLAY "=== RANDOM ACCESS MODE ===" DISPLAY SPACES MOVE "RANDOM" TO WS-ACCESS-METHOD DISPLAY "Demonstrating random file access..." OPEN INPUT CUSTOMER-RANDOM IF WS-RND-STATUS = "00" DISPLAY "Random access file opened successfully" PERFORM PROCESS-RANDOM-LOOKUPS CLOSE CUSTOMER-RANDOM ELSE DISPLAY "Random access file not available (creating simulation)" PERFORM SIMULATE-RANDOM-ACCESS END-IF DISPLAY "Random access characteristics:" DISPLAY " • Direct record access by key" DISPLAY " • READ with key specification" DISPLAY " • Efficient for specific record retrieval" DISPLAY " • Requires indexed organization" DISPLAY "Random reads performed: " WS-RANDOM-READS DISPLAY SPACES. PROCESS-RANDOM-LOOKUPS. 01 WS-LOOKUP-INDEX PIC 9(2) VALUE 0. 01 WS-FOUND-COUNT PIC 9(3) VALUE 0. 01 WS-NOT-FOUND-COUNT PIC 9(3) VALUE 0. DISPLAY " Performing random customer lookups..." PERFORM VARYING WS-LOOKUP-INDEX FROM 1 BY 1 UNTIL WS-LOOKUP-INDEX > 5 MOVE WS-CUST-KEY-ENTRY(WS-LOOKUP-INDEX) TO CUST-ID READ CUSTOMER-RANDOM INVALID KEY ADD 1 TO WS-NOT-FOUND-COUNT DISPLAY " Customer " CUST-ID " not found" NOT INVALID KEY ADD 1 TO WS-FOUND-COUNT ADD 1 TO WS-RANDOM-READS DISPLAY " Found: " CUST-ID " - " CUST-NAME END-READ END-PERFORM DISPLAY " Customers found: " WS-FOUND-COUNT DISPLAY " Customers not found: " WS-NOT-FOUND-COUNT. SIMULATE-RANDOM-ACCESS. 01 WS-SIM-INDEX PIC 9(2) VALUE 0. DISPLAY " Simulating random access operations..." PERFORM VARYING WS-SIM-INDEX FROM 1 BY 1 UNTIL WS-SIM-INDEX > 5 MOVE WS-CUST-KEY-ENTRY(WS-SIM-INDEX) TO WS-SEARCH-KEY ADD 1 TO WS-RANDOM-READS DISPLAY " Random lookup: " WS-SEARCH-KEY " [SIMULATED]" END-PERFORM. DEMONSTRATE-DYNAMIC-ACCESS. DISPLAY "=== DYNAMIC ACCESS MODE ===" DISPLAY SPACES MOVE "DYNAMIC" TO WS-ACCESS-METHOD DISPLAY "Demonstrating dynamic file access..." OPEN INPUT PRODUCT-DYNAMIC IF WS-DYN-STATUS = "00" DISPLAY "Dynamic access file opened successfully" PERFORM PROCESS-DYNAMIC-OPERATIONS CLOSE PRODUCT-DYNAMIC ELSE DISPLAY "Dynamic access file not available (creating simulation)" PERFORM SIMULATE-DYNAMIC-ACCESS END-IF DISPLAY "Dynamic access characteristics:" DISPLAY " • Combines sequential and random access" DISPLAY " • READ NEXT and READ with key both available" DISPLAY " • Flexible access patterns in same program" DISPLAY " • START statement for positioning" DISPLAY "Dynamic reads performed: " WS-DYNAMIC-READS DISPLAY SPACES. PROCESS-DYNAMIC-OPERATIONS. DISPLAY " Performing mixed access operations..." *> Random access first MOVE "PROD001" TO PROD-ID READ PRODUCT-DYNAMIC INVALID KEY DISPLAY " Product PROD001 not found" NOT INVALID KEY ADD 1 TO WS-DYNAMIC-READS DISPLAY " Random read: " PROD-ID " - " PROD-NAME END-READ *> Position for sequential reading MOVE "PROD" TO PROD-ID START PRODUCT-DYNAMIC KEY >= PROD-ID INVALID KEY DISPLAY " No products found for positioning" NOT INVALID KEY DISPLAY " Positioned for sequential reading" PERFORM READ-SEQUENTIAL-FROM-POSITION END-START. READ-SEQUENTIAL-FROM-POSITION. 01 WS-SEQ-COUNT PIC 9(2) VALUE 0. READ PRODUCT-DYNAMIC NEXT AT END DISPLAY " End of product file" NOT AT END ADD 1 TO WS-DYNAMIC-READS ADD 1 TO WS-SEQ-COUNT DISPLAY " Sequential read: " PROD-ID " - " PROD-NAME END-READ PERFORM UNTIL WS-DYN-STATUS NOT = "00" OR WS-SEQ-COUNT >= 3 READ PRODUCT-DYNAMIC NEXT AT END CONTINUE NOT AT END ADD 1 TO WS-DYNAMIC-READS ADD 1 TO WS-SEQ-COUNT DISPLAY " Sequential read: " PROD-ID " - " PROD-NAME END-READ END-PERFORM. SIMULATE-DYNAMIC-ACCESS. DISPLAY " Simulating dynamic access operations..." DISPLAY " Random access: PROD001 [SIMULATED]" DISPLAY " Position: START KEY >= 'PROD' [SIMULATED]" DISPLAY " Sequential: READ NEXT × 3 [SIMULATED]" ADD 4 TO WS-DYNAMIC-READS. DEMONSTRATE-RELATIVE-ACCESS. DISPLAY "=== RELATIVE FILE ACCESS ===" DISPLAY SPACES DISPLAY "Demonstrating relative file access..." OPEN INPUT ORDER-RELATIVE IF WS-REL-STATUS = "00" DISPLAY "Relative file opened successfully" PERFORM PROCESS-RELATIVE-OPERATIONS CLOSE ORDER-RELATIVE ELSE DISPLAY "Relative file not available (creating simulation)" PERFORM SIMULATE-RELATIVE-ACCESS END-IF DISPLAY "Relative file characteristics:" DISPLAY " • Records accessed by relative record number" DISPLAY " • Direct positioning by record number" DISPLAY " • Efficient for array-like access patterns" DISPLAY " • Sequential or random access possible" DISPLAY SPACES. PROCESS-RELATIVE-OPERATIONS. 01 WS-REL-COUNT PIC 9(3) VALUE 0. 01 WS-TARGET-RECORDS. 05 WS-TARGET-RRN OCCURS 5 TIMES PIC 9(4) VALUE 1, 5, 10, 15, 20. DISPLAY " Accessing records by relative record number..." PERFORM VARYING WS-REL-COUNT FROM 1 BY 1 UNTIL WS-REL-COUNT > 5 MOVE WS-TARGET-RRN(WS-REL-COUNT) TO WS-RELATIVE-KEY READ ORDER-RELATIVE INVALID KEY DISPLAY " RRN " WS-RELATIVE-KEY " not found" NOT INVALID KEY DISPLAY " RRN " WS-RELATIVE-KEY ": " ORDER-ID END-READ END-PERFORM. SIMULATE-RELATIVE-ACCESS. 01 WS-SIM-RRN PIC 9(4). 01 WS-SIM-COUNT PIC 9(2) VALUE 0. DISPLAY " Simulating relative record access..." PERFORM VARYING WS-SIM-COUNT FROM 1 BY 1 UNTIL WS-SIM-COUNT > 5 COMPUTE WS-SIM-RRN = WS-SIM-COUNT * 5 DISPLAY " RRN " WS-SIM-RRN " access [SIMULATED]" END-PERFORM. DISPLAY-ACCESS-STATISTICS. DISPLAY "=== ACCESS MODE STATISTICS ===" DISPLAY SPACES COMPUTE WS-TOTAL-OPERATIONS = WS-SEQUENTIAL-READS + WS-RANDOM-READS + WS-DYNAMIC-READS DISPLAY "File access operation summary:" DISPLAY " Sequential reads: " WS-SEQUENTIAL-READS DISPLAY " Random reads: " WS-RANDOM-READS DISPLAY " Dynamic reads: " WS-DYNAMIC-READS DISPLAY " Total operations: " WS-TOTAL-OPERATIONS DISPLAY "Access mode recommendations:" DISPLAY " • Use SEQUENTIAL for full file processing" DISPLAY " • Use RANDOM for specific record lookup" DISPLAY " • Use DYNAMIC for mixed access patterns" DISPLAY " • Consider file size and access patterns" DISPLAY "Performance considerations:" DISPLAY " • Sequential: Fastest for complete processing" DISPLAY " • Random: Fastest for individual lookups" DISPLAY " • Dynamic: Flexible but may have overhead" DISPLAY " • Match access mode to usage patterns" DISPLAY SPACES. *> ================================================== *> UTILITY PROCEDURES FOR ACCESS MODE OPERATIONS *> ================================================== ACCESS-MODE-UTILITIES. VALIDATE-ACCESS-MODE-SETUP. *> Validate file access mode configuration DISPLAY "Validating access mode setup..." DISPLAY " Sequential file: ✓ Configured" DISPLAY " Random access file: ✓ Configured with key" DISPLAY " Dynamic access file: ✓ Configured with keys" DISPLAY " Relative file: ✓ Configured with relative key". OPTIMIZE-ACCESS-PATTERNS. *> Suggest optimizations based on access patterns DISPLAY "Access pattern optimization suggestions:" IF WS-SEQUENTIAL-READS > WS-RANDOM-READS DISPLAY " → Consider sequential processing optimization" ELSE DISPLAY " → Consider indexed access optimization" END-IF IF WS-DYNAMIC-READS > 0 DISPLAY " → Mixed access pattern detected" DISPLAY " → Consider separating sequential/random operations" END-IF. MONITOR-ACCESS-PERFORMANCE. *> Monitor and report access performance 01 WS-PERFORMANCE-METRICS. 05 WS-AVG-ACCESS-TIME PIC 9(4)V99. 05 WS-CACHE-HIT-RATIO PIC 9(3)V99. DISPLAY "Access performance monitoring:" DISPLAY " Average access time: " WS-AVG-ACCESS-TIME " ms" DISPLAY " Cache hit ratio: " WS-CACHE-HIT-RATIO "%" DISPLAY " Total I/O operations: " WS-TOTAL-OPERATIONS. IMPLEMENT-ACCESS-STRATEGY. *> Implement optimal access strategy EVALUATE TRUE WHEN WS-SEQUENTIAL-READS > 100 DISPLAY "Strategy: Optimize for sequential processing" WHEN WS-RANDOM-READS > 50 DISPLAY "Strategy: Optimize for random access" WHEN WS-DYNAMIC-READS > 20 DISPLAY "Strategy: Optimize for mixed access patterns" WHEN OTHER DISPLAY "Strategy: Default balanced approach" END-EVALUATE.
12345678910111213141516171819202122232425262728293031323334*> Scenario 1: Monthly report processing (all records) SELECT TRANSACTION-FILE ASSIGN TO "TRANS.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-TRANS-STATUS. *> Scenario 2: Customer inquiry system (specific lookups) SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID FILE STATUS IS WS-CUST-STATUS. *> Scenario 3: Order processing (mixed access patterns) SELECT ORDER-FILE ASSIGN TO "ORDERS.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS ORDER-NUMBER ALTERNATE RECORD KEY IS CUSTOMER-ID WITH DUPLICATES FILE STATUS IS WS-ORDER-STATUS. PROCEDURE DIVISION. *> Monthly report - sequential processing GENERATE-MONTHLY-REPORT. OPEN INPUT TRANSACTION-FILE READ TRANSACTION-FILE AT END CONTINUE END-READ PERFORM UNTIL WS-TRANS-STATUS NOT = "00" PERFORM PROCESS-TRANSACTION READ TRANSACTION-FILE END-READ END-PERFORM CLOSE TRANSACTION-FILE.
1234567891011121314151617181920212223242526272829303132333435*> Mixed access pattern example PROCESS-CUSTOMER-ORDERS. OPEN I-O ORDER-FILE *> Direct access to specific order MOVE "ORD123456" TO ORDER-NUMBER READ ORDER-FILE INVALID KEY DISPLAY "Order not found" NOT INVALID KEY PERFORM UPDATE-ORDER-STATUS END-READ *> Position for sequential reading of customer orders MOVE "CUST001" TO CUSTOMER-ID START ORDER-FILE KEY = CUSTOMER-ID INVALID KEY DISPLAY "No orders for customer" NOT INVALID KEY PERFORM READ-CUSTOMER-ORDERS END-START CLOSE ORDER-FILE. READ-CUSTOMER-ORDERS. READ ORDER-FILE NEXT AT END MOVE "Y" TO WS-END-OF-ORDERS NOT AT END IF CUSTOMER-ID = "CUST001" PERFORM PROCESS-CUSTOMER-ORDER ELSE MOVE "Y" TO WS-END-OF-ORDERS END-IF END-READ.
When should you use DYNAMIC access mode instead of SEQUENTIAL or RANDOM?
Answer: Use DYNAMIC access mode when your program needs both sequential processing (READ NEXT) and random access (READ with key) capabilities. It's ideal for applications that need to position within a file and then read sequentially, or mix direct lookups with sequential processing.
How does file organization affect access mode choices?
Answer: SEQUENTIAL organization only supports SEQUENTIAL access. INDEXED organization supports all three modes (SEQUENTIAL, RANDOM, DYNAMIC). RELATIVE organization supports SEQUENTIAL and RANDOM access, with record positioning by relative record number.
What are the performance trade-offs between different access modes?
Answer: SEQUENTIAL has lowest overhead and is fastest for complete file processing. RANDOM provides fastest access for individual records but has higher overhead per operation. DYNAMIC offers flexibility but may have performance overhead when switching between access patterns.