Master Mainframe Technologies - COBOL, JCL, DB2, VSAM, CICS & More
ABEND Codes SQLCODEs File Status Interview Prep Contact
📄 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

CodeMeaning
00Successful operation
02Duplicate alternate key
10End of file
21Sequence error
22Duplicate primary key
23Record not found
24Boundary violation
35File not found
39File 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.