📄 VSAM
VSAM File Processing in COBOL
Intermediate 🕑 25 min read
👁 2 views
COBOL-VSAM Interface
COBOL programs access VSAM files using standard file handling statements with specific SELECT clause parameters.
SELECT Clause for VSAM
Key parameters:
- ORGANIZATION - INDEXED, SEQUENTIAL, RELATIVE
- ACCESS MODE - SEQUENTIAL, RANDOM, DYNAMIC
- RECORD KEY - Primary key field
- ALTERNATE RECORD KEY - Secondary keys
- FILE STATUS - Status code field
VSAM File Status Codes
| Code | Meaning |
|---|---|
| 00 | Successful operation |
| 02 | Duplicate alternate key |
| 10 | End of file |
| 21 | Sequence error |
| 22 | Duplicate primary key |
| 23 | Record not found |
| 24 | Boundary violation |
| 35 | File not found |
| 39 | File attribute mismatch |
VSAM Operations
- READ - Sequential or random
- WRITE - Add new record
- REWRITE - Update existing record
- DELETE - Remove record
- START - Position for browse
Code Example
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
* KSDS FILE DEFINITION
SELECT EMPLOYEE-FILE
ASSIGN TO EMPFILE
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EMP-ID
ALTERNATE RECORD KEY IS EMP-NAME
WITH DUPLICATES
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD EMPLOYEE-FILE.
01 EMPLOYEE-REC.
05 EMP-ID PIC 9(6).
05 EMP-NAME PIC X(30).
05 EMP-DEPT PIC X(10).
05 EMP-SALARY PIC 9(7)V99.
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC XX.
01 WS-EOF PIC X VALUE 'N'.
PROCEDURE DIVISION.
* RANDOM READ BY KEY
READ-BY-KEY.
MOVE "123456" TO EMP-ID.
READ EMPLOYEE-FILE
INVALID KEY
DISPLAY "RECORD NOT FOUND"
NOT INVALID KEY
DISPLAY "FOUND: " EMP-NAME
END-READ.
* SEQUENTIAL READ
READ-SEQUENTIAL.
READ EMPLOYEE-FILE NEXT
AT END MOVE "Y" TO WS-EOF
NOT AT END DISPLAY EMP-NAME
END-READ.
* WRITE NEW RECORD
ADD-RECORD.
MOVE "999999" TO EMP-ID.
MOVE "NEW EMPLOYEE" TO EMP-NAME.
WRITE EMPLOYEE-REC
INVALID KEY
DISPLAY "DUPLICATE KEY"
END-WRITE.
* UPDATE RECORD
UPDATE-RECORD.
MOVE "123456" TO EMP-ID.
READ EMPLOYEE-FILE.
IF WS-FILE-STATUS = "00"
MOVE 75000.00 TO EMP-SALARY
REWRITE EMPLOYEE-REC
END-IF.
* DELETE RECORD
DELETE-RECORD.
MOVE "123456" TO EMP-ID.
DELETE EMPLOYEE-FILE
INVALID KEY DISPLAY "NOT FOUND"
END-DELETE.
* BROWSE USING START
BROWSE-RECORDS.
MOVE "100000" TO EMP-ID.
START EMPLOYEE-FILE
KEY >= EMP-ID
INVALID KEY DISPLAY "NO RECORDS"
END-START.
PERFORM UNTIL WS-EOF = "Y"
READ EMPLOYEE-FILE NEXT
AT END MOVE "Y" TO WS-EOF
END-READ
IF WS-FILE-STATUS = "00"
DISPLAY EMP-ID " " EMP-NAME
END-IF
END-PERFORM.