IMS DB Get Hold Next (GHN)

The 'GHN' (Get Hold Next) call is a DL/I function used to retrieve the next segment in the database sequence (just like GN) and place a hold (lock) on it for future update (REPL) or delete (DLET). This hold ensures that the segment remains locked, preventing other processes from modifying it until the hold is released. In a COBOL program, the 'GHN' call is made using the following syntax:

CALL 'CBLTDLI' USING
    DLI-GHN
    DB-PCB
    IO-AREA
    [SSA1]
    [SSA2]
    ...
  • DLI-GHN: A 4-character field with the value 'GHU ', indicating the 'Get Hold Unique' function.
  • DB-PCB: The Program Communication Block for the database, defined in the LINKAGE SECTION. It specifies the database to be accessed and contains status codes and other information after the call.
  • IO-AREA: The area in the WORKING-STORAGE SECTION where the retrieved segment data will be placed.
  • SSA1, SSA2, ...: Optional. Defines the segment type and optional qualification criteria for the retrieval.

Return Codes

After executing a 'GHN' call, IMS sets a status code in the DB-PCB to indicate the outcome:

  • Blank (' '): Call was successful; segment retrieved and held.
  • GE: Segment not found that satisfies the SSA; no segment retrieved.
  • GB: End of database reached; no more segments to retrieve.

Example

Scenario - Below is a simplified example of a COBOL program that uses the 'GHN' call to retrieve and update 'EMPLOYEE' segments from an IMS database:

Hierarchical Structure -

COMPANY       ← root segment  
 └─ PROJECT    ← child of COMPANY  
      └─ EMPLOYEE   ← child of PROJECT 

Program -

IDENTIFICATION DIVISION.
PROGRAM-ID. GHNEXAMP.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.

* DL/I FUNCTION CODES
01 DL-I-CODES.
   05 DLI-GHN     PIC X(4) VALUE 'GHN '.
   05 DLI-REPL    PIC X(4) VALUE 'REPL'.

* I/O AREA FOR SEGMENT DATA
01 IO-AREA.
   05 COMPANY-ID          PIC X(5).
   05 COMPANY-NAME        PIC X(30).
   05 PROJECT-ID          PIC X(5).
   05 PROJECT-NAME        PIC X(30).
   05 EMPLOYEE-ID         PIC X(5).
   05 EMPLOYEE-NAME       PIC X(25).

* WORK FIELD TO UPDATE NAME
01 UPDATED-NAME           PIC X(25).

LINKAGE SECTION.
* PCB MASK
01 EMP-PCB.
   05 DBD-NAME            PIC X(8).
   05 SEG-LEVEL           PIC XX.
   05 STATUS-CODE         PIC XX.
   05 PROC-OPTIONS        PIC X(4).
   05 FILLER              PIC X(4).
   05 SEGMENT-NAME-FB     PIC X(8).
   05 LENGTH-KEY-FB       PIC S9(5) COMP.
   05 NUM-SENSITIVES      PIC S9(5) COMP.
   05 KEY-FEEDBACK        PIC X(50).

PROCEDURE DIVISION.

    DISPLAY "=== BEGIN: GHN EMPLOYEE UPDATE ===".

    PERFORM UNTIL STATUS-CODE NOT = '  '
        * Step 1: Use GHN to get and lock next EMPLOYEE
        CALL 'CBLTDLI' USING DLI-GHN,
                             EMP-PCB,
                             IO-AREA

        IF STATUS-CODE = '  '
            DISPLAY "FOUND EMPLOYEE: " EMPLOYEE-ID " - " EMPLOYEE-NAME

            * Step 2: Simulate name update (e.g., add '*')
            STRING EMPLOYEE-NAME DELIMITED BY SPACE
                   ' *' DELIMITED BY SIZE
                   INTO UPDATED-NAME

            MOVE UPDATED-NAME TO EMPLOYEE-NAME

            * Step 3: Update the segment using REPL
            CALL 'CBLTDLI' USING DLI-REPL,
                                 EMP-PCB,
                                 IO-AREA

            IF STATUS-CODE = '  '
                DISPLAY "-- NAME UPDATED TO: " EMPLOYEE-NAME
            ELSE
                DISPLAY "** REPL FAILED. STATUS = " STATUS-CODE
            END-IF
        ELSE IF STATUS-CODE = 'GB'
            DISPLAY "** END OF DATABASE **"
        ELSE
            DISPLAY "** ERROR: STATUS = " STATUS-CODE
        END-IF
    END-PERFORM.

    DISPLAY "=== PROGRAM COMPLETE ===".
    GOBACK.

Sample Output

=== BEGIN: GHN EMPLOYEE UPDATE ===
FOUND EMPLOYEE: E001 - JOHN DOE
-- NAME UPDATED TO: JOHN DOE *
FOUND EMPLOYEE: E002 - JANE SMITH
-- NAME UPDATED TO: JANE SMITH *
FOUND EMPLOYEE: E003 - ROBIN KING
-- NAME UPDATED TO: ROBIN KING *
** END OF DATABASE **
=== PROGRAM COMPLETE ===