Dynamic SQL
Dynamic SQL
In most general case, in which you do not know in advance about the SQL
statements that will execute, the program typically takes these steps:
4. Handle any errors that might result. The requirements are the same as
those for static SQL statements. The return code from the most
recently executed SQL statement appears in the host variables SQLCODE
and SQLSTATE or corresponding fields of the SQLCA.
< Read a non-SELECT SQL statement into the host variable DSTRING.>
EXEC SQL
EXECUTE IMMEDIATE :DSTRING
END-EXEC.
For example, let the variable :DSTRING have the value "DELETE FROM
DSN8410.EMP WHERE EMPNO = ?". To prepare an SQL statement from that
string and assign it the name S1, write
The prepared statement still contains a parameter marker, for which you
must supply a value when the statement executes. After the statement is
prepared, the table name is fixed, but the parameter marker allows you to
execute the same statement many times with different values of the
employee number.
1. Include an SQLCA
Dynamic SELECT statements cannot use INTO; hence, you must use a cursor to
put the results into host variables. In declaring the cursor, use the
statement name (call it STMT), and give the cursor itself a name (for
example, C1):
If STMT contains parameter markers, then you must use the USING clause of
OPEN to provide values for all of the parameter markers in STMT. If there
are four parameter markers in STMT, you need:
8. Handle any resulting errors. This step is the same as for static SQL,
except for the number and types of errors that can result.
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
003400 WORKING-STORAGE SECTION.
00003400
003500 COPY DFHAID.
00003500
003600 COPY DFHBMSCA.
00003600
003700 COPY BMSATTR.
00003700
003800 COPY VSDW03B.
00003800
003810 COPY EIRECCMD.
00003810
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
004000 01 WS-VARS.
00004000
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
010982 2120-SET-WS-MVF7.
00010982
010983 INITIALIZE SQLSTR1-TEXT, WHERE-COND, ORDER-BY, GROUP-BY.
00010983
010984 MOVE 1 TO SQLSTR1-LEN.
00010984
010985 PERFORM 2121-BUILD-WHERE-COND.
00010985
010986 PERFORM 2121-MOVE-SRTFLDS.
00010986
010987 PERFORM 2121-BUILD-ORDER-BY.
00010987
010988 PERFORM 2121-BUILD-GROUP-BY.
00010988
010989 STRING SQL1 DELIMITED BY SIZE
00010989
010990 SQL-WHERE DELIMITED BY ';'
00010990
010991 INTO SQLSTR1-TEXT
00010991
010992 WITH POINTER SQLSTR1-LEN
00010992
011000 END-STRING.
00011000
011146 SUBTRACT 1 FROM SQLSTR1-LEN.
00011146
011147
00011147
011148 EXEC SQL PREPARE SQLSTMT1 FROM :SQLSTR1 END-EXEC.
00011148
011149 EXEC SQL OPEN C1 END-EXEC.
00011149
011150 EXEC SQL FETCH C1 INTO :WS-ROW-COUNT END-EXEC.
00011150
011151 EXEC SQL CLOSE C1 END-EXEC.
00011151
011152
00011152
011153 IF WS-ROW-COUNT IS ZERO
00011153
011154 MOVE 'N' TO WS-MVF7
00011154
011155 ELSE
00011155
011156 MOVE 'Y' TO WS-MVF7
00011156
011157 END-IF.
00011157
011158
00011158
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
016102 2121-BUILD-WHERE-COND.
00016102
016103 STRING CND1 DELIMITED BY SIZE
00016103
016104 QUOTES DELIMITED BY SIZE
00016104
016105 M3LOCI DELIMITED BY SIZE
00016105
016106 QUOTES DELIMITED BY SIZE
00016106
016107 CND2 DELIMITED BY SIZE
00016107
016108 QUOTES DELIMITED BY SIZE
00016108
016109 M3VESI DELIMITED BY SIZE
00016109
016110 QUOTES DELIMITED BY SIZE
00016110
016111 ';' DELIMITED BY SIZE
00016111
016112 INTO WHERE-COND
00016112
016113 END-STRING.
00016113
016114 IF M3DELI NOT = SPACES AND LOW-VALUES AND '_'
00016114
016115 STRING WHERE-COND DELIMITED BY ';'
00016115
016116 CND3 DELIMITED BY SIZE
00016116
016117 QUOTES DELIMITED BY SIZE
00016117
016118 M3DELI DELIMITED BY SIZE
00016118
016119 QUOTES DELIMITED BY SIZE
00016119
016120 ';' DELIMITED BY SIZE
00016120
016121 INTO WHERE-COND
00016121
016122 END-STRING
00016122
016123 END-IF.
00016123
016124 IF M3CMPI NOT = SPACES AND LOW-VALUES AND '_'
00016124
016125 STRING WHERE-COND DELIMITED BY ';'
00016125
016126 CND4 DELIMITED BY SIZE
00016126
016127 QUOTES DELIMITED BY SIZE
00016127
016128 M3CMPI DELIMITED BY SIZE
00016128
016129 QUOTES DELIMITED BY SIZE
00016129
016130 ';' DELIMITED BY SIZE
00016130
016131 INTO WHERE-COND
00016131
016132 END-STRING
00016132
016133 END-IF.
00016133
016134 IF M3BOOKI NOT = SPACES AND LOW-VALUES AND '__________'
00016134
016135 STRING WHERE-COND DELIMITED BY ';'
00016135
016136 CND5 DELIMITED BY SIZE
00016136
016137 QUOTES DELIMITED BY SIZE
00016137
016138 M3BOOKI DELIMITED BY SIZE
00016138
016139 QUOTES DELIMITED BY SIZE
00016139
016140 ';' DELIMITED BY SIZE
00016140
016141 INTO WHERE-COND
00016141
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
061400 2121-MOVE-SRTFLDS.
00061400
061410 MOVE M3SRT1I TO WS-SRT-VAL.
00061410
061500 EVALUATE TRUE
00061500
061600 WHEN WS-HSRT
00061600
061700 MOVE 'STOW_STAT_C' TO SQL3-HSRT
00061700
061800 WHEN WS-VSRT
00061800
061900 MOVE 'STOW_STAT_C' TO SQL3-VSRT
00061900
062000 END-EVALUATE.
00062000
062010 MOVE M3SRT2I TO WS-SRT-VAL.
00062010
062100 EVALUATE TRUE
00062100
062200 WHEN WS-HSRT
00062200
062300 MOVE 'EQP_TRAN_C' TO SQL3-HSRT
00062300
062400 WHEN WS-VSRT
00062400
062500 MOVE 'EQP_TRAN_C' TO SQL3-VSRT
00062500
062600 END-EVALUATE.
00062600
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
065200 2121-BUILD-ORDER-BY.
00065200
065300 STRING SQL3-HSRT DELIMITED BY SIZE
00065300
065400 ',' DELIMITED BY SIZE
00065400
065500 SQL3-VSRT DELIMITED BY SIZE
00065500
065600 ';' DELIMITED BY SIZE
00065600
065700 INTO ORDER-BY
00065700
065800 END-STRING.
00065800
065900 2121-BUILD-GROUP-BY.
00065900
066000 STRING SQL3-HSRT DELIMITED BY SIZE
00066000
066100 ',' DELIMITED BY SIZE
00066100
066200 SQL3-VSRT DELIMITED BY SIZE
00066200
066300 ';' DELIMITED BY SIZE
00066300
066400 INTO GROUP-BY
00066400
066500 END-STRING.
00066500
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
010769 2100-RECAP-REPORT.
00010769
010770 INITIALIZE SQLSTR3-TEXT.
00010770
010771 MOVE 1 TO SQLSTR3-LEN.
00010771
010772 STRING SQL3 DELIMITED BY SIZE
00010772
010773 SQL-WHERE DELIMITED BY ';'
00010773
010774 SQL-GROUP DELIMITED BY ';'
00010774
010775 INTO SQLSTR3-TEXT
00010775
010776 WITH POINTER SQLSTR3-LEN
00010776
010777 END-STRING.
00010777
010778 SUBTRACT 1 FROM SQLSTR3-LEN.
00010778
010779 EXEC SQL PREPARE SQLSTMT3 FROM :SQLSTR3 END-EXEC.
00010779
010780 PERFORM 2110-POP-TSQ-R THRU
00010780
010781 2110-POP-TSQ-R-EXIT.
00010781
010782* MOVE SQLSTR3 TO WK-SQLSTR.
00010782
010783 PERFORM 2110-XCTL-TO-VSDWEC05.
00010783
010784
00010784
010785 2110-POP-TSQ-R.
00010785
010786 STRING EIBTRMID DELIMITED BY SIZE
00010786
010787 EIBTRNID DELIMITED BY SIZE
00010787
010788 INTO WK-TSQ
00010788
010789 END-STRING.
00010789
010790 EXEC CICS
00010790
010791 IGNORE CONDITION QIDERR
00010791
010792 END-EXEC.
00010792
010793 EXEC CICS
00010793
010794 DELETEQ TS QUEUE (WK-TSQ)
00010794
010795 END-EXEC.
00010795
010796 EXEC CICS
00010796
010797 HANDLE CONDITION
00010797
010798 QIDERR (9000-QIDERR)
00010798
010799 END-EXEC.
00010799
010800 EXEC SQL
00010800
010801 OPEN C3
00010801
010802 END-EXEC.
00010802
010803 MOVE 0 TO WS-QREC-CNT.
00010803
010804 PERFORM 2111-FETCH-C3.
00010804
010805 PERFORM UNTIL SQLCODE NOT = 0
00010805
010806 ADD 1 TO WS-QREC-CNT
00010806
010807 EXEC CICS
00010807
010808 WRITEQ TS QUEUE (WK-TSQ)
00010808
010809 FROM (WS-RECAP-QUE-REC)
00010809
010810 LENGTH (LENGTH OF WS-RECAP-QUE-REC)
00010810
010811 END-EXEC
00010811
010812 PERFORM 2111-FETCH-C3
00010812
010813 END-PERFORM.
00010813
010814 EXEC SQL
00010814
010815 CLOSE C3
00010815
010816 END-EXEC.
00010816
010817
00010817
010818 2110-POP-TSQ-R-EXIT.
00010818
010819 EXIT.
00010819
010820
00010820
010821 2111-FETCH-C3.
00010821
010822 EXEC SQL FETCH C3 INTO
00010822
010823 :TSQ-R-HDAT, :TSQ-R-VDAT, :TSQ-R-EQPCNT
00010823
010824 END-EXEC.
00010824
010825
00010825
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
-----oooOooo-----