The OPEN
statement in COBOL is used to make files available for processing by establishing a connection between the program and the external file. It specifies the access mode (INPUT, OUTPUT, I-O, or EXTEND) and prepares the file for subsequent read, write, or update operations. Proper file opening is essential for all file processing operations.
OPEN { INPUT } file-name-1 [file-name-2] ... { OUTPUT } { I-O } { EXTEND } *> Multiple modes in one statement OPEN INPUT file-name-1 [file-name-2] ... OUTPUT file-name-3 [file-name-4] ... I-O file-name-5 [file-name-6] ... EXTEND file-name-7 [file-name-8] ...
Read-only access to existing files
Write-only access, creates new file or overwrites existing
Read and write access for updating records
Write-only access, appends to end of existing file
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-CUST-STATUS. SELECT TRANSACTION-FILE ASSIGN TO "TRANS.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-TRANS-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(8). 05 CUST-NAME PIC X(30). 05 CUST-BALANCE PIC S9(8)V99. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-ID PIC X(10). 05 TRANS-TYPE PIC X(8). 05 TRANS-AMOUNT PIC S9(6)V99. WORKING-STORAGE SECTION. 01 WS-FILE-STATUS. 05 WS-CUST-STATUS PIC XX. 05 WS-TRANS-STATUS PIC XX. PROCEDURE DIVISION. OPEN-INPUT-FILES. OPEN INPUT CUSTOMER-FILE. IF WS-CUST-STATUS NOT = "00" DISPLAY "ERROR OPENING CUSTOMER FILE: " WS-CUST-STATUS PERFORM ERROR-ROUTINE STOP RUN END-IF. OPEN INPUT TRANSACTION-FILE. IF WS-TRANS-STATUS NOT = "00" DISPLAY "ERROR OPENING TRANSACTION FILE: " WS-TRANS-STATUS CLOSE CUSTOMER-FILE PERFORM ERROR-ROUTINE STOP RUN END-IF. DISPLAY "INPUT FILES OPENED SUCCESSFULLY".
Opening files for read-only access with error checking.
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT REPORT-FILE ASSIGN TO "REPORT.TXT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-REPORT-STATUS. SELECT ERROR-LOG ASSIGN TO "ERROR.LOG" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-ERROR-STATUS. DATA DIVISION. FILE SECTION. FD REPORT-FILE. 01 REPORT-RECORD PIC X(132). FD ERROR-LOG. 01 ERROR-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS. 05 WS-REPORT-STATUS PIC XX. 05 WS-ERROR-STATUS PIC XX. PROCEDURE DIVISION. CREATE-OUTPUT-FILES. OPEN OUTPUT REPORT-FILE. IF WS-REPORT-STATUS NOT = "00" DISPLAY "ERROR CREATING REPORT FILE: " WS-REPORT-STATUS PERFORM ERROR-ROUTINE STOP RUN END-IF. OPEN OUTPUT ERROR-LOG. IF WS-ERROR-STATUS NOT = "00" DISPLAY "ERROR CREATING ERROR LOG: " WS-ERROR-STATUS CLOSE REPORT-FILE PERFORM ERROR-ROUTINE STOP RUN END-IF. DISPLAY "OUTPUT FILES CREATED SUCCESSFULLY".
Creating new files for write-only access.
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MASTER-FILE ASSIGN TO "MASTER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS MASTER-KEY FILE STATUS IS WS-MASTER-STATUS. DATA DIVISION. FILE SECTION. FD MASTER-FILE. 01 MASTER-RECORD. 05 MASTER-KEY PIC X(8). 05 MASTER-DATA PIC X(72). 05 LAST-UPDATE PIC 9(8). WORKING-STORAGE SECTION. 01 WS-MASTER-STATUS PIC XX. 01 WS-SEARCH-KEY PIC X(8). 01 WS-UPDATE-DATA PIC X(72). PROCEDURE DIVISION. OPEN-FOR-UPDATE. OPEN I-O MASTER-FILE. IF WS-MASTER-STATUS NOT = "00" DISPLAY "ERROR OPENING MASTER FILE FOR UPDATE: " WS-MASTER-STATUS PERFORM ERROR-ROUTINE STOP RUN END-IF. DISPLAY "MASTER FILE OPENED FOR READ/WRITE ACCESS". UPDATE-MASTER-RECORD. MOVE "CUST001" TO WS-SEARCH-KEY. MOVE WS-SEARCH-KEY TO MASTER-KEY. READ MASTER-FILE INVALID KEY DISPLAY "RECORD NOT FOUND: " WS-SEARCH-KEY NOT INVALID KEY DISPLAY "UPDATING RECORD: " MASTER-KEY MOVE WS-UPDATE-DATA TO MASTER-DATA ACCEPT LAST-UPDATE FROM DATE YYYYMMDD REWRITE MASTER-RECORD INVALID KEY DISPLAY "ERROR UPDATING RECORD: " WS-MASTER-STATUS NOT INVALID KEY DISPLAY "RECORD UPDATED SUCCESSFULLY" END-REWRITE END-READ.
Opening files for both read and write operations.
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT AUDIT-LOG ASSIGN TO "AUDIT.LOG" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-AUDIT-STATUS. SELECT TRANSACTION-LOG ASSIGN TO "TRANS.LOG" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-TRANS-LOG-STATUS. DATA DIVISION. FILE SECTION. FD AUDIT-LOG. 01 AUDIT-RECORD. 05 AUDIT-TIMESTAMP PIC X(14). 05 AUDIT-USER PIC X(8). 05 AUDIT-ACTION PIC X(20). 05 AUDIT-DETAILS PIC X(50). FD TRANSACTION-LOG. 01 TRANS-LOG-RECORD. 05 LOG-DATE PIC 9(8). 05 LOG-TIME PIC 9(6). 05 LOG-MESSAGE PIC X(100). WORKING-STORAGE SECTION. 01 WS-AUDIT-STATUS PIC XX. 01 WS-TRANS-LOG-STATUS PIC XX. PROCEDURE DIVISION. OPEN-LOG-FILES. OPEN EXTEND AUDIT-LOG. IF WS-AUDIT-STATUS NOT = "00" DISPLAY "ERROR OPENING AUDIT LOG: " WS-AUDIT-STATUS PERFORM ERROR-ROUTINE STOP RUN END-IF. OPEN EXTEND TRANSACTION-LOG. IF WS-TRANS-LOG-STATUS NOT = "00" DISPLAY "ERROR OPENING TRANSACTION LOG: " WS-TRANS-LOG-STATUS CLOSE AUDIT-LOG PERFORM ERROR-ROUTINE STOP RUN END-IF. DISPLAY "LOG FILES OPENED FOR APPEND". WRITE-AUDIT-ENTRY. ACCEPT AUDIT-TIMESTAMP FROM TIMESTAMP. MOVE "SYSTEM" TO AUDIT-USER. MOVE "FILE_OPENED" TO AUDIT-ACTION. MOVE "Application started successfully" TO AUDIT-DETAILS. WRITE AUDIT-RECORD. IF WS-AUDIT-STATUS NOT = "00" DISPLAY "ERROR WRITING AUDIT RECORD: " WS-AUDIT-STATUS ELSE DISPLAY "AUDIT ENTRY WRITTEN" END-IF.
Appending to existing files using EXTEND mode.
PROCEDURE DIVISION. OPEN-ALL-FILES. *> Open multiple files with different modes in one statement OPEN INPUT CUSTOMER-FILE PRODUCT-FILE PRICE-FILE OUTPUT REPORT-FILE SUMMARY-FILE I-O MASTER-FILE INVENTORY-FILE EXTEND AUDIT-LOG ERROR-LOG. *> Check all file statuses PERFORM CHECK-FILE-STATUS. CHECK-FILE-STATUS. IF WS-CUSTOMER-STATUS NOT = "00" DISPLAY "CUSTOMER FILE ERROR: " WS-CUSTOMER-STATUS PERFORM CLOSE-ALL-FILES STOP RUN END-IF. IF WS-PRODUCT-STATUS NOT = "00" DISPLAY "PRODUCT FILE ERROR: " WS-PRODUCT-STATUS PERFORM CLOSE-ALL-FILES STOP RUN END-IF. IF WS-MASTER-STATUS NOT = "00" DISPLAY "MASTER FILE ERROR: " WS-MASTER-STATUS PERFORM CLOSE-ALL-FILES STOP RUN END-IF. DISPLAY "ALL FILES OPENED SUCCESSFULLY". CLOSE-ALL-FILES. CLOSE CUSTOMER-FILE PRODUCT-FILE PRICE-FILE REPORT-FILE SUMMARY-FILE MASTER-FILE INVENTORY-FILE AUDIT-LOG ERROR-LOG.
Opening multiple files with different access modes.
WORKING-STORAGE SECTION. 01 WS-FILE-ERROR-HANDLING. 05 WS-ERROR-COUNT PIC 9(3) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. SAFE-FILE-OPEN. MOVE 0 TO WS-RETRY-COUNT. PERFORM UNTIL WS-RETRY-COUNT >= WS-MAX-RETRIES ADD 1 TO WS-RETRY-COUNT OPEN INPUT DATA-FILE EVALUATE WS-FILE-STATUS WHEN "00" DISPLAY "FILE OPENED SUCCESSFULLY" EXIT PERFORM WHEN "30" DISPLAY "ATTEMPT " WS-RETRY-COUNT ": FILE NOT FOUND" IF WS-RETRY-COUNT < WS-MAX-RETRIES DISPLAY "RETRYING IN 2 SECONDS..." CALL "CBL_SLEEP" USING 2 END-IF WHEN "35" DISPLAY "ATTEMPT " WS-RETRY-COUNT ": FILE NOT OPENED" DISPLAY "FILE MAY BE IN USE BY ANOTHER PROCESS" IF WS-RETRY-COUNT < WS-MAX-RETRIES CALL "CBL_SLEEP" USING 1 END-IF WHEN "37" DISPLAY "ATTEMPT " WS-RETRY-COUNT ": INCOMPATIBLE MODE" DISPLAY "FILE CANNOT BE OPENED WITH CURRENT ACCESS MODE" EXIT PERFORM WHEN "39" DISPLAY "ATTEMPT " WS-RETRY-COUNT ": RECORD INCONSISTENT" DISPLAY "FILE STRUCTURE MISMATCH" EXIT PERFORM WHEN OTHER DISPLAY "ATTEMPT " WS-RETRY-COUNT ": UNKNOWN ERROR: " WS-FILE-STATUS IF WS-RETRY-COUNT < WS-MAX-RETRIES CALL "CBL_SLEEP" USING 1 END-IF END-EVALUATE END-PERFORM. IF WS-FILE-STATUS NOT = "00" DISPLAY "FAILED TO OPEN FILE AFTER " WS-MAX-RETRIES " ATTEMPTS" DISPLAY "FINAL STATUS: " WS-FILE-STATUS PERFORM FATAL-ERROR-ROUTINE END-IF.
Robust error handling with retry logic.
INTERPRET-FILE-STATUS. EVALUATE WS-FILE-STATUS WHEN "00" DISPLAY "SUCCESS: OPERATION COMPLETED SUCCESSFULLY" WHEN "02" DISPLAY "SUCCESS: DUPLICATE KEY (INDEXED FILE)" WHEN "04" DISPLAY "SUCCESS: RECORD LENGTH CHANGED" WHEN "05" DISPLAY "SUCCESS: REFERENCED OPTIONAL FILE NOT PRESENT" WHEN "07" DISPLAY "SUCCESS: NO UNIT/REEL FOR NON-OPTIONAL FILE" WHEN "10" DISPLAY "END-OF-FILE: NO MORE RECORDS" WHEN "14" DISPLAY "OUT OF KEY RANGE: RELATIVE RECORD NUMBER TOO LARGE" WHEN "21" DISPLAY "ERROR: SEQUENCE ERROR" WHEN "22" DISPLAY "ERROR: DUPLICATE KEY" WHEN "23" DISPLAY "ERROR: RECORD NOT FOUND" WHEN "24" DISPLAY "ERROR: BOUNDARY VIOLATION" WHEN "30" DISPLAY "ERROR: PERMANENT I/O ERROR" WHEN "34" DISPLAY "ERROR: BOUNDARY VIOLATION" WHEN "35" DISPLAY "ERROR: FILE NOT FOUND" WHEN "37" DISPLAY "ERROR: OPEN MODE NOT ALLOWED" WHEN "38" DISPLAY "ERROR: FILE PREVIOUSLY CLOSED WITH LOCK" WHEN "39" DISPLAY "ERROR: RECORD ATTRIBUTE CONFLICT" WHEN "41" DISPLAY "ERROR: FILE ALREADY OPEN" WHEN "42" DISPLAY "ERROR: FILE NOT OPEN" WHEN "43" DISPLAY "ERROR: NO CURRENT RECORD (DELETE/REWRITE)" WHEN "44" DISPLAY "ERROR: RECORD OVERFLOW" WHEN "46" DISPLAY "ERROR: NO CURRENT RECORD POINTER" WHEN "47" DISPLAY "ERROR: FILE NOT AVAILABLE" WHEN "48" DISPLAY "ERROR: FILE NAME NOT GIVEN" WHEN "49" DISPLAY "ERROR: FILE ATTRIBUTE CONFLICT" WHEN OTHER DISPLAY "UNKNOWN FILE STATUS: " WS-FILE-STATUS END-EVALUATE.
Comprehensive file status code interpretation.
PROCEDURE DIVISION. PROCESS-SEQUENTIAL-FILE. PERFORM OPEN-FILES. PERFORM PROCESS-RECORDS UNTIL END-OF-FILE. PERFORM CLOSE-FILES. OPEN-FILES. OPEN INPUT SOURCE-FILE. IF WS-SOURCE-STATUS NOT = "00" DISPLAY "ERROR OPENING SOURCE FILE" STOP RUN END-IF. OPEN OUTPUT TARGET-FILE. IF WS-TARGET-STATUS NOT = "00" DISPLAY "ERROR OPENING TARGET FILE" CLOSE SOURCE-FILE STOP RUN END-IF. PROCESS-RECORDS. READ SOURCE-FILE AT END SET END-OF-FILE TO TRUE NOT AT END PERFORM VALIDATE-RECORD IF RECORD-VALID PERFORM TRANSFORM-RECORD WRITE TARGET-RECORD ADD 1 TO WS-RECORDS-PROCESSED ELSE ADD 1 TO WS-RECORDS-REJECTED END-IF END-READ. CLOSE-FILES. CLOSE SOURCE-FILE. CLOSE TARGET-FILE. DISPLAY "PROCESSING COMPLETE:" DISPLAY " RECORDS PROCESSED: " WS-RECORDS-PROCESSED DISPLAY " RECORDS REJECTED: " WS-RECORDS-REJECTED.
Standard sequential file processing pattern.
PROCEDURE DIVISION. MASTER-FILE-UPDATE. PERFORM OPEN-UPDATE-FILES. PERFORM PROCESS-TRANSACTIONS. PERFORM CLOSE-UPDATE-FILES. PERFORM DISPLAY-STATISTICS. OPEN-UPDATE-FILES. OPEN INPUT TRANSACTION-FILE. IF WS-TRANS-STATUS NOT = "00" DISPLAY "ERROR OPENING TRANSACTION FILE" STOP RUN END-IF. OPEN I-O MASTER-FILE. IF WS-MASTER-STATUS NOT = "00" DISPLAY "ERROR OPENING MASTER FILE FOR UPDATE" CLOSE TRANSACTION-FILE STOP RUN END-IF. OPEN EXTEND UPDATE-LOG. IF WS-LOG-STATUS NOT = "00" DISPLAY "WARNING: CANNOT OPEN UPDATE LOG" DISPLAY "CONTINUING WITHOUT LOGGING" END-IF. PROCESS-TRANSACTIONS. PERFORM READ-TRANSACTION. PERFORM UNTIL END-OF-TRANSACTIONS EVALUATE TRANS-TYPE WHEN "ADD" PERFORM ADD-NEW-RECORD WHEN "UPD" PERFORM UPDATE-EXISTING-RECORD WHEN "DEL" PERFORM DELETE-RECORD WHEN OTHER PERFORM LOG-INVALID-TRANSACTION ADD 1 TO WS-INVALID-TRANSACTIONS END-EVALUATE PERFORM READ-TRANSACTION END-PERFORM. UPDATE-EXISTING-RECORD. MOVE TRANS-KEY TO MASTER-KEY. READ MASTER-FILE INVALID KEY DISPLAY "RECORD NOT FOUND FOR UPDATE: " TRANS-KEY ADD 1 TO WS-NOT-FOUND-COUNT NOT INVALID KEY PERFORM APPLY-TRANSACTION-DATA REWRITE MASTER-RECORD INVALID KEY DISPLAY "ERROR UPDATING RECORD: " TRANS-KEY ADD 1 TO WS-ERROR-COUNT NOT INVALID KEY ADD 1 TO WS-UPDATED-COUNT PERFORM LOG-SUCCESSFUL-UPDATE END-REWRITE END-READ.
Master file update with transaction processing.
Status | Category | Description |
---|---|---|
00 | Success | Operation completed successfully |
30 | Error | Permanent I/O error (file not found) |
35 | Error | File not opened successfully |
37 | Error | Open mode not allowed |
41 | Error | File already open |
Closes files and releases resources
File definitions in Environment Division
Error checking and status monitoring
File I/O operations after opening