Method 4 example

The following example uses prepare and fetch with dynamic parameter markers and SQL descriptors.

exec sql begin declare section end-exec.
     01 COLTYPE      IS GLOBAL PIC S9(9) COMP.
      01 INDEX-COLCNT IS GLOBAL PIC S9(9) COMP.
      01 INT-BUFF     IS GLOBAL PIC S9(9) COMP.
      01 CHAR-BUFF    IS GLOBAL PIC X(255).
      01 MISC-BUFF    IS GLOBAL PIC X(255).
      01 TYPE         IS GLOBAL PIC X(255).
      01 TITLE        IS GLOBAL PIC X(255).
      01 COLNAME      IS GLOBAL PIC X(255).
      01 SALES        IS GLOBAL PIC S9(9) COMP.
      01 DESCNT       IS GLOBAL PIC S9(9) COMP.
      01 OCCUR        IS GLOBAL PIC S9(9) COMP.
      01 CNT          IS GLOBAL PIC S9(9) COMP.
      01 CONDCNT      IS GLOBAL PIC S9(9) COMP.
      01 DIAG-CNT     IS GLOBAL PIC S9(9) COMP.
      01 NUM-MSGS     IS GLOBAL PIC S9(9) COMP.
      01 USER-ID      IS GLOBAL PIC X(30).
      01 PASS         IS GLOBAL PIC X(30).
      01 SERVER-NAME  IS GLOBAL PIC X(30).
      01 STR1         IS GLOBAL PIC X(1024).
      01 STR2         IS GLOBAL PIC X(1024).
      01 STR3         IS GLOBAL PIC X(1024).
      01 STR4         IS GLOBAL PIC X(1024).
 exec sql end declare section end-exec.
...
PROCEDURE DIVISION.
  P0.
DISPLAY "Dynamic sql Method 4".
 DISPLAY "Enter in a Select statement to retrieve
 any kind "
 DISPLAY "of information from the pubs database:".
 accept str4.
 DISPLAY "Enter in the larger of the columns to be "
 DISPLAY "retrieved or the number "
 DISPLAY "of ? in the SQL statement:".
 ACCEPT occur.
exec sql prepare S4 from :str4 end-exec
exec sql declare c2 cursor for s4 end-exec
exec sql describe input s4 using sql descriptor dinout end-exec 
     call "filldesc". 
exec sql open c2 using sql descriptor dinout 
 end-exec
PERFORM UNTIL SQLCODE = 100 OR SQLCODE < 0
exec sql fetch c2 into sql descriptor dinout end-exec
PERFORM "prtdesc".
 END-PERFORM.
exec sql close c2 end-exec
exec sql deallocate descriptor dinout end-exec
exec sql deallocate prepare s4 end-exec
DISPLAY "Dynamic SQL Method 4 completed".
     goback.
END PROGRAM dyn-m4.
IDENTIFICATION DIVISION.
 PROGRAM-ID. prtdesc is common.
 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 SOURCE-COMPUTER. xyz.
 OBJECT-COMPUTER. xyz.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
P0.
exec sql get descriptor dinout :descnt = count 
 end-exec
DISPLAY "Column name Column data".
DISPLAY "----------- --------------------------"
DISPLAY "---------------".
PERFORM VARYING CNT FROM 1 BY 1 UNTIL cnt > descnt
* get each column attribute 
 exec sql get descriptor dinout 
    VALUE :index-colcnt :coltype = TYPE end-exec
         IF coltype = 1
* character type
exec sql get descriptor dinout VALUE :index-colcnt
    :colname = NAME, :char-buff = data end-exec
DISPLAY colname char-buff.
ELSE IF coltype = 4
 * integer type
exec sql get descriptor dinout
 VALUE :index-colcnt :colname = NAME, :int-buff = DATA end-exec
DISPLAY colname int-buff.
     else
* other types
 exec sql get descriptor dinout
 VALUE :index-colcnt
 :colname = NAME, :misc-buff = DATA end-exec
DISPLAY colname misc-buff
    end-perform.
     goback.
 END PROGRAM prtdesc.
...
PROCEDURE DIVISION.
 P0.
exec sql get descriptor dinout :descnt = count
 end-exec
     PERFORM varying cnt from 1 by 1 UNTIL cnt >
     descnt
     DISPLAY "Enter in the data type of the " cnt " 
     ?".
     accept &coltype.
     IF coltype = 1
 * character type
          DISPLAY "Enter in the value of the data:".
        ACCEPT char-buff.
         exec sql set descriptor dinout
                 VALUE :cnt TYPE = 1,
                 LENGTH = 255, DATA = :char-buff
  end-exec    
        ELSE IF coltype = 4
  * integer type
          DISPLAY "Enter in the value of the data:".
          ACCEPT int-buff.
          exec sql set descriptor dinout 
                 VALUE :cnt TYPE = :coltype, 
                 DATA = :int-buff END-EXEC    
         ELSE
         DISPLAY "non-supported column type.".
         END-IF.
         END-PERFORM
     GOBACK
    END PROGRAM filldesc.
 ...