IMS DB Get Hold Next in Parent (GHNP)

GHNP (Get Hold Next in Parent) is similar to GNP, which gets the next dependent (child) segment under a current parent. But GHNP holds (locks) the retrieved segment so you can safely update (REPL) or delete (DLET) it. In a COBOL program, the 'GHNP' call is made using the following syntax:

CALL 'CBLTDLI' USING
    DLI-GHNP
    DB-PCB
    IO-AREA
    [SSA1]
    [SSA2]
    ...
  • DLI-GHNP: A 4-character field with the value 'GHNP', indicating the 'Get Hold Next within Parent' 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 'GHNP' 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.
  • GP: Parentage not established; no segment retrieved.

Example

Scenario - Below is a simplified example of a COBOL program that uses the 'GHNP' call to retrieve and update 'PROJECT' segments under a specific 'COMPANY' segment from an IMS database:

Hierarchical Structure -

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

Program -

IDENTIFICATION DIVISION.
PROGRAM-ID. GHNPEXMP.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.

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

* I/O AREA
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).

* SSA STRINGS
01 SSA-STRINGS.
   05 SSA-COMPANY         PIC X(30) VALUE 'COMPANY(COMPANY-ID =C001)'.
   05 SSA-PROJECT         PIC X(30) VALUE 'PROJECT(PROJECT-ID =P101)'.

* WORK AREA FOR NAME UPDATE
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 "=== START: GHNP UPDATE EMPLOYEES ===".

    * Step 1: Get the specific project using GU
    CALL 'CBLTDLI' USING DLI-GU,
                         EMP-PCB,
                         IO-AREA,
                         SSA-COMPANY,
                         SSA-PROJECT

    IF STATUS-CODE = '  '
        DISPLAY "PROJECT FOUND: " PROJECT-ID " - " PROJECT-NAME
        DISPLAY "READING EMPLOYEES UNDER PROJECT..."

        * Step 2: Use GHNP to get & hold each EMPLOYEE under this project
        PERFORM UNTIL STATUS-CODE NOT = '  '
            CALL 'CBLTDLI' USING DLI-GHNP,
                                 EMP-PCB,
                                 IO-AREA

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

                * Simulate update
                STRING EMPLOYEE-NAME DELIMITED BY SPACE
                       ' +UPDATED' DELIMITED BY SIZE
                       INTO UPDATED-NAME

                MOVE UPDATED-NAME TO EMPLOYEE-NAME

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

                IF STATUS-CODE = '  '
                    DISPLAY "-- UPDATED TO: " EMPLOYEE-NAME
                ELSE
                    DISPLAY "** REPL FAILED. STATUS = " STATUS-CODE
                END-IF
            ELSE IF STATUS-CODE = 'GE'
                DISPLAY "** NO MORE EMPLOYEES UNDER PROJECT **"
            ELSE
                DISPLAY "** ERROR: STATUS = " STATUS-CODE
            END-IF
        END-PERFORM
    ELSE
        DISPLAY "** PROJECT NOT FOUND OR ERROR. STATUS = " STATUS-CODE
    END-IF.

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

Sample Output

=== START: GHNP UPDATE EMPLOYEES ===
PROJECT FOUND: P101 - CLOUD PROJECT
READING EMPLOYEES UNDER PROJECT...
EMPLOYEE FOUND: E001 - JOHN DOE
-- UPDATED TO: JOHN DOE +UPDATED
EMPLOYEE FOUND: E002 - SARA LEE
-- UPDATED TO: SARA LEE +UPDATED
** NO MORE EMPLOYEES UNDER PROJECT **
=== PROGRAM COMPLETE ===