IMS DB Get Unique (GU)

The 'GU' (Get Unique) call is used to retrieve a specific segment from the IMS database based on the criteria provided. It is commonly used to establish a position in the database for subsequent sequential processing or to directly access a particular segment. The 'GU' call can be unqualified (retrieving the first occurrence of a segment type) or qualified (retrieving a segment that matches specific criteria). The syntax of a GU call is as follows −

CALL 'CBLTDLI' USING
    DLI-GU
    DB-PCB
    IO-AREA
    [SSA1]
    [SSA2]
    ...
  • DLI-GU: A 4-character field with the value 'GU ', indicating the 'Get 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 'GU' call, IMS sets a status code in the DB-PCB to indicate the outcome:

  • Blank (' '): Call was successful; segment retrieved.
  • GE: Segment not found that satisfies the SSA; no segment retrieved.

Example

Scenario - This program will retrieve a specific employee record based on a unique key by navigating through the Company → Project → Employee hierarchy.

Hierarchical Structure -

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

Program -

IDENTIFICATION DIVISION.
PROGRAM-ID. GET-UNIQUE-EMPLOYEE.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.

* DL/I FUNCTION CODE
01 DL-I-FUNCTIONS.
   05 DLI-GU        PIC X(4) VALUE 'GU  '.

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

* SSA STRINGS (SEGMENT SEARCH ARGUMENTS)
01 SSA-STRINGS.
   05 SSA-COMPANY            PIC X(30) VALUE SPACES.
   05 SSA-PROJECT            PIC X(30) VALUE SPACES.
   05 SSA-EMPLOYEE           PIC X(30) VALUE SPACES.

LINKAGE SECTION.
* PCB MASK PROVIDED BY IMS
01 EMPLOYEE-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-SENS-SEGS          PIC S9(5) COMP.
   05 KEY-FEEDBACK-AREA      PIC X(50).


PROCEDURE DIVISION.

    DISPLAY "=== START IMS DB GU CALL ===".

    * Prepare Qualified SSA strings
    MOVE 'COMPANY(COMPANY-ID =C001)' TO SSA-COMPANY.
    MOVE 'PROJECT(PROJECT-ID =P001)' TO SSA-PROJECT.
    MOVE 'EMPLOYEE(EMPLOYEE-ID=E001)' TO SSA-EMPLOYEE.

    * Issue GU (Get Unique) DL/I call
    CALL 'CBLTDLI' USING DLI-GU,
                         EMPLOYEE-PCB,
                         IO-AREA,
                         SSA-COMPANY,
                         SSA-PROJECT,
                         SSA-EMPLOYEE.

    * Check STATUS-CODE returned in PCB mask
    IF STATUS-CODE = '  '
        DISPLAY "=== EMPLOYEE RECORD FOUND ==="
        DISPLAY "COMPANY ID    : " COMPANY-ID
        DISPLAY "COMPANY NAME  : " COMPANY-NAME
        DISPLAY "PROJECT ID    : " PROJECT-ID
        DISPLAY "PROJECT NAME  : " PROJECT-NAME
        DISPLAY "EMPLOYEE ID   : " EMPLOYEE-ID
        DISPLAY "EMPLOYEE NAME : " EMPLOYEE-NAME
    ELSE
        DISPLAY "!!! FAILED TO RETRIEVE RECORD"
        DISPLAY "STATUS CODE: " STATUS-CODE
    END-IF.

    DISPLAY "=== END OF PROGRAM ===".
    GOBACK.

Sample Output

=== START IMS DB GU CALL ===
=== EMPLOYEE RECORD FOUND ===
COMPANY ID    : C001
COMPANY NAME  : TECHCORP
PROJECT ID    : P001
PROJECT NAME  : AI SYSTEMS
EMPLOYEE ID   : E001
EMPLOYEE NAME : JOHN DOE
=== END OF PROGRAM ===