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