DRDA example: COBOL program

This example program is written in the COBOL programming language.

Note: By using the code examples, you agree to the terms of the Code license and disclaimer information.
Figure 1. COBOL program example
100        IDENTIFICATION DIVISION.
200       *------------------------
300        PROGRAM-ID. DDBPT6CB.                                                                00/00/00
400       ****************************************************************                      00/00/00
500       *   MODULE NAME = DDBPT6CB                                                            00/00/00
600       *
700       *   DESCRIPTIVE NAME = D-DB SAMPLE APPLICATION
800       *                      REORDER POINT PROCESSING
900       *                      i5/OS                                                          00/00/00
1000      *                      COBOL
1100      *
1200      *   FUNCTION =  THIS MODULE PROCESSES THE PART_STOCK TABLE AND
1300      *               FOR EACH PART BELOW THE ROP (REORDER POINT)
1400      *               CHECKS THE EXISTING ORDERS AND SHIPMENTS,                             00/00/00
1500      *               CREATES A SUPPLY ORDER AND PRINTS A REPORT.                           00/00/00
1600      *
1700      *      DEPENDENCIES = NONE                                                            00/00/00
1800      *
1900      *      INPUT = PARAMETERS EXPLICITLY PASSED TO THIS FUNCTION:
2000      *
2100      *              LOCAL-DB       LOCAL DB NAME                                           00/00/00
2200      *              REMOTE-DB      REMOTE DB NAME                                          00/00/00
2300      *
2400      *   TABLES =  PART-STOCK       - LOCAL                                                00/00/00
2500      *             PART_ORDER       - REMOTE                                               00/00/00
2600      *             PART_ORDLN       - REMOTE                                               00/00/00
2700      *             SHIPMENTLN       - REMOTE                                               00/00/00
2800      *                                                                                     00/00/00
2900      *   CRTSQLCBL  SPECIAL PARAMETERS                                                     00/00/00
3000      *    PGM(DDBPT6CB) RDB(remotedbname) OPTION(*APOST *APOSTSQL)                         00/00/00
3100      *                                                                                     00/00/00
3200      *   INVOKE BY : CALL DDBPT6CB PARM(localdbname remotedbname)                          00/00/00
3300      *                                                                                     00/00/00
3400      ****************************************************************                      00/00/00
3500        ENVIRONMENT DIVISION.
3600       *---------------------
3700        INPUT-OUTPUT SECTION.
3800        FILE-CONTROL.
3900            SELECT RELAT  ASSIGN TO PRINTER-QPRINT.                                          00/00/00
4000        DATA DIVISION.
4100       *--------------
4200        FILE SECTION.
4300       *-------------                                                                        00/00/00
4400        FD  RELAT
4500            RECORD CONTAINS 33 CHARACTERS
4600            LABEL RECORDS ARE OMITTED
4700            DATA RECORD IS REPREC.
4800        01  REPREC          PIC  X(33).
4900        WORKING-STORAGE SECTION.
5000       *------------------------                                                             00/00/00
5100       *    PRINT LINE  DEFINITIONS                                                          00/00/00
5200        01  LINE0           PIC  X(33) VALUE  SPACES.
5300        01  LINE1           PIC  X(33) VALUE
5400            '***** ROP PROCESSING REPORT *****'.
5500        01  LINE2.
5600          05  FILLER        PIC  X(18) VALUE  '   ORDER NUMBER = '.
5700          05  MASK0         PIC  ZZZ9.
5800          05  FILLER        PIC  X(11) VALUE  SPACES.
5900        01  LINE3           PIC  X(33) VALUE
6000            '---------------------------------'.
6100        01  LINE4           PIC  X(33) VALUE
6200            '   LINE     PART         QTY     '.
6300        01  LINE5           PIC  X(33) VALUE
6400            '  NUMBER   NUMBER     REQUESTED  '.
6500        01  LINE6.
6600          05  FILLER        PIC  XXXX  VALUE SPACES.
6700          05  MASK1         PIC  ZZZ9.
6800          05  FILLER        PIC  XXXX  VALUE SPACES.
6900          05  PART-TABLE    PIC  XXXXX.
7000          05  FILLER        PIC  XXXX  VALUE SPACES.
7100          05  MASK2         PIC  Z,ZZZ,ZZZ.ZZ.
7200        01  LINE7.
7300          05  FILLER        PIC  X(26) VALUE
7400            'NUMBER OF LINES CREATED = '.
7500          05  MASK3         PIC  ZZZ9.
7600          05  FILLER        PIC  XXX   VALUE  SPACES.
7700        01  LINE8           PIC  X(33) VALUE
7800            '********* END OF PROGRAM ********'.
7900       *    MISCELLANEOUS DEFINITIONS                                                        00/00/00
8000        01  WHAT-TIME       PIC  X     VALUE '1'.
8100            88  FIRST-TIME             VALUE '1'.
8200        01  CONTL           PIC  S9999 COMP-4 VALUE ZEROS.                                   00/00/00
8300        01  CONTD           PIC  S9999 COMP-4 VALUE ZEROS.                                   00/00/00
8400        01  RTCODE1         PIC  S9999 COMP-4 VALUE ZEROS.                                   00/00/00
8500        01  RTCODE2         PIC  S9999 COMP-4.                                               00/00/00
8600        01  NEXT-NUM        PIC  S9999 COMP-4.                                               00/00/00
8700        01  IND-NULL        PIC  S9999 COMP-4.                                               00/00/00
8800        01  LOC-TABLE       PIC  X(16).
8900        01  ORD-TABLE       PIC  S9999 COMP-4.                                               00/00/00
9000        01  ORL-TABLE       PIC  S9999 COMP-4.                                               00/00/00
9100        01  QUANT-TABLE     PIC  S9(9) COMP-4.                                               00/00/00
9200        01  QTY-TABLE       PIC  S9(9) COMP-4.                                               00/00/00
9300        01  ROP-TABLE       PIC  S9(9) COMP-4.                                               00/00/00
9400        01  EOQ-TABLE       PIC  S9(9) COMP-4.                                               00/00/00
9500        01  QTY-REQ         PIC  S9(9) COMP-4.                                               00/00/00
9600        01  QTY-REC         PIC  S9(9) COMP-4.                                               00/00/00
9700       * CONSTANT  FOR LOCATION NUMBER                                                       00/00/00
9800        01  XPARM.                                                                           00/00/00
9900            05   LOC        PIC  X(4)  VALUE 'SQLA'.                                         00/00/00
10000       * DEFINITIONS FOR ERROR MESSAGE HANDLING                                             00/00/00
10100        01  ERROR-MESSAGE.                                                                  00/00/00
10200            05   MSG-ID.                                                                    00/00/00
10300            10   MSG-ID-1     PIC  X(2)                                                     00/00/00
10400                 VALUE 'SQ'.                                                                00/00/00
10500            10   MSG-ID-2     PIC 99999.                                                    00/00/00
10600       ******************************                                                        00/00/00
10700       *    SQLCA INCLUDE           *                                                        00/00/00
10800       ******************************                                                        00/00/00
10900            EXEC SQL INCLUDE SQLCA    END-EXEC.
11000                                                                                             00/00/00
11100        LINKAGE SECTION.                                                                     00/00/00
11200       *----------------                                                                     00/00/00
11300        01  LOCAL-DB        PIC  X(18).                                                      00/00/00
11400        01  REMOTE-DB       PIC  X(18).                                                      00/00/00
11500                                                                                             00/00/00
11600        PROCEDURE DIVISION USING LOCAL-DB REMOTE-DB.                                         00/00/00
11700       *------------------                                                                   00/00/00
11800       *****************************                                                         00/00/00
11900       *    SQL CURSOR DECLARATION *                                                         00/00/00
12000       *****************************                                                         00/00/00
12100       * RE-POSITIONABLE CURSOR : POSITION AFTER LAST PART_NUM                               00/00/00
12200            EXEC SQL DECLARE NEXT_PART CURSOR FOR
12300                 SELECT PART_NUM,
12400                        PART_QUANT,
12500                        PART_ROP,
12600                        PART_EOQ
12700                 FROM   PART_STOCK
12800                 WHERE  PART_ROP > PART_QUANT
12900                   AND  PART_NUM > :PART-TABLE                                               00/00/00
13000                 ORDER BY PART_NUM ASC                                                       00/00/00
13100            END-EXEC.
13200       * CURSOR FOR ORDER LINES                                                              00/00/00
13300            EXEC SQL DECLARE NEXT_ORDER_LINE CURSOR FOR
13400                 SELECT A.ORDER_NUM,
13500                        ORDER_LINE,
13600                        QUANT_REQ
13700                 FROM   PART_ORDLN A,                                                        00/00/00
13800                        PART_ORDER B
13900                 WHERE  PART_NUM  = :PART-TABLE
14000                 AND    LINE_STAT  <> 'C'                                                    00/00/00
14100                 AND    A.ORDER_NUM = B.ORDER_NUM
14200                 AND    ORDER_TYPE  = 'R'
14300            END-EXEC.
14400       ******************************                                                        00/00/00
14500       *    SQL RETURN CODE HANDLING*                                                        00/00/00
14600       ******************************                                                        00/00/00
14700            EXEC SQL WHENEVER SQLERROR GO TO DB-ERROR END-EXEC.
14800            EXEC SQL WHENEVER SQLWARNING CONTINUE  END-EXEC.                                 00/00/00
14900                                                                                             00/00/00
15000        MAIN-PROGRAM-PROC.                                                                   00/00/00
15100       *------------------                                                                   00/00/00
15200            PERFORM START-UP THRU START-UP-EXIT.                                             00/00/00
15300            PERFORM MAIN-PROC THRU MAIN-EXIT UNTIL RTCODE1 = 100.                            00/00/00
15400        END-OF-PROGRAM.                                                                      00/00/00
15500       *---------------                                                                      00/00/00
15600       ****                                                                                  00/00/00
15700            EXEC SQL CONNECT RESET END-EXEC.                                                 00/00/00
15800       ****
15900            CLOSE RELAT.
16000            GOBACK.
16100        MAIN-PROGRAM-EXIT. EXIT.                                                             00/00/00
16200       *------------------                                                                   00/00/00
16300                                                                                             00/00/00
16400        START-UP.                                                                            00/00/00
16500       *----------                                                                           00/00/00
16600            OPEN OUTPUT RELAT.                                                               00/00/00
16700       ****                                                                                  00/00/00
16800            EXEC SQL COMMIT END-EXEC.                                                        00/00/00
16900       ****                                                                                  00/00/00
17000            PERFORM CLEAN-UP THRU CLEAN-UP-EXIT.                                             00/00/00
17100       ********************************                                                      00/00/00
17200       *    CONNECT TO LOCAL DATABASE *                                                      00/00/00
17300       ********************************                                                      00/00/00
17400       ****                                                                                  00/00/00
17500            EXEC SQL CONNECT TO :LOCAL-DB END-EXEC.                                          00/00/00
17600       ****                                                                                  00/00/00
17700        START-UP-EXIT. EXIT.                                                                 00/00/00
17800       *------------                                                                         00/00/00
17900            EJECT
18000        MAIN-PROC.
18100       *---------
18200            EXEC SQL OPEN NEXT_PART END-EXEC.                                                00/00/00
18300            EXEC SQL
18400                 FETCH NEXT_PART
18500                 INTO  :PART-TABLE,
18600                       :QUANT-TABLE,
18700                       :ROP-TABLE,
18800                       :EOQ-TABLE
18900            END-EXEC.
19000            IF SQLCODE = 100
19100               MOVE 100 TO RTCODE1                                                           00/00/00
19200               PERFORM TRAILER-PROC THRU TRAILER-EXIT                                        00/00/00
19300            ELSE
19400               MOVE 0 TO RTCODE2
19500               MOVE 0 TO QTY-REQ
19600               MOVE 0 TO QTY-REC
19700       * --- IMPLICIT "CLOSE" CAUSED BY COMMIT ---                                           00/00/00
19800       ****                                                                                  00/00/00
19900               EXEC SQL COMMIT END-EXEC                                                      00/00/00
20000       ****                                                                                  00/00/00
20100       *********************************                                                     00/00/00
20200       *    CONNECT TO REMOTE DATABASE *                                                     00/00/00
20300       *********************************                                                     00/00/00
20400       ****                                                                                  00/00/00
20500               EXEC SQL CONNECT TO :REMOTE-DB END-EXEC                                       00/00/00
20600       ****                                                                                  00/00/00
20700               EXEC SQL OPEN NEXT_ORDER_LINE END-EXEC                                        00/00/00
20800               PERFORM UNTIL RTCODE2 = 100
20900                  EXEC SQL                                                                   00/00/00
21000                       FETCH NEXT_ORDER_LINE
21100                       INTO  :ORD-TABLE,
21200                             :ORL-TABLE,
21300                             :QTY-TABLE
21400                  END-EXEC
21500                  IF SQLCODE = 100
21600                     MOVE 100 TO RTCODE2
21700                     EXEC SQL CLOSE NEXT_ORDER_LINE END-EXEC
21800                  ELSE
21900                     ADD QTY-TABLE TO QTY-REQ
22000                     EXEC SQL
22100                          SELECT SUM(QUANT_RECV)                                             00/00/00
22200                          INTO   :QTY-TABLE:IND-NULL
22300                          FROM   SHIPMENTLN                                                  00/00/00
22400                          WHERE  ORDER_LOC  = :LOC
22500                          AND    ORDER_NUM  = :ORD-TABLE
22600                          AND    ORDER_LINE = :ORL-TABLE
22700                     END-EXEC
22800                     IF IND-NULL NOT < 0
22900                        ADD QTY-TABLE TO QTY-REC
23000                     END-IF
23100                  END-IF
23200               END-PERFORM
23300               IF ROP-TABLE > QUANT-TABLE + QTY-REQ - QTY-REC
23400                  PERFORM ORDER-PROC THRU ORDER-EXIT
23500               END-IF
23600            END-IF.
23700       ****                                                                                  00/00/00
23800            EXEC SQL COMMIT END-EXEC.                                                        00/00/00
23900       ****                                                                                  00/00/00
24000       **********************************                                                    00/00/00
24100       *    RECONNECT TO LOCAL DATABASE *                                                    00/00/00
24200       **********************************                                                    00/00/00
24300       ****                                                                                  00/00/00
24400            EXEC SQL CONNECT TO :LOCAL-DB END-EXEC.                                          00/00/00
24500       ****                                                                                  00/00/00
24600        MAIN-EXIT. EXIT.
24700       *---------------
24800        ORDER-PROC.
24900       *----------
25000            IF FIRST-TIME
25100               MOVE '2' TO WHAT-TIME
25200               PERFORM CREATE-ORDER-PROC THRU CREATE-ORDER-EXIT.                             00/00/00
25300            ADD 1 TO CONTL.
25400            EXEC SQL
25500                 INSERT
25600                 INTO    PART_ORDLN                                                          00/00/00
25700                        (ORDER_NUM,
25800                         ORDER_LINE,
25900                         PART_NUM,
26000                         QUANT_REQ,
26100                         LINE_STAT)
26200                 VALUES (:NEXT-NUM,
26300                         :CONTL,
26400                         :PART-TABLE,
26500                         :EOQ-TABLE,
26600                         'O')
26700            END-EXEC.
26800            PERFORM DETAIL-PROC THRU DETAIL-EXIT.
26900        ORDER-EXIT. EXIT.
27000       *----------------
27100                                                                                             00/00/00
27200        CREATE-ORDER-PROC.                                                                   00/00/00
27300       *------------------                                                                   00/00/00
27400       *GET NEXT ORDER NUMBER                                                                00/00/00
27500            EXEC SQL                                                                         00/00/00
27600                 SELECT (MAX(ORDER_NUM) + 1)                                                 00/00/00
27700                 INTO   :NEXT-NUM:IND-NULL                                                   00/00/00
27800                 FROM   PART_ORDER                                                           00/00/00
27900            END-EXEC.                                                                        00/00/00
28000            IF IND-NULL < 0                                                                  00/00/00
28100              MOVE 1 TO NEXT-NUM.                                                            00/00/00
28200            EXEC SQL                                                                         00/00/00
28300                 INSERT                                                                      00/00/00
28400                 INTO    PART_ORDER                                                          00/00/00
28500                        (ORDER_NUM,                                                          00/00/00
28600                         ORIGIN_LOC,                                                         00/00/00
28700                         ORDER_TYPE,                                                         00/00/00
28800                         ORDER_STAT,                                                         00/00/00
28900                         CREAT_TIME)                                                         00/00/00
29000                 VALUES (:NEXT-NUM,                                                          00/00/00
29100                         :LOC, 'R', 'O',                                                     00/00/00
29200                         CURRENT TIMESTAMP)                                                  00/00/00
29300               END-EXEC.                                                                     00/00/00
29400            MOVE NEXT-NUM TO MASK0.                                                          00/00/00
29500            PERFORM HEADER-PROC THRU HEADER-EXIT.                                            00/00/00
29600        CREATE-ORDER-EXIT. EXIT.                                                             00/00/00
29700       *------------------                                                                   00/00/00
29800                                                                                             00/00/00
29900        DB-ERROR.                                                                            00/00/00
30000       *--------                                                                             00/00/00
30100            PERFORM ERROR-MSG-PROC THRU ERROR-MSG-EXIT.                                      00/00/00
30200       ***********************                                                               00/00/00
30300       *    ROLLBACK THE LUW *                                                               00/00/00
30400       ***********************                                                               00/00/00
30500            EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.                                    00/00/00
30600       ****                                                                                  00/00/00
30700            EXEC SQL ROLLBACK WORK END-EXEC.                                                 00/00/00
30800       ****                                                                                  00/00/00
30900            PERFORM END-OF-PROGRAM THRU MAIN-PROGRAM-EXIT.                                   00/00/00
31000       * -- NEXT LINE INCLUDED TO RESET THE "GO TO" DEFAULT --                               00/00/00
31100            EXEC SQL WHENEVER SQLERROR GO TO DB-ERROR END-EXEC.                              00/00/00
31200                                                                                             00/00/00
31300        ERROR-MSG-PROC.                                                                      00/00/00
31400       *----------                                                                           00/00/00
31500            MOVE  SQLCODE   TO  MSG-ID-2.                                                    00/00/00
31600            DISPLAY 'SQL STATE =' SQLSTATE ' SQLCODE =' MSG-ID-2.                            00/00/00
31700       * -- ADD HERE ANY ADDITIONAL ERROR MESSAGE HANDLING --                                00/00/00
31800        ERROR-MSG-EXIT. EXIT.                                                                00/00/00
31900       *----------------                                                                     00/00/00
32000                                                                                             00/00/00
32100       *******************                                                                   00/00/00
32200       * REPORT PRINTING *                                                                   00/00/00
32300       *******************                                                                   00/00/00
32400        HEADER-PROC.                                                                         00/00/00
32500       *-----------                                                                          00/00/00
32600            WRITE REPREC FROM LINE1 AFTER ADVANCING PAGE.
32700            WRITE REPREC FROM LINE2 AFTER ADVANCING 3 LINES.
32800            WRITE REPREC FROM LINE3 AFTER ADVANCING 2 LINES.
32900            WRITE REPREC FROM LINE4 AFTER ADVANCING 1 LINES.
33000            WRITE REPREC FROM LINE5 AFTER ADVANCING 1 LINES.
33100            WRITE REPREC FROM LINE3 AFTER ADVANCING 1 LINES.
33200            WRITE REPREC FROM LINE0 AFTER ADVANCING 1 LINES.
33300        HEADER-EXIT. EXIT.
33400       *-----------------
33500        DETAIL-PROC.
33600       *-----------
33700            ADD 1 TO CONTD.
33800            IF CONTD > 50
33900               MOVE 1 TO CONTD
34000               PERFORM HEADER-PROC THRU HEADER-EXIT
34100            END-IF
34200            MOVE CONTL     TO MASK1.
34300            MOVE EOQ-TABLE TO MASK2.
34400            WRITE REPREC FROM LINE6 AFTER ADVANCING 1 LINES.
34500        DETAIL-EXIT. EXIT.
34600       *-----------------
34700        TRAILER-PROC.
34800       *------------
34900            MOVE CONTL TO MASK3.
35000            WRITE REPREC FROM LINE3 AFTER ADVANCING 2 LINES.
35100            WRITE REPREC FROM LINE7 AFTER ADVANCING 2 LINES.
35200            WRITE REPREC FROM LINE3 AFTER ADVANCING 2 LINES.
35300            WRITE REPREC FROM LINE8 AFTER ADVANCING 1 LINES.
35400        TRAILER-EXIT. EXIT.
35500       *------------------
35600       ********************************************************                              00/00/00
35700       * THIS PARAGRAPH IS ONLY REQUIRED IN A TEST ENVIRONMENT*                              00/00/00
35800       * TO RESET THE DATA TO PERMIT RE-RUNNING OF THE TEST   *                              00/00/00
35900       ********************************************************                              00/00/00
36000        CLEAN-UP.                                                                            00/00/00
36100       *---------                                                                            00/00/00
36200       *********************************                                                     00/00/00
36300       *    CONNECT TO REMOTE DATABASE *                                                     00/00/00
36400       *********************************                                                     00/00/00
36500       ****                                                                                  00/00/00
36600            EXEC SQL CONNECT TO :REMOTE-DB END-EXEC.                                         00/00/00
36700       ****                                                                                  00/00/00
36800       *---------------------DELETE ORDER ROWS FOR RERUNABILITY                              00/00/00
36900               EXEC SQL                                                                      00/00/00
37000                    DELETE                                                                   00/00/00
37100                    FROM    PART_ORDLN                                                       00/00/00
37200                    WHERE   ORDER_NUM IN                                                     00/00/00
37300                               (SELECT  ORDER_NUM                                            00/00/00
37400                                FROM    PART_ORDER                                           00/00/00
37500                                WHERE   ORDER_TYPE = 'R')                                    00/00/00
37600               END-EXEC.                                                                     00/00/00
37700               EXEC SQL                                                                      00/00/00
37800                    DELETE                                                                   00/00/00
37900                    FROM    PART_ORDER                                                       00/00/00
38000                    WHERE   ORDER_TYPE = 'R'                                                 00/00/00
38100               END-EXEC.                                                                     00/00/00
38200       ****                                                                                  00/00/00
38300            EXEC SQL COMMIT END-EXEC.                                                        00/00/00
38400       ****                                                                                  00/00/00
38500        CLEAN-UP-EXIT. EXIT.                                                                 00/00/00
38600       *-------------                                                                        00/00/00
* * * *  E N D  O F  S O U R C E  * * * *