Version 1

An example of a converted from ZOS/DB2 to GnuCOBOL/DB2 program

This is the Murach CUSTINQ program with just enough code added to make it work with GnuCOBOL and IBM DB2 LUW.

Breakdown of Changes.

   IDENTIFICATION DIVISION.
  *
   PROGRAM-ID.    CUSTINQ.
  *
   ENVIRONMENT DIVISION.
  *
   INPUT-OUTPUT SECTION.
  *
   FILE-CONTROL.
  *
   DATA DIVISION.
  *
   FILE SECTION.
  *
   WORKING-STORAGE SECTION.
  *
   01  SWITCHES.
  *
       05  END-OF-INQUIRIES-SW     PIC X   VALUE 'N'.
           88  END-OF-INQUIRIES            VALUE 'Y'.
       05  CUSTOMER-FOUND-SW       PIC X.
           88  CUSTOMER-FOUND              VALUE 'Y'.
       EXEC SQL
           INCLUDE SQLCA
       END-EXEC.
  *
  ***** Convert to GnuCOBOL
  ***** Start of Step 1
  *     No DCLGEN member to INCLUDE
  *     Comment this INCLUDE out
  *    EXEC SQL
  *        INCLUDE CUSTOMER
  *    END-EXEC.
  *
  *     Add DECLARE TABLE
       EXEC SQL
       DECLARE CUSTOMERS TABLE
       (
        CUSTNO        CHAR(6) not null,
           FNAME         CHAR(20) not null,
           LNAME         CHAR(30) not null,
           ADDR          CHAR(30) not null,
           CITY          CHAR(20) not null,
           STATE         CHAR(2) not null,
           ZIPCODE       CHAR(10) not null)
       END-EXEC.

  *     Add DECLARE SECTION
       EXEC SQL BEGIN DECLARE SECTION END-EXEC.
   01  Customer-Row.
       12 CUSTNO     PIC X(06).
       12 FNAME      PIC X(20).
       12 LNAME      PIC X(30).
       12 ADDR       PIC X(30).
       12 CITY       PIC X(20).
       12 STATE      PIC X(02).
       12 ZIPCODE    PIC X(10).

  *    This is hardcoded for the MURACH DB.
  *    You might need to update this for your DB.
   01  DB-Connection-Info.
       12 DB-Alias                PIC X(8) VALUE 'MURACH'.
       12 DB-User-ID              PIC X(10).
       12 DB-Password.
          15 DB-Passwd-Length     PIC S9(4) COMP-5  VALUE 0.
          15 DB-Passwd-Name       PIC X(18).
       EXEC SQL END DECLARE SECTION END-EXEC.

  *     Add status check for connection info.
   01  WS-SQL-STATUS                PIC S9(9) COMP-5.
       88 SQL-STATUS-OK             VALUE    0.
       88 SQL-STATUS-NOT-FOUND      VALUE  100.
       88 SQL-STATUS-DUP            VALUE -803.

  ***** End of Step 1

   PROCEDURE DIVISION.
  *
   000-DISPLAY-CUSTOMER-ROWS.
  *     Step 2
  *     Add Paragraph to connect to the DB
       PERFORM 9800-Connect-to-DB1.
  *
       PERFORM 100-DISPLAY-CUSTOMER-ROW
           UNTIL END-OF-INQUIRIES.
       STOP RUN.
  *
   100-DISPLAY-CUSTOMER-ROW.
  *
       PERFORM 110-ACCEPT-CUSTOMER-NUMBER.
       IF NOT END-OF-INQUIRIES
           MOVE 'Y' TO CUSTOMER-FOUND-SW
           PERFORM 120-GET-CUSTOMER-ROW
           IF CUSTOMER-FOUND
               PERFORM 130-DISPLAY-CUSTOMER-LINES
           ELSE
               PERFORM 140-DISPLAY-ERROR-LINES.
  *
   110-ACCEPT-CUSTOMER-NUMBER.
  *
       DISPLAY '------------------------------------------------'.
       DISPLAY 'KEY IN THE NEXT CUSTOMER NUMBER AND PRESS ENTER,'.
       DISPLAY 'OR KEY IN 999999 AND PRESS ENTER TO QUIT.'.
       ACCEPT CUSTNO.
       IF CUSTNO = '999999'
           MOVE 'Y' TO END-OF-INQUIRIES-SW.
  *
   120-GET-CUSTOMER-ROW.
  *
       EXEC SQL
           SELECT CUSTNO,    FNAME,       LNAME,
                  ADDR,      CITY,        STATE,
                  ZIPCODE
           INTO  :CUSTNO,       :FNAME,          :LNAME,
                 :ADDR,         :CITY,           :STATE,
                 :ZIPCODE
           FROM   CUSTOMERS
               WHERE  CUSTNO = :CUSTNO
       END-EXEC.
  *
       IF SQLCODE NOT = 0
           MOVE 'N' TO CUSTOMER-FOUND-SW.
  *
   130-DISPLAY-CUSTOMER-LINES.
  *
       DISPLAY '------------------------------------------------'.
       DISPLAY '   CUSTOMER ' CUSTNO.
       DISPLAY '   NAME     ' FNAME ' ' LNAME.
       DISPLAY '   ADDRESS  ' ADDR.
       DISPLAY '            ' CITY ' ' STATE ' '
                              ZIPCODE.
  *
   140-DISPLAY-ERROR-LINES.
  *
       DISPLAY '------------------------------------------------'.
       DISPLAY '   CUSTOMER NUMBER ' CUSTNO ' NOT FOUND.'.
  *
  *     Step 2 - the actual connection.
   9800-Connect-to-DB1.
       PERFORM 9810-Setup-DB1-Connection.
       IF SQL-STATUS-OK
          CONTINUE
       ELSE
          DISPLAY "*** The DB connection is not valid!***"
          DISPLAY "Exiting the program.!"
          GOBACK
       END-IF.

   9810-Setup-DB1-Connection.
       PERFORM 9811-Get-Credentials.
       PERFORM 9812-Create-Connection-To-DB1.

   9811-Get-Credentials.
       DISPLAY "CUSTINQ: Need userid and password".

       DISPLAY "Enter your user id (default none): "
            WITH NO ADVANCING.
       ACCEPT DB-User-ID.

       DISPLAY "Enter your password : " WITH NO ADVANCING
       ACCEPT DB-Passwd-Name.

  * Passwords in a CONNECT statement must be entered in a VARCHAR
  * format with the length of the input string.
       INSPECT DB-Passwd-Name
          TALLYING DB-Passwd-Length
          FOR CHARACTERS BEFORE INITIAL " ".

   9812-Create-Connection-To-DB1.
       PERFORM 9814-Connect-To-DB1
       IF SQL-STATUS-OK
          CONTINUE
       ELSE
          DISPLAY "CUSTINQ: userid and/or password invalid"
          DISPLAY "CUSTINQ: Can not connect, exiting"
          GOBACK
       END-IF.

   9814-Connect-To-DB1.
       EXEC SQL CONNECT TO :DB-Alias
            USER :DB-User-ID
            USING :DB-Passwd-Name
          END-EXEC.
       MOVE SQLCODE TO WS-SQL-STATUS.