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.
...