You are on page 1of 11

DYNAMIC SQL

What an Application Program Using Dynamic SQL Must Do ?

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:

1. Translates the input data, including any parameter markers, into an


SQL statement

2. Prepares the SQL statement to execute and acquires a description of


the result table

3. Obtains, for SELECT statements, enough main storage to contain


retrieved data

4. Executes the statement or fetches the rows of data

5. Processes the information returned

6. Handles SQL return codes.

Dynamic SQL for Non-SELECT Statements

Your program must take the following steps:

1. Include an SQLCA. The requirements for an SQL communications area


(SQLCA) are the same as for static SQL statements.

2. Load the input SQL statement into a data area.

If you attempt to execute an SQL statement dynamically that DB2 does


not allow, you get an SQL error.

3. Execute the statement. You can use either of these methods:

* "Dynamic Execution Using EXECUTE IMMEDIATE"


* "Dynamic Execution Using PREPARE and EXECUTE"

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.

The EXECUTE IMMEDIATE Statement

To execute the statements:

< Read a non-SELECT SQL statement into the host variable DSTRING.>
EXEC SQL
EXECUTE IMMEDIATE :DSTRING
END-EXEC.

DSTRING is a character-string host variable. EXECUTE IMMEDIATE causes the


statement to be prepared and executed immediately.

Dynamic Execution Using PREPARE and EXECUTE


You can think of PREPARE and EXECUTE as an EXECUTE IMMEDIATE done in two
steps. The first step, PREPARE, turns a character string into an SQL
statement, and then assigns it a name of your choosing.

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

EXEC SQL PREPARE S1 FROM :DSTRING END-EXEC.

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.

EXECUTE executes a prepared SQL statement, naming a list of one or more


host variables, or a host structure, that supplies values for all of the
parameter markers.

To execute the prepared statement S1 just once, using a parameter value


contained in the host variable :EMP, write:

EXEC SQL EXECUTE S1 USING :EMP END-EXEC

Fixed-list & Varying-list SELECT Statements

A fixed-list SELECT statement returns rows containing a known number of


values of a known type. When you use one, you know in advance exactly
what kinds of host variables you need to declare in order to store the
results. The contrasting situation, in which you do not know in advance
what host-variable structure you might need is Varying-list SELECT statement.

What Your Application Program Must Do to execute a fixed-list SELECT statement


dynamically ?

your program must:

1. Include an SQLCA

2. Load the input SQL statement into a data area

3. Declare a cursor for the statement name.

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):

EXEC SQL DECLARE C1 CURSOR FOR STMT END-EXEC.

4. Prepare the statement

Prepare a statement (STMT) from DSTRING. Here is one possible PREPARE


statement:

EXEC SQL PREPARE STMT FROM :DSTRING END-EXEC.

5. Open the cursor.


The OPEN statement evaluates the SELECT statement named STMT. For
example:

Without parameter markers: EXEC SQL OPEN C1 END-EXEC.

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:

EXEC SQL OPEN C1 USING :PARM1, :PARM2, :PARM3, :PARM4 END-EXEC.

6. Fetch rows from the result table.

Your program could repeatedly execute a statement such as this:

EXEC SQL FETCH C1 INTO :NAME, :PHONE END-EXEC.

7. Close the cursor.

This step is the same as for static SQL.

EXEC SQL CLOSE C1 END-EXEC.

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.

Sample from a working program

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

003910 EXEC SQL INCLUDE SQLCA END-EXEC.


00003910
003920 EXEC SQL INCLUDE STVEQP END-EXEC.
00003920
003921 EXEC SQL DECLARE SQLSTMT1 STATEMENT END-EXEC.
00003921
003922 EXEC SQL DECLARE SQLSTMT2 STATEMENT END-EXEC.
00003922
003923 EXEC SQL DECLARE SQLSTMT3 STATEMENT END-EXEC.
00003923
003924 EXEC SQL DECLARE C1 CURSOR FOR SQLSTMT1 END-EXEC.
00003924
003925 EXEC SQL DECLARE C2 CURSOR FOR SQLSTMT2 END-EXEC.
00003925
003926 EXEC SQL DECLARE C3 CURSOR FOR SQLSTMT3 END-EXEC.
00003926
003930
00003930
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

004000 01 WS-VARS.
00004000
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

004609 10 WS-SRT-VAL PIC X(1).


00004609
004610 88 WS-HSRT VALUE 'H' '1'.
00004610
004611 88 WS-VSRT VALUE 'V' '2'.
00004611
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

004621 05 WS-POINTER PIC S9(4) COMP.


00004621
004622 05 WS-QREC-CNT PIC S9(8) COMP VALUE 0.
00004622
004624 05 WS-RECAP-QUE-REC.
00004624
004625 10 TSQ-R-HDAT PIC X(8).
00004625
004626 10 TSQ-R-VDAT PIC X(8).
00004626
004627 10 TSQ-R-EQPCNT PIC S9(4) COMP.
00004627
004628
00004628
004629 01 DYNAMIC-SQL.
00004629
004630 05 SQLSTR1.
00004630
004631 49 SQLSTR1-LEN PIC S9(04) COMP.
00004631
004632 49 SQLSTR1-TEXT PIC X(1500).
00004632
004633 05 SQLSTR2.
00004633
004634 49 SQLSTR2-LEN PIC S9(04) COMP.
00004634
004635 49 SQLSTR2-TEXT PIC X(1500).
00004635
004636 05 SQLSTR3.
00004636
004637 49 SQLSTR3-LEN PIC S9(04) COMP.
00004637
004638 49 SQLSTR3-TEXT PIC X(1500).
00004638
004639 05 SQL1 PIC X(33) VALUE
00004639
004640 'SELECT COUNT(*) FROM TEST.STVEQP '.
00004640
004641 05 SQL2 PIC X(147) VALUE
00004641
004642 'SELECT
EQP_I,STOW_STAT_C,EQP_TRAN_C,POL_OPRL_C,POD_OPRL_C00004642
004643-
',NAV_COMP_C,DEL_S,HAZ_IMCO_I,LD_TRAN_I,NEXT_VVD_C,TRIP_DE00004643
004644- 'ST_I,DIR_DEST_I FROM TEST.STVEQP '.
00004644
004645 05 SQL3.
00004645
004646 10 SQL3-SEL PIC X(16) VALUE 'SELECT DISTINCT '.
00004646
004647 10 SQL3-HSRT PIC X(15) VALUE SPACES.
00004647
004648 10 FILLER PIC X(1) VALUE ','.
00004648
004649 10 SQL3-VSRT PIC X(15) VALUE SPACES.
00004649
004650 10 FILLER PIC X(11) VALUE ', COUNT(*) '.
00004650
004651 10 FILLER PIC X(17) VALUE 'FROM TEST.STVEQP '.
00004651
004652
00004652
004653 05 SQL-WHERE.
00004653
004654 10 WHERE-CLAUSE PIC X(7) VALUE ' WHERE '.
00004654
004655 10 WHERE-COND PIC X(1300) VALUE SPACES.
00004655
004656 05 SQL-ORDER.
00004656
004657 10 ORDER-CLAUSE PIC X(10) VALUE ' ORDER BY '.
00004657
004658 10 ORDER-BY PIC X(40) VALUE SPACES.
00004658
004659 05 SQL-GROUP.
00004659
004660 10 GROUP-CLAUSE PIC X(10) VALUE ' GROUP BY '.
00004660
004661 10 GROUP-BY PIC X(40) VALUE SPACES.
00004661
004662 05 CND1 PIC X(08) VALUE 'LOC_I = '.
00004662
004663 05 CND2 PIC X(13) VALUE ' AND VES_I = '.
00004663
004664 05 CND3 PIC X(13) VALUE ' AND DEL_S = '.
00004664
004665 05 CND4 PIC X(18) VALUE ' AND NAV_COMP_C = '.
00004665
004666 05 CND5 PIC X(13) VALUE ' AND BKG_I = '.
00004666
004667 05 CND6 PIC X(18) VALUE ' AND NEXT_VVD_C = '.
00004667
004668 05 CND7 PIC X(21) VALUE ' AND NEXT_OPD_C LIKE '.
00004668
004669 05 CND8 PIC X(21) VALUE ' AND STOW_STAT_C IN ('.
00004669
004670 05 CND9 PIC X(20) VALUE ' AND EQP_TRAN_C IN ('.
00004670
004671 05 CND10 PIC X(16) VALUE 'POL_OPRL_C LIKE '.
00004671
004672 05 CND11 PIC X(11) VALUE 'POL_C LIKE '.
00004672
004673 05 CND12 PIC X(16) VALUE 'POD_OPRL_C LIKE '.
00004673
004674 05 CND13 PIC X(11) VALUE 'POD_C LIKE '.
00004674
004675
00004675
004676 01 MSG-SQLERR.
00004676
004677 05 FILLER PIC X(21) VALUE 'SQL ERROR = '.
00004677
004678 05 MSG-SQLCODE PIC -(7)9.
00004678
004679 05 FILLER PIC X(13) VALUE ' JOB ABENDED.'.
00004679
004680
00004680
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

005800 PROCEDURE DIVISION.


00005800
005900 0000-MAIN-PARA.
00005900
005910 EXEC SQL WHENEVER SQLERROR GO TO 9000-DB-ERR END-EXEC.
00005910
005920 EXEC SQL WHENEVER SQLWARNING GO TO 9000-DB-ERR END-EXEC.
00005920
005930
00005930
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

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

You might also like