Coding a program in PL/I

The following sample PL/I program shows how the different parts of a command-level program fit together, and how the EXEC DLI commands are coded in a CICS® online program.

Except for a few commands, this program applies to batch, BMP, and CICS programs. Any differences are highlighted in the notes for the sample PL/I code. The numbering on the right of the sample code references those notes.

*PROCESS INCLUDE,GN,XOPTS(CICS,DLI);                                           1 
 SAMPLE: PROCEDURE OPTIONS(MAIN);
 DCL      SEGKEYA                  CHAR (4);
 DCL      SEGKEYB                  CHAR (4);                                   2 
 DCL      SEGKEYC                  CHAR (4);
 DCL      SEGKEY1                  CHAR (4);
 DCL      SEGKEY2                  CHAR (4);
 DCL      SEGKEY3                  CHAR (4);
 DCL      SEGKEY4                  CHAR (4);
 DCL      CONKEYB                  CHAR (8);
 DCL      SEGNAME                  CHAR (8);
 DCL      PCBNUM                   FIXED BIN (15);
 DCL      AREAA                    CHAR (80);
     /*   DEFINE SEGMENT I/O AREA                                     */
 DCL      AREAB                    CHAR (80);
 DCL      AREAC                    CHAR (80);                                  3 
 DCL      AREAG                    CHAR (250);
 DCL      AREASTAT                 CHAR (360);
     %INCLUDE MAPSET
     /*                                                               */
     /*                                                               */
     /* ************************************************************  */
     /*  INITIALIZATION                                               */
     /*  HANDLE ERROR CONDITIONS IN ERROR ROUTINE                     */
     /*  HANDLE ABENDS (DLI ERROR STATUS CODES) IN ABEND PROGRAM      */
     /*  RECEIVE INPUT MESSAGE                                        */
     /* ************************************************************  */
     /*                                                               */
     EXEC CICS HANDLE CONDITION ERROR(ERRORS);                                 4 
     /*                                                               */
     EXEC CICS HANDLE ABEND PROGRAM('ABENDS');                                 4 
     /*                                                               */
     EXEC CICS RECEIVE MAP ('SAMPMAP') MAPSET('MAPSET');                       4 
     /* ANALYZE INPUT MESSAGE AND PERFORM NON-DLI PROCESSING          */
     /*                                                               */
     /* ************************************************************  */
     /*  SCHEDULE PSB NAMED 'SAMPLE1'                                 */
     /* ************************************************************  */
     /*                                                               */
     EXEC DLI SCHD PSB(SAMPLE1);
     CALL TEST_DIB;                                                            5 
 
     /* ************************************************************* */
     /*  RETRIEVE ROOT SEGMENT AND ALL ITS DEPENDENTS                 */
     /* ************************************************************* */
     /*                                                               */
     SEGKEYA = 'A300';
     EXEC DLI GU USING PCB(1) SEGMENT(SEGA) INTO(AREAA)
     WHERE(KEYA=SEGKEYA);                                                      6 
     CALL TEST_DIB;
GNPLOOP:
     EXEC DLI GNP USING PCB(1) INTO(AREAG);                                    7 
     IF DIBSTAT = 'GE' THEN GO TO LOOPDONE;
     CALL TEST_DIB;
     GO TO GNPLOOP;
 LOOPDONE:
     /*                                                               */
     /* ************************************************************  */
     /*  INSERT NEW ROOT SEGMENT                                      */
     /* ************************************************************  */
     /*                                                               */
     AREAA = 'DATA FOR NEW SEGMENT INCLUDING KEY';
     EXEC DLI ISRT USING PCB(1) SEGMENT(SEGA) FROM(AREAA);
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************* */
     /*  RETRIEVE 3 SEGMENTS IN PATH AND REPLACE THEM                 */
     /* ************************************************************* */
     /*                                                               */
     SEGKEYA = 'A200';
     SEGKEYB = 'B240';
     SEGKEYC = 'C241';
     EXEC DLI GU USING PCB(1)
       SEGMENT(SEGA) WHERE(KEYA=SEGKEYA)                                       8 
          INTO(AREAA)
       SEGMENT(SEGB) WHERE(KEYB=SEGKEYB)
          INTO(AREAB)
       SEGMENT(SEGC) WHERE(KEYC=SEGKEYC)
          INTO(AREAC);
     CALL TEST_DIB;
     /* UPDATE FIELDS IN THE 3 SEGMENTS                               */
     EXEC DLI REPL USING PCB(1)
       SEGMENT(SEGA) FROM(AREAA)
       SEGMENT(SEGB) FROM(AREAB)
       SEGMENT(SEGC) FROM(AREAC);
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************* */
     /*  INSERT NEW SEGMENT USING CONCATENATED KEY TO QUALIFY PARENT  */
     /* ************************************************************* */
     /*                                                               */
     AREAC = 'DATA FOR NEW SEGMENT INCLUDING KEY';
     CONKEYB = 'A200B240';
     EXEC DLI ISRT USING PCB(1)
       SEGMENT(SEGB) KEYS(CONKEYB)
       SEGMENT(SEGC) FROM(AREAC);
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************  */
     /*  RETRIEVE SEGMENT DIRECTLY USING CONCATENATED KEY             */
     /*  AND THEN DELETE IT AND ITS DEPENDENTS                        */
     /* ************************************************************  */
     /*                                                               */
     CONKEYB = 'A200B230';
     EXEC DLI GU USING PCB(1)
       SEGMENT(SEGB)
          KEYS(CONKEYB)
          INTO(AREAB);
     CALL TEST_DIB;
     EXEC DLI DLET USING PCB(1)
       SEGMENT(SEGB) FROM(AREAB);
     CALL TEST_DIB;
     /*                                                               */
 /* ************************************************************* */
     /*  RETRIEVE SEGMENT BY QUALIFYING PARENT WITH CONCATENATED KEY, */
     /*  OBJECT SEGMENT WITH WHERE OPTION                             */
     /*  AND THEN SET PARENTAGE                                       */
     /*                                                               */
     /*  USE VARIABLES FOR PCB INDEX, SEGMENT NAME                    */
     /* ************************************************************* */
     /*                                                               */
     CONKEYB = 'A200B230';
     SEGNAME = 'SEGA';
     SEGKEYC = 'C520';
     PCBNUM = 1;
     EXEC DLI GU USING PCB(PCBNUM)
       SEGMENT((SEGNAME))
          KEYS(CONKEYB) SETPARENT
       SEGMENT(SEGC) INTO(AREAC)
          WHERE(KEYC=SEGKEYC);
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************* */
     /*  RETRIEVE DATABASE STATISTICS                                 */
     /* ************************************************************* */
     /*                                                               */
     EXEC DLI STAT USING PCB(1) INTO(AREASTAT) VSAM FORMATTED;
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************  */
     /*  RETRIEVE ROOT SEGMENT USING BOOLEAN OPERATORS                */
     /* ************************************************************  */
     /*                                                               */
     SEGKEY1 = 'A050';
     SEGKEY2 = 'A150';
     SEGKEY3 = 'A275';
     SEGKEY4 = 'A350';
     EXEC DLI GU USING PCB(1) SEGMENT(SEGA) INTO(AREAA)
          WHERE(KEYA &Ar; SEGKEY1 AND KEYA &Al; SEGKEY2 OR
                KEYA &Ar; SEGKEY3 AND KEYA &Al; SEGKEY4);
     CALL TEST_DIB;
     /*                                                               */
     /* ************************************************************* */
     /*  TERMINATE PSB WHEN DLI PROCESSING IS COMPLETED               */
     /* ************************************************************* */
     /*                                                               */
 
     EXEC DLI TERM;
                                                                               9 
 
     /*                                                               */
     /* ************************************************************* */
     /*  SEND OUTPUT MESSAGE                                          */
     /* ************************************************************* */
     /*                                                               */
     EXEC CICS SEND MAP('SAMPMAP') MAPSET('MAPSET');                           4 
     EXEC CICS WAIT TERMINAL;
     /*                                                               */
     /* ************************************************************* */
     /*  COMPLETE TRANSACTION AND RETURN TO CICS                      */
     /* ************************************************************* */
     /*                                                               */
     EXEC CICS RETURN;                                                         4 
     /*                                                               */
     /* ************************************************************  */
     /*  CHECK STATUS IN DIB                                          */
     /* ************************************************************  */
     /*                                                               */
 TEST_DIB: PROCEDURE;
     IF DIBSTAT = '  ' RETURN;                                                10 
 
     /* HANDLE DLI STATUS CODES REPRESENTING EXCEPTIONAL CONDITIONS   */
     /*                                                               */
 OK:
 END TEST_DB;
 ERRORS:
     /* HANDLE ERROR CONDITIONS                                       */
     /*                                                               */
 END SAMPLE;

Notes to the sample PL/I code:

  •  1 For a CICS online program containing EXEC DLI commands, you must specify the DLI and CICS options. For a batch or BMP program containing EXEC DLI, you must specify only the DLI option.
  •  2 Define, in automatic storage, each of the areas; I/O areas, key feedback areas, and segment name areas.
  •  3 Define an I/O area for each segment you retrieve, add, or replace in a single command.
  •  4 Do not code EXEC CICS commands in a batch or BMP program.
  •  5 For CICS online programs, you use a SCHD PSB command to obtain a PSB. You do not schedule a PSB in a batch or BMP program.
  •  6 This GU command retrieves the first occurrence of SEGA with a key of A300. Notice that you do not need to include the KEYLENGTH and SEGLENGTH options.
  •  7 This GNP command retrieves all dependents under segment SEGA. TheGE status code indicates that no more dependents exist.
  •  8 This GU command is an example of a path command. You must use a separate I/O area for each segment you retrieve.
  •  9 For a CICS online program, the TERM command terminates the PSB scheduled earlier. You do not terminate the PSB in a batch or BMP program.
  •  10 After issuing each command, you should check the status code in the DIB.