Master Mainframe Technologies - COBOL, JCL, DB2, VSAM, CICS & More
ABEND Codes SQLCODEs File Status Interview Prep Contact
💻 COBOL

COBOL SEARCH Statement

Intermediate 🕑 10 min read 👁 0 views

COBOL SEARCH Statement

The SEARCH statement performs a table lookup to find a specific element.

Syntax

SEARCH identifier [VARYING identifier]
    [AT END imperative-statement]
    WHEN condition imperative-statement
    [WHEN condition imperative-statement] ...
[END-SEARCH]

SEARCH ALL identifier
    [AT END imperative-statement]
    WHEN condition imperative-statement
[END-SEARCH]

Example Program

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SEARCH-DEMO.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-PRODUCT-TABLE.
          05 WS-PRODUCT OCCURS 5 TIMES INDEXED BY WS-IDX.
             10 WS-PROD-CODE   PIC X(3).
             10 WS-PROD-NAME   PIC X(15).
             10 WS-PROD-PRICE  PIC 9(5)V99.

       01 WS-SEARCH-CODE   PIC X(3).
       01 WS-FOUND         PIC 9 VALUE 0.
          88 FOUND         VALUE 1.
          88 NOT-FOUND     VALUE 0.

       PROCEDURE DIVISION.
      * Initialize table
           MOVE 'A01' TO WS-PROD-CODE(1)
           MOVE 'Widget' TO WS-PROD-NAME(1)
           MOVE 19.99 TO WS-PROD-PRICE(1)

           MOVE 'B02' TO WS-PROD-CODE(2)
           MOVE 'Gadget' TO WS-PROD-NAME(2)
           MOVE 29.99 TO WS-PROD-PRICE(2)

           MOVE 'C03' TO WS-PROD-CODE(3)
           MOVE 'Gizmo' TO WS-PROD-NAME(3)
           MOVE 39.99 TO WS-PROD-PRICE(3)

           MOVE 'D04' TO WS-PROD-CODE(4)
           MOVE 'Doohickey' TO WS-PROD-NAME(4)
           MOVE 49.99 TO WS-PROD-PRICE(4)

           MOVE 'E05' TO WS-PROD-CODE(5)
           MOVE 'Thingamajig' TO WS-PROD-NAME(5)
           MOVE 59.99 TO WS-PROD-PRICE(5)

      * Sequential search
           MOVE 'C03' TO WS-SEARCH-CODE
           SET WS-IDX TO 1
           SET NOT-FOUND TO TRUE

           SEARCH WS-PRODUCT
               AT END
                   DISPLAY 'Product not found'
               WHEN WS-PROD-CODE(WS-IDX) = WS-SEARCH-CODE
                   SET FOUND TO TRUE
                   DISPLAY 'Found: ' WS-PROD-NAME(WS-IDX)
                   DISPLAY 'Price: ' WS-PROD-PRICE(WS-IDX)
           END-SEARCH

           STOP RUN.

Expected Output

Found: Gizmo
Price: 00039.99

Key Points

  • SEARCH requires INDEXED BY clause
  • Must SET index before SEARCH
  • SEARCH ALL for binary search (sorted)
  • AT END handles not-found condition
  • VARYING allows secondary index