Using COBOL

Topics:

These examples illustrate how to set up a COBOL2 application that sends requests for data to a server through the Extender for Db2. The examples are:

Sample COBOL2 Program

Topics:

The sample COBOL2 program, XTDCOB, performs the following:

  • Processes both PREPARED and EXECUTE IMMEDIATE statements.
  • Accesses both local Db2 tables and server (Extender) tables.
  • Accepts commands from SYSIN DD.
  • Accepts parameters from XTDPRM DD.

XTDCOB can be run in the following modes:

  • Batch JCL mode or interactively.
  • DSNALI mode or DSNELI mode.

You can enter the following commands in SYSIN DD for a Prepared SQL statement or an Execute Immediate statement.

+------------------------------------------+
|            Available Commands:           |
|                                          |
| Prepared SQL statement Syntax:           |
|  SQL <sql statement>                     |
|  END                                     |
|                                          |
| Execute Immediate Syntax:                |
|  IMM <sql statement>                     |
|  END                                     |
|                                          |
| Type EXIT to exit this program.          |
+-----------------------------------------+

XTDCOB contains DEBUG and BATCH options for XTDPRM DD.

DEBUG=Y|N

where:

Y

Displays COBOL debugging messages.

N

Does not display the debugging messages. This is the default value.

BATCH=Y|N

where:

Y

Echoes input commands back to SYSOUT DD.

N

Does not echo input commands (interactive mode). This is the default value.

Note: The sample program can retrieve numeric and alpha columns, but it does not convert numeric columns into a displayable format. Therefore, the output of a numeric column appears in its internal binary representation. For example, the number 12 could be represented as 000C (undisplayable).

XTDCOB

A sample XTDCOB program is provided at qualif.HOME.DATA(XTDCOB) follows:

IDENTIFICATION DIVISION.                                         00370099
PROGRAM-ID. XTDCOB.                                              00380099
AUTHOR.     YANKO CASELLA.                                       00390099
ENVIRONMENT DIVISION.                                            00400099
CONFIGURATION SECTION.                                           00410099
SOURCE-COMPUTER. IBM-370.                                        00420099
OBJECT-COMPUTER. IBM-370.                                        00430099
INPUT-OUTPUT SECTION.                                            00440099
FILE-CONTROL.                                                    00450099
    SELECT XTDPRM                                                00460099
          ASSIGN TO XTDPRM.                                      00470099
    SELECT DBGOUT                                                00471099
          ASSIGN TO DBGOUT.                                      00472099
DATA DIVISION.                                                   00473099
FILE SECTION.                                                    00474099
FD      XTDPRM                                                   00475099
        RECORD CONTAINS 80 CHARACTERS                            00476099
        BLOCK CONTAINS 0 RECORDS                                 00477099
        LABEL RECORDS ARE OMITTED                                00478099
        RECORDING MODE IS F.                                     00479099
01  PRMREC                  PIC X(80).                           00480099
                                                                 00490099
FD      DBGOUT                                                   00500099
        RECORD CONTAINS 132 CHARACTERS                           00510099
        BLOCK CONTAINS 0 RECORDS                                 00520099
        LABEL RECORDS ARE OMITTED                                00530099
        RECORDING MODE IS F.                                     00540099
01  MSGREC                  PIC X(132).                          00550099
                                                                 00550199
WORKING-STORAGE SECTION.                                         00570099
01  MSGERR                  PIC X(132).                          00580099
77  MSGNUM                  PIC -ZZZ,ZZZ,ZZ9.                    00590099
77  MSGBLK                  PIC X(132) VALUE SPACES.             00600099
77  MSGLEN                  PIC 9(4)   VALUE 132.                00610099
                                                                 00610199
01 SLCT-STMT.                                                    00610799
   49 SLCT-LENGTH           PIC S9(04) COMP-5.                   00610899
   49 SLCT-STRING           PIC X(32700).                        00610999
                                                                 00611099
01 SYSIN-STRING.                                                 00611499
   05 SYSIN-CMD             PIC X(04).                           00611599
   05 SYSIN-LINE            PIC X(76).                           00611699
                                                                 00611799
01 REXX-PARMS.                                                   00612099
   05 FILLER                PIC X(6) VALUE "DEBUG=".             00613099
   05 DEBUG-YES             PIC X.                               00614099
   05 FILLER                PIC X(7) VALUE ",BATCH=".            00615099
   05 BATCH-YES             PIC X.                               00616099
   05 FILLER                PIC X(65).                           00617099
********************************************************         00618099
* STRUCTURE FOR INPUT                                  *         00619099
********************************************************         00620099
01 IOAREA.                                                       00630099
   02 TNAME                PIC X(72).                            00640099
   02 FILLER               PIC X(08).                            00650099
                                                                 00660099
***********************************************************      00670099
* VARIABLES FOR ERROR-MESSAGE FORMATTING                  *      00680099
***********************************************************      00690099
01 ERROR-MESSAGE.                                                00700099
   02 ERROR-LEN             PIC S9(4) COMP VALUE +960.           00710099
   02 ERROR-TEXT            PIC X(120) OCCURS 8 TIMES            00720099
                               INDEXED BY ERROR-INDEX.           00730099
77 ERROR-TEXT-LEN           PIC S9(8) COMP VALUE +120.           00740099
***********************************************************      00750099
*    SQLDA                                                *      00760099
***********************************************************      00770099
01 SQLDA.                                                        00780099
   02 SQLDAID               PIC X(08)  VALUE "SQLDA   ".         00790099
   02 SQLDABC               PIC S9(08) COMP VALUE 33016.         00800099
   02 SQLN                  PIC S9(04) COMP VALUE 750.           00810099
   02 SQLD                  PIC S9(04) COMP VALUE 0.             00820099
   02 SQLVAR                OCCURS 1 TO 750 TIMES                00830099
                            DEPENDING ON SQLN.                   00840099
     03 SQLTYPE             PIC S9(04) COMP.                     00850099
     03 SQLLEN              PIC S9(04) COMP.                     00860099
     03 SQLDATA             POINTER.                             00870099
     03 SQLIND              POINTER.                             00880099
     03 SQLNAME.                                                 00890099
       49 SQLNAMEL          PIC S9(04) COMP.                     00900099
       49 SQLNAMEC          PIC X(30).                           00910099
                                                                 00920099
77 VARCTYPE                 PIC S9(4) COMP VALUE +448.           00930099
77 CHARTYPE                 PIC S9(4) COMP VALUE +452.           00940099
77 VARLTYPE                 PIC S9(4) COMP VALUE +456.           00950099
77 VARGTYPE                 PIC S9(4) COMP VALUE +464.           00960099
77 GTYPE                    PIC S9(4) COMP VALUE +468.           00970099
77 LVARGTYP                 PIC S9(4) COMP VALUE +472.           00980099
77 FLOATYPE                 PIC S9(4) COMP VALUE +480.           00990099
77 DECTYPE                  PIC S9(4) COMP VALUE +484.           01000099
77 INTTYPE                  PIC S9(4) COMP VALUE +496.           01010099
77 HWTYPE                   PIC S9(4) COMP VALUE +500.           01020099
77 DATETYP                  PIC S9(4) COMP VALUE +384.           01030099
77 MDTTIMTP                 PIC S9(4) COMP VALUE +397.           01040099
                                                                 01050099
01 TITLE-REC.                                                    01060099
   02 TITLE-LEN             PIC S9(4) COMP.                      01070099
   02 TITLE-LINE            PIC X(132).                          01080099
   02 TITLE-SEP             PIC X(132) VALUE ALL "_".            01080199
                                                                 01081099
01  SQLDATA-REC.                                                 01091099
   02 REC1-LEN              PIC S9(8)  COMP.                     01092099
   02 REC1-CHAR             PIC X(1) OCCURS 1 TO 32700 TIMES     01093299
        DEPENDING ON REC1-LEN.                                   01094099
01  SQLDATA-IND.                                                 01100099
02 IND                      PIC S9(04) COMP OCCURS 750 TIMES.    01110099
                                                                 01120099
01 RECPTR POINTER.                                               01130099
01 RECNUM REDEFINES RECPTR  PIC S9(9) COMP.                      01140099
01 I                        PIC S9(4) COMP.                      01150099
01 DUMMY                    PIC S9(4) COMP.                      01160099
01 MYTYPE                   PIC S9(4) COMP.                      01170099
01 COLUMN-IND               PIC S9(4) COMP.                      01180099
01 COLUMN-LEN               PIC S9(4) COMP.                      01190099
01 COLUMN-PREC              PIC S9(4) COMP.                      01200099
01 COLUMN-SCALE             PIC S9(4) COMP.                      01210099
01 INDCOUNT                 PIC S9(4) COMP.                      01220099
01 ROWCOUNT                 PIC S9(9) COMP.                      01230099
01 WORKAREA2.                                                    01240099
   02 WORKINDPTR POINTER  OCCURS 750 TIMES.                      01250099
                                                                 01260099
  EXEC SQL                                                       01270099
    DECLARE SLCT-CSR CURSOR FOR SLCT-CSR-STMT                    01280099
  END-EXEC.                                                      01290099
                                                                 01300099
  EXEC SQL                                                       01310099
     DECLARE SLCT-CSR-STMT STATEMENT                             01320099
  END-EXEC.                                                      01330099
                                                                 01340099
  EXEC SQL INCLUDE SQLCA END-EXEC.                               01350099
                                                                 01360099
77  ONE                     PIC S9(4) COMP VALUE +1.             01380099
77  TWO                     PIC S9(4) COMP VALUE +2.             01390099
77  FOUR                    PIC S9(4) COMP VALUE +4.             01400099
77  QMARK                   PIC X          VALUE "?".            01401099
77  LAST-CMD                PIC X(4).                            01410099
                                                                 01420099
LINKAGE SECTION.                                                 01430099
01  SQLDATA-BLANK.                                               01440099
   02 INDREC                PIC X(1).                            01450099
                                                                 01460099
PROCEDURE DIVISION.                                              01470099
                                                                 01480099
*****************************************************            01490099
* SQL RETURN CODE HANDLING                          *            01500099
*****************************************************            01510099
  EXEC SQL WHENEVER SQLERROR  GOTO DBERROR END-EXEC.             01520099
  EXEC SQL WHENEVER NOT FOUND  CONTINUE    END-EXEC.             01540099
                                                                 01550099
  OPEN INPUT XTDPRM.                                             01560099
  READ XTDPRM INTO REXX-PARMS.                                   01570099
  CLOSE XTDPRM.                                                  01580099
                                                                 01590099
  IF DEBUG-YES = 'Y' THEN                                        01600099
     OPEN OUTPUT DBGOUT.                                         01610099
                                                                 01620099
  DISPLAY "+---------------------------------+".                 01630099
  DISPLAY "|       Available Commands:       |".                 01640099
  DISPLAY "|                                 |".                 01650099
  DISPLAY "| Prepared SQL statement Syntax:  |".                 01660099
  DISPLAY "|  SQL <sql statement>            |".                 01670099
  DISPLAY "|  END                            |".                 01680099
  DISPLAY "|                                 |".                 01690099
  DISPLAY "| Execute Immediate Syntax:       |".                 01700099
  DISPLAY "|  IMM <sql statement>            |".                 01710099
  DISPLAY "|  END                            |".                 01720099
  DISPLAY "|                                 |".                 01730099
  DISPLAY "| Type EXIT to exit this program. |".                 01740099
  DISPLAY "+---------------------------------+".                 01750099
  DISPLAY " ".                                                   01760099
  MOVE ONE TO SLCT-LENGTH.                                       01770099
                                                                 01780099
MAIN-LOOP.                                                       01790099
                                                                 01800099
   DISPLAY "Type Command To Be Processed:".                      01810099
   DISPLAY " ".                                                  01820099
   MOVE SPACES TO LAST-CMD.                                      01830099
                                                                 01840099
READ-SQL.                                                        01850099
   ACCEPT  SYSIN-STRING FROM SYSIN.                              01860099
   IF BATCH-YES = 'Y' THEN                                       01870099
     DISPLAY SYSIN-STRING.                                       01880099
                                                                 01890099
   
EVALUATE FUNCTION UPPER-CASE (SYSIN-CMD)                      01900099
    WHEN "SQL "                                                  01910099
      MOVE "SQL " TO LAST-CMD                                    01920099
      MOVE ONE TO SLCT-LENGTH                                    01930099
      STRING SYSIN-LINE DELIMITED BY SIZE                        01940099
        INTO SLCT-STRING WITH POINTER SLCT-LENGTH                01950099
      GO TO READ-SQL                                             01960099
                                                                 01970099
    WHEN "IMM "                                                  01980099
       MOVE "IMM " TO LAST-CMD                                   01990099
       MOVE ONE TO SLCT-LENGTH                                   02000099
       STRING SYSIN-LINE DELIMITED BY SIZE                       02010099
         INTO SLCT-STRING WITH POINTER SLCT-LENGTH               02020099
       GO TO READ-SQL                                            02030099
                                                                 02040099
     WHEN "EXIT"                                                 02050099
       GO TO PROG-END                                            02060099
                                                                 02070099
     WHEN "END "                                                 02080099
       SUBTRACT ONE FROM SLCT-LENGTH                             02090099
                                                                 02100099
       IF DEBUG-YES = 'Y' THEN                                   02110099
         STRING "LAST-CMD = ", LAST-CMD, MSGBLK                  02120099
           DELIMITED BY MSGLEN INTO MSGERR                       02130099
         WRITE MSGREC FROM MSGERR                                02140099
         MOVE SLCT-LENGTH TO MSGNUM                              02150099
         STRING "IN READ-SQL SLCT-LENGTH = ", MSGNUM, MSGBLK0    02160099
           DELIMITED BY MSGLEN INTO MSGERR                       02170099
        WRITE MSGREC FROM MSGERR                                 02180099
        STRING "IN READ-SQL SLCT-STRING = ", SLCT-STRING,        02190099
           MSGBLK DELIMITED BY MSGLEN INTO MSGERR                02200099
        WRITE MSGREC FROM MSGERR                                 02210099
     END-IF                                                      02220099
                                                                 02230099
     EVALUATE LAST-CMD                                           02240099
                                                                 02250099
       WHEN "SQL "                                               02260099
         PERFORM PROCESS-INPUT THROUGH IND-RESULT                02270099
       WHEN "IMM "                                               02280099
         PERFORM IMMED-SQL THROUGH PRINT-ROWS                    02290099
     END-EVALUATE                                                02300099
     GO TO MAIN-LOOP                                             02310099
                                                                 02320099
       WHEN OTHER                                                02330099
        STRING SYSIN-STRING DELIMITED BY SIZE                    02340099
          INTO SLCT-STRING WITH POINTER SLCT-LENGTH              02350099
        GO TO READ-SQL                                           02360099
     END-EVALUATE.                                               02370099
                                                                 02380099
     PROG-END.                                                   02390099
       IF DEBUG-YES = 'Y' THEN                                   02400099
         CLOSE DBGOUT.                                           02410099
       GOBACK.                                                   02420099
***********************************************************      02430099
* PREPARE                                                 *      02440099
***********************************************************      02450099
PROCESS-INPUT.                                                   02460099
  EXEC SQL                                                       02470099
   PREPARE SLCT-CSR-STMT                                         02480099
    INTO :SQLDA                                                  02490099
    FROM :SLCT-STMT                                              02500099
  END-EXEC.                                                      02510099
**************************************************************** 02520099
* SET UP ADDRESSES IN THE SQLDA FOR DATA                       * 02530099
**************************************************************** 02540099
  IF DEBUG-YES = 'Y' THEN                                        02550099
   MOVE SQLD TO MSGNUM                                           02560099
   STRING "IN PROCESS-INPUT SQLD = ", MSGNUM, MSGBLK             02570099
   DELIMITED BY MSGLEN INTO MSGERR                               02580099
   WRITE MSGREC FROM MSGERR                                      02590099
   MOVE SQLN TO MSGNUM                                           02600099
   STRING "IN PROCESS-INPUT SQLN = ", MSGNUM, MSGBLK             02610099
     DELIMITED BY MSGLEN INTO MSGERR                             02620099
   WRITE MSGREC FROM MSGERR.                                     02630099
**************************************************************** 02640099
* IF STATEMENT IS NOT SELECT, EXECUTE STMT                     * 02650099
**************************************************************** 02660099
  IF SQLD = ZERO THEN                                            02670099
    GO TO NOT-A-SELECT.                                          02680099
                                                                 02690099
  DISPLAY " "                                                    02700099
  MOVE ZERO TO ROWCOUNT.                                         02710099
  MOVE ZERO TO REC1-LEN.                                         02720099
  SET  RECPTR TO ADDRESS OF REC1-CHAR(1).                        02730099
  MOVE ONE TO I.                                                 02740099
  INITIALIZE TITLE-LINE.                                         02740199
  MOVE ONE TO TITLE-LEN.                                         02741099
  PERFORM COLADDR UNTIL I > SQLD.                                02750099
  MOVE SPACES TO SQLDATA-REC(5:REC1-LEN).                        02750199
  DISPLAY TITLE-LINE.                                            02750299
  DISPLAY TITLE-SEP.                                             02751099
************************************************************     02760099
*     SET LENGTH OF OUTPUT RECORD.                         *     02770099
 *     OPEN CURSOR                                         *     02780099
************************************************************     02790099
                                                                 02800099
   EXEC SQL OPEN SLCT-CSR END-EXEC.                              02810099
                                                                 02820099
***********************************************************      02830099
*                         FETCH                           *      02840099
***********************************************************      02850099
   IF DEBUG-YES = 'Y' THEN                                       02860099
   STRING "AT FETCH.....", MSGBLK DELIMITED BY MSGLEN            02870099
         INTO MSGERR                                             02880099
     WRITE MSGREC FROM MSGERR.                                   02890099
                                                                 02900099
   EXEC SQL                                                      02910099
     FETCH SLCT-CSR                                              02920099
     USING DESCRIPTOR :SQLDA                                     02930099
    END-EXEC.                                                    02940099
                                                                 02950099
   IF SQLCODE = ZERO THEN                                        02960099
    PERFORM WRITE-AND-FETCH                                      02970099
      UNTIL SQLCODE IS NOT EQUAL TO ZERO.                        02980099
                                                                 02990099
   MOVE ROWCOUNT TO MSGNUM                                       03000099
   DISPLAY " "                                                   03010099
   DISPLAY "***** NUMBER OF RECORDS IN TABLE=" MSGNUM " *****"   03020099
   DISPLAY " "                                                   03030099
                                                                 03040099
   IF DEBUG-YES = 'Y' THEN                                       03050099
    STRING "LEAVING FETCH.....", MSGBLK                          03060099
        DELIMITED BY MSGLEN INTO MSGERR                          03070099
    WRITE MSGREC FROM MSGERR.                                    03080099
                                                                 03090099
CLOSEDT.                                                         03100099
   IF DEBUG-YES = 'Y' THEN                                       03110099
    STRING "AT CLOSEDT.....", MSGBLK                             03120099
       DELIMITED BY MSGLEN INTO MSGERR                           03130099
    WRITE MSGREC FROM MSGERR.                                    03140099
                                                                 03150099
   EXEC SQL CLOSE SLCT-CSR END-EXEC.                             03160099
                                                                 03170099
IND-RESULT.                                                      03180099
   IF DEBUG-YES = 'Y' THEN                                       03190099
    STRING "AT IND-RESULT. RETURNING TO MAIN LOOP.", MSGBLK      03200099
       DELIMITED BY MSGLEN INTO MSGERR                           03210099
    WRITE MSGREC FROM MSGERR.                                    03220099
                                                                 03230099
WRITE-AND-FETCH.                                                 03240099
   IF DEBUG-YES = 'Y' THEN                                       03250099
    STRING "AT WRITE-AND-FETCH.....", MSGBLK                     03260099
       DELIMITED BY MSGLEN INTO MSGERR                           03270099
    WRITE MSGREC FROM MSGERR.                                    03280099
                                                                 03290099
   MOVE ONE TO INDCOUNT.                                         03300099
   PERFORM NULLCHK UNTIL INDCOUNT > SQLD.                        03310099
                                                                 03320099
   IF DEBUG-YES = 'Y' THEN                                       03330099
     STRING "SQLDATA-REC = ", SQLDATA-REC, MSGBLK                03340099
        DELIMITED BY MSGLEN INTO MSGERR                          03350099
     WRITE MSGREC FROM MSGERR.                                   03360099
                                                                 03370099
   DISPLAY SQLDATA-REC(5:REC1-LEN).                              03380099
   MOVE SPACES TO SQLDATA-REC(5:REC1-LEN).                       03390099
   ADD ONE TO ROWCOUNT.                                          03420099
                                                                 03430099
   EXEC SQL                                                      03440099
     FETCH SLCT-CSR                                              03450099
        USING DESCRIPTOR :SQLDA                                  03460099
     END-EXEC.                                                   03470099
                                                                 03480099
   IF DEBUG-YES = 'Y' THEN                                       03490099
     STRING "IN WRITE-AND-FETCH SQLDA = ", SQLDA, MSGBLK         03500099
        DELIMITED BY MSGLEN INTO MSGERR                          03510099
       WRITE MSGREC FROM MSGERR                                  03520099
                                                                 03530099
       STRING "LEAVING WRITE-AND-FETCH.....", MSGBLK             03540099
        DELIMITED BY MSGLEN INTO MSGERR                          03550099
       ITE MSGREC FROM MSGERR.                                   03560099
NULLCHK.                                                         03570099
   IF DEBUG-YES = 'Y' THEN                                       03580099
     STRING "AT NULLCHK.....", MSGBLK                            03590099
        DELIMITED BY MSGLEN INTO MSGERR                          03600099
     WRITE MSGREC FROM MSGERR                                    03610099
                                                                 03620099
     MOVE IND(INDCOUNT) TO MSGNUM                                03630099
     STRING "IN NULLCHK IND(INDCOUNT) = ", MSGNUM, MSGBLK        03640099
        DELIMITED BY MSGLEN INTO MSGERR                          03650099
     WRITE MSGREC FROM MSGERR.                                   03660099
                                                                 03690199
   IF IND(INDCOUNT) < 0 THEN                                     03691099
     SET ADDRESS OF SQLDATA-BLANK TO WORKINDPTR(INDCOUNT)        03692099
     MOVE QMARK TO INDREC.                                       03700099
                                                                 03710099
   IF DEBUG-YES = 'Y' THEN                                       03720099
     MOVE INDCOUNT TO MSGNUM                                     03730099
     STRING "IN NULLCHK AFTER IF - INDCOUNT = ", MSGNUM, MSGBLK  03740099
         DELIMITED BY MSGLEN INTO MSGERR                         03750099
     WRITE MSGREC FROM MSGERR.                                   03760099
                                                                 03770099
   ADD ONE TO INDCOUNT.                                          03780099
                                                                 03790099
   IF DEBUG-YES = 'Y' THEN                                       03800099
       STRING "LEAVING NULLCHK....", MSGBLK                      03810099
          DELIMITED BY MSGLEN INTO MSGERR                        03820099
       WRITE MSGREC FROM MSGERR.                                 03830099
                                                                 03850699
COLADDR.                                                         03851099
   IF DEBUG-YES = 'Y' THEN                                       03860099
       STRING "AT COLADDR.....", MSGBLK                          03870099
          DELIMITED BY MSGLEN INTO MSGERR                        03880099
       WRITE MSGREC FROM MSGERR.                                 03890099
                                                                 03900099
   SET SQLDATA(I) TO RECPTR.                                     03940099
**************************************************************** 03950099
*             DETERMINE LENGTH OF COLUMN (COLUMN-LEN)          * 03960099
**************************************************************** 03970099
   MOVE SQLLEN(I) TO COLUMN-LEN.                                 03980099
**************************************************************** 03990099
*             COLUMN-IND IS 0 FOR NO NULLS AND 1 FOR NULLS     * 04000099
**************************************************************** 04010099
    DIVIDE SQLTYPE(I) BY TWO GIVING DUMMY REMAINDER COLUMN-IND.  04020099
**************************************************************** 04030099
*             MYTYPE IS JUST THE SQLTYPE WITHOUT THE NULL BIT  * 04040099
**************************************************************** 04050099
    MOVE SQLTYPE(I) TO MYTYPE.                                   04060099
                                                                 04070099
    IF DEBUG-YES = 'Y' THEN                                      04080099
       MOVE SQLTYPE(I) TO MSGNUM                                 04090099
       STRING "IN COLADDR SQLTYPE(I) = ", MSGNUM, MSGBLK         04100099
           DELIMITED BY MSGLEN INTO MSGERR                       04110099
       WRITE MSGREC FROM MSGERR.                                 04120099
                                                                 04130099
    SUBTRACT COLUMN-IND FROM MYTYPE.                             04140099
**************************************************************** 04150099
*          SET THE COLUMN LENGTH, DEPENDENT UPON DATA TYPE *     04160099
**************************************************************** 04170099
    EVALUATE MYTYPE                                              04180099
       WHEN CHARTYPE CONTINUE,                                   04190099
       WHEN DATETYP THROUGH MDTTIMTP CONTINUE,                   04200099
       WHEN FLOATYPE CONTINUE,                                   04210099
       WHEN VARCTYPE                                             04220099
          ADD TWO TO COLUMN-LEN,                                 04230099
       WHEN VARLTYPE                                             04240099
          ADD TWO TO COLUMN-LEN,                                 04250099
       WHEN GTYPE                                                04260099
          MULTIPLY COLUMN-LEN BY TWO GIVING COLUMN-LEN,          04270099
       WHEN VARGTYPE                                             04280099
          PERFORM CALC-VARG-LEN,                                 04290099
       WHEN LVARGTYP                                             04300099
          PERFORM CALC-VARG-LEN,                                 04310099
       WHEN HWTYPE                                               04320099
          MOVE TWO TO COLUMN-LEN,                                04330099
       WHEN INTTYPE                                              04340099
          MOVE FOUR TO COLUMN-LEN,                               04350099
       WHEN DECTYPE                                              04360099
          PERFORM CALC-DECIMAL-LEN,                              04370099
       WHEN OTHER                                                04380099
          PERFORM UNRECOGNIZED-ERROR,                            04390099
    END-EVALUATE.                                                04400099
                                                                 04410099
    IF DEBUG-YES = 'Y' THEN                                      04420099
       MOVE COLUMN-LEN TO MSGNUM                                 04430099
       STRING "IN COLADDR COLUMN-LEN = ", MSGNUM, MSGBLK         04440099
          DELIMITED BY MSGLEN INTO MSGERR                        04450099
       WRITE MSGREC FROM MSGERR.                                 04460099
                                                                 04470099
    ADD COLUMN-LEN TO RECNUM.                                    04480099
    ADD COLUMN-LEN TO REC1-LEN.                                  04490099
                                                                 04490199
    STRING SQLNAMEC(I) DELIMITED BY SPACE                        04491099
           INTO TITLE-LINE POINTER TITLE-LEN.                    04491199
    STRING SPACE DELIMITED BY SIZE                               04491299
           INTO TITLE-LINE POINTER TITLE-LEN.                    04491399
*************************************************************    04500099
*IF THIS COLUMN CAN BE NULL, AN INDICATOR VARIABLE IS NEEDED*    04510099
*************************************************************    04520099
    MOVE ZERO TO IND(I)                                          04530099
    IF COLUMN-IND = ONE THEN                                     04540099
       SET SQLIND(I) TO ADDRESS OF IND(I)                        04550099
       SET WORKINDPTR(I) TO RECPTR                               04560099
       ADD ONE TO RECNUM                                         04570099
       ADD ONE TO REC1-LEN.                                      04580099
                                                                 04583099
    ADD ONE TO I.                                                04590099
                                                                 04600099
    IF DEBUG-YES = 'Y' THEN                                      04610099
       STRING "LEAVING COLADDR....", MSGBLK                      04620099
              DELIMITED BY MSGLEN INTO MSGERR                    04630099
       WRITE MSGREC FROM MSGERR.                                 04640099
*************************************************************    04650099
*CALCULATE COLUMN LENGTH FOR A DECIMAL DATA TYPE COLUMN.    *    04660099
*************************************************************    04670099
CALC-DECIMAL-LEN.                                                04680099
    IF DEBUG-YES = 'Y' THEN                                      04690099
       STRING "AT CALC-DECIMAL-LEN....", MSGBLK                  04700099
          DELIMITED BY MSGLEN INTO MSGERR                        04710099
       WRITE MSGREC FROM MSGERR.                                 04720099
                                                                 04730099
    DIVIDE COLUMN-LEN BY 256 GIVING COLUMN-PREC                  04740099
                      REMAINDER COLUMN-SCALE.                    04750099
    MOVE COLUMN-PREC TO COLUMN-LEN.                              04760099
    ADD ONE TO COLUMN-LEN.                                       04770099
    DIVIDE COLUMN-LEN BY TWO GIVING COLUMN-LEN.                  04780099
                                                                 04790099
    IF DEBUG-YES = 'Y' THEN                                      04800099
       MOVE COLUMN-LEN TO MSGNUM                                 04810099
       STRING "IN CALC-DECIMAL-LEN COLUMN-LEN= ", MSGNUM, MSGBLK 04820099
          DELIMITED BY MSGLEN INTO MSGERR                        04830099
       WRITE MSGREC FROM MSGERR                                  04840099
                                                                 04850099
       STRING "LEAVING CALC-DECIMAL-LEN....", MSGBLK             04860099
              DELIMITED BY MSGLEN INTO MSGERR                    04870099
       WRITE MSGREC FROM MSGERR.                                 04880099
*************************************************************    04890099
*PERFORM PARAGRAPH TO CALCULATE COLUMN LENGTH               *    04900099
*FOR A VARGRAPHIC DATA TYPE COLUMN.                         *    04910099
*************************************************************    04920099
CALC-VARG-LEN.                                                   04930099
    IF DEBUG-YES = 'Y' THEN                                      04940099
       STRING "AT CALC-VARG-LEN.....", MSGBLK                    04950099
          DELIMITED BY MSGLEN INTO MSGERR                        04960099
       WRITE MSGREC FROM MSGERR.                                 04970099
                                                                 04980099
    MULTIPLY COLUMN-LEN BY TWO GIVING COLUMN-LEN.                04990099
    ADD TWO TO COLUMN-LEN.                                       05000099
                                                                 05010099
    IF DEBUG-YES = 'Y' THEN                                      05020099
       STRING "LEAVING CALC-VARG-LEN.....", MSGBLK               05030099
          DELIMITED BY MSGLEN INTO MSGERR                        05040099
       WRITE MSGREC FROM MSGERR.                                 05050099
*************************************************************    05060099
*PERFORM PARAGRAPH TO NOTE AN UNRECOGNIZED DATA TYPE COLUMN.*    05070099
*************************************************************    05080099
UNRECOGNIZED-ERROR.                                              05090099
    MOVE MYTYPE TO MSGNUM                                        05100099
    DISPLAY "UNRECOGNIZED DATA TYPE = " MSGNUM                   05110099
    MOVE COLUMN-LEN TO MSGNUM                                    05120099
    DISPLAY "            COLUMN-LEN = " MSGNUM                   05130099
                                                                 05140099
    GO TO IND-RESULT.                                            05150099
                                                                 05160099
NOT-A-SELECT.                                                    05170099
    IF DEBUG-YES = 'Y' THEN                                      05180099
       STRING "AT NOT-A-SELECT....", MSGBLK                      05190099
          DELIMITED BY MSGLEN INTO MSGERR                        05200099
       WRITE MSGREC FROM MSGERR.                                 05210099
                                                                 05220099
    EXEC SQL                                                     05230099
       EXECUTE SLCT-CSR-STMT USING DESCRIPTOR :SQLDA             05240099
    END-EXEC.                                                    05250099
                                                                 05260099
    PERFORM PRINT-ROWS.                                          05270099
                                                                 05280099
    GO TO IND-RESULT.                                            05290099
                                                                 05300099
IMMED-SQL.                                                       05310099
    IF DEBUG-YES = 'Y' THEN                                      05320099
       STRING "AT IMMED-SQL....", MSGBLK                         05330099
          DELIMITED BY MSGLEN INTO MSGERR                        05340099
       WRITE MSGREC FROM MSGERR.                                 05350099
                                                                 05360099
   EXEC SQL                                                      05370099
      EXECUTE IMMEDIATE :SLCT-STMT                               05380099
   END-EXEC.                                                     05390099
                                                                 05400099
PRINT-ROWS.                                                      05410099
    MOVE SQLERRD(3) TO MSGNUM                                    05420099
    DISPLAY " "                                                  05430099
    DISPLAY "***** NUMBER OF ROWS AFFECTED BY REQUEST=" MSGNUM   05440099
                                                      " *****"   05450099
    DISPLAY " "                                                  05451099
    IF DEBUG-YES = 'Y' THEN                                      05451199
       STRING "LEAVING PRINT-ROWS....", MSGBLK                   05451299
          DELIMITED BY MSGLEN INTO MSGERR                        05451399
       WRITE MSGREC FROM MSGERR.                                 05451499
                                                                 05451599
DBERROR.                                                         05451699
    IF DEBUG-YES = 'Y' THEN                                      05451799
       STRING "AT DBERROR.....", MSGBLK                          05451899
          DELIMITED BY MSGLEN INTO MSGERR                        05451999
       WRITE MSGREC FROM MSGERR                                  05452099
       MOVE SQLCODE TO MSGNUM                                    05456099
       STRING "SQL ERROR OCCURRED, SQLCODE = ", MSGNUM,          05457099
          MSGBLK DELIMITED BY MSGLEN INTO MSGERR                 05458099
       WRITE MSGREC FROM MSGERR.                                 05459099
                                                                 05460099
    CALL "DSNTIAR" USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN.     05470099
                                                                 05480099
    IF RETURN-CODE = ZERO                                        05490099
       PERFORM ERROR-PRINT VARYING ERROR-INDEX                   05500099
          FROM 1 BY 1 UNTIL ERROR-INDEX GREATER THAN 8           05510099
   
    ELSE                                                         05520099
       IF DEBUG-YES = 'Y' THEN                                   05530099
          STRING "DSNT497I RETURN CODE FROM MSG ROUTINE DSNTIAR",05540099
             MSGBLK DELIMITED BY MSGLEN INTO MSGERR              05550099
       WRITE MSGREC FROM MSGERR                                  05560099
     END-IF                                                      05570099
    END-IF.                                                      05580099
                                                                 05590099
    IF DEBUG-YES = 'Y' THEN                                      05600099
       STRING "LEAVING DBERROR....", MSGBLK                      05610099
             DELIMITED BY MSGLEN INTO MSGERR                     05620099
       WRITE MSGREC FROM MSGERR.                                 05630099
                                                                 05640099
    IF LAST-CMD = "SQL " THEN                                    05650099
       GO TO IND-RESULT                                          05660099
    ELSE                                                         05661099
       GO TO PRINT-ROWS.                                         05662099
                                                                 05663099
ERROR-PRINT.                                                     05664099
    IF DEBUG-YES = 'Y' THEN                                      05665099
       STRING "AT ERROR-PRINT....", MSGBLK                       05666099
             DELIMITED BY MSGLEN INTO MSGERR                     05667099
       WRITE MSGREC FROM MSGERR.                                 05668099
                                                                 05669099
    DISPLAY ERROR-TEXT (ERROR-INDEX).                            05670099
                                                                 05680099
    IF DEBUG-YES = 'Y' THEN                                      05690099
      STRING "LEAVING ERROR-PRINT....", MSGBLK                   05700099
             DELIMITED BY MSGLEN INTO MSGERR                     05710099
      WRITE MSGREC FROM MSGERR.                                  05720099

Sample Link-Edit JCL

Topics:

This JCL sample, XTDCLG, precompiles, compiles, link-edits and executes COBOL2 programs containing dynamic SQL with the Extender for Db2. XTDCLG does the following.

  • Precompiles, compiles, and links program XTDCOB. Program XDTCOB accepts commands from SYSIN DD, either in batch or interactively (CLIST). It can be run in either DSNALI or DSNELI mode.

    The syntax for SYSIN DD is:

    +------------------------------------------+
    |            Available Commands:           |
    |                                          |
    | Prepared SQL statement Syntax:           |
    |  SQL <sql statement>                     |
    |  END                                     |
    |                                          |
    | Execute Immediate Syntax:                |
    |  IMM <sql statement>                     |
    |  END                                     |
    |                                          |
    | Type EXIT to exit this program.          |
    +-----------------------------------------+ 
  • Executes XTDCOB.

To link-edit your JCL, perform the following steps.

  1. Change all instances of qualif, user, db2hlq,dbss, hostn and portn to match your site specifications. See comments in the jcl at qualif.HOME.DATA(XTDCLG).
  2. Copy COBOL source member XTDCOB from qualif.HOME.DATA into your COBOL source library. Make the necessary changes to the SYSIN DD card in the PC step.
  3. Confirm that you have followed the installation instructions for the Extender for Db2 as described in Chapter 2, Installing the Extender for Db2 on z/OS. Verify that you have link-edited the Extender for Db2 main module with your Db2 entry points, if your site has a local Db2 subsystem. If you have properly link-edited the Extender for Db2 main module with your Db2 entry points, the qualif.HOMEEXT.LOAD library referenced in STEPLIB of the RUNSTEP in the XTDCLG JCL should be properly linked to your site's local Db2 subsystem.
  4. Submit the JCL. The output of the SQL request is found in SYSOUT.

Note: If an application only processes servers (no local Db2 access), it is not necessary to bind and grant the customer application plan. The server default plan (dynamic plan) is used instead.

XTDCLG

//*        Job Card Goes Here                                           
//*                                                                     
//* Note: DSNELI could be used instead, DSNALI was used      *
//*       arbitrarily.                                       *
//*                                                          *
//*Substitutions:                                            *
//*  qualif - High level qualifier for DB2 Extender datasets *
//*  db2hlq - High level qualifier for DB2 libraries.        *
//*  user   - High level qualifier for user libraries.       *
//*  dbss   - DB2 Subsytem name.                             *
//*  hostn  - Server's Host name or Server's IP address.     *
//*  portn  - TCP/IP Port number server is listening on.     *
//************************************************************   
//         SET DB2REL=db2hlq
//************************************************************
//*                 PC XDTCOB                                 
//************************************************************
//PC       EXEC  PGM=DSNHPC,
//         PARM='HOST(COB2),QUOTE,APOSTSQL,ATTACH(CAF)'
//STEPLIB  DD  DISP=SHR,DSN=&DB2REL..SDSNEXIT
//         DD  DISP=SHR,DSN=&DB2REL..SDSNLOAD
//SYSIN    DD  DISP=SHR,DSN=user.COBOL.SOURCE(XTDCOB)
//DBRMLIB  DD  DISP=SHR,DSN=user.DBRMLIB.DATA(XTDCOB)
//SYSCIN   DD  DSN=&&DSNHOUT,DISP=(MOD,PASS),UNIT=SYSDA,
//         SPACE=(800,(500,500))
//SYSPRINT DD  SYSOUT=*
//SYSTERM  DD  SYSOUT=*
//SYSUT1   DD  UNIT=SYSDA,SPACE=(800,(500,500),,,ROUND)
//SYSUT2   DD  UNIT=SYSDA,SPACE=(800,(500,500),,,ROUND)
//SYSUT3   DD  UNIT=SYSDA,SPACE=(800,(500,500),,,ROUND)
//SYSUT4   DD  UNIT=SYSDA,SPACE=(800,(500,500),,,ROUND)
//SYSUT5   DD  UNIT=SYSDA,SPACE=(800,(500,500),,,ROUND)
//*********************************************************
//*           C O M P I L E
//*********************************************************
//COB      EXEC  PGM=IGYCRCTL,COND=(4,LT),
//         PARM='QUOTE,OBJECT,MAP,LIST,RENT,NODYNAM'
//SYSIN    DD  DSN=&&DSNHOUT,DISP=(OLD,DELETE)
//SYSLIN   DD  DSN=&&LOADSET,DISP=(MOD,PASS),UNIT=SYSDA,
//         SPACE=(800,(500,500))
//SYSPRINT DD  SYSOUT=*
//SYSUT1   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT6   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7   DD  UNIT=SYSDA,SPACE=(CYL,(1,1))
//********************************************************
//*               LINKEDIT STEP FOR XTDCOB
//********************************************************
//LKEDXTD  EXEC  PGM=IEWL,PARM='XREF',COND=(4,LT)
//SYSLIB   DD  DISP=SHR,DSN=qualif.HOMEEXT.LOAD
//         DD  DISP=SHR,DSN=&DB2REL..SDSNLOAD
//         DD  DISP=SHR,DSN=CEE.SCEELKED
//SYSLMOD  DD  DISP=SHR,DSN=user.COBOL.LOAD
//OBJECT   DD  DSN=&&LOADSET,DISP=(OLD,DELETE,DELETE)
//SYSPRINT DD  SYSOUT=*
//SYSUT1   DD  UNIT=SYSDA,SPACE=(CYL,(10,5))
//SYSLIN   DD  *
  INCLUDE  SYSLIB(DSNALI)
  INCLUDE  SYSLIB(DSNTIAR)
  INCLUDE  OBJECT
  MODE     AMODE(31),RMODE(ANY)
  ENTRY    XTDCOB
  NAME     XTDCOB(R)
/*
//****************************************************
//*               BIND STEP FOR XTDCOB
//* (only required to use DB2 directly (NATIVELY))
//****************************************************
//BIND      EXEC   PGM=IKJEFT01,DYNAMNBR=20,COND=(4,LT)
//STEPLIB   DD DSN=&DB2REL..SDSNLOAD,DISP=SHR
//SYSPRINT  DD SYSOUT=*
//SYSTSPRT  DD SYSOUT=*
//DBRMLIB  DD  DISP=SHR,DSN=user.DBRMLIB.DATA(XTDCOB)
//SYSTSIN   DD *
DSN SYSTEM(dbss)
BIND PLAN      (XTDCOB)   -
     MEMBER    (XTDCOB)   -
     LIBRARY   ('user.DBRMLIB.DATA') -
     ACTION    (REPLACE) -
     ISOLATION (CS) -
     ACQUIRE   (USE) -
     RELEASE   (COMMIT) -
     EXPLAIN   (YES)
END
/*
//****************************************************
//*               GRANT STEP FOR XTDCOB
//* (only required to use DB2 directly (NATIVELY))
//****************************************************
//GRANT     EXEC   PGM=IKJEFT01,DYNAMNBR=20,COND=(4,LT)
//STEPLIB   DD DSN=&DB2REL..SDSNLOAD,DISP=SHR
//SYSPRINT  DD SYSOUT=*
//SYSTSPRT  DD SYSOUT=*
//SYSTSIN   DD *
RUN PROGRAM (DSNTIAD) PLAN (DSNTIA81) -
    LIB ('DSN810.RUNLIB.LOAD')
END
/*
//SYSIN     DD *
          GRANT EXECUTE ON PLAN XTDCOB TO PUBLIC;
/*
//********************************************************************
//*             RUN STEP for XTDCOB
//********************************************************************
//RUNXTD   EXEC PGM=XTDCOB,COND=((4,LT),EVEN)
//STEPLIB   DD  DISP=SHR,DSN=user.COBOL.LOAD
//          DD  DISP=SHR,DSN=qualif.HOMEEXT.LOAD
//          DD  DISP=SHR,DSN=qualif.HOME.LOAD
//          DD  DISP=SHR,DSN=&DB2REL..SDSNEXIT
//          DD  DISP=SHR,DSN=&DB2REL..SDSNLOAD
//EDACS3    DD  *                                                  
NAME        = Client Odin File                                 
NODE = EDASERVE                                                     
  BEGIN                                                             
    PROTOCOL  = TCP                                                 
    CLASS     = CLIENT                                              
    HOST      = hostn    ;Server's Host name or IP address          
    PORT      = portn    ;Port # server is listening on             
;   TRACE     = 31                                                  
  END                                                               
/*                                                                  
//EDAENV    DD  *                 
FSTRACE=DD:FSTRACE                 
EDACONF=/PDS                       
/*                                 
//EDADPDS   DD  DUMMY                                      
//*EDAPARMS DD  DISP=SHR,DSN=user.EDAPARMS
//IBITRACE  DD  *                                                 
SET TRACEON=ALL  
/*                                          
//FSTRACE   DD  SYSOUT=*,DCB=(LRECL=132,RECFM=FB,BLKSIZE=132)   
//SYSOUT    DD  SYSOUT=*
//DBGOUT    DD  SYSOUT=*
//XTDPRM    DD  *
DEBUG=N,BATCH=Y
/*
//SYSIN     DD  *
SQL                                                                    
SELECT COUNTRY,CAR,MODEL,BODYTYPE FROM EDASERVE.ANYNAME.CAR            
END                                                                    
SQL                                                                    
SELECT LAST_NAME,FIRST_NAME FROM EDASERVE.ANYNAME.EMPLOYEE             
END                                                                    
EXIT                                                                   
/*

WebFOCUS

Feedback