Quantcast
Channel: IBM Mainframe Computers Forums
Viewing all articles
Browse latest Browse all 9405

DB2 :: RE: Need help on SQL Dynamic WHERE Clause

$
0
0
Author: prino
Posted: Wed Jul 20, 2016 6:18 am (GMT 5.5)

That's why there is dynamic SQL!

And how you translate the PL/I code posted here to that sissy language you're using, that's up to you:

Code:
1/**********************************************************************
 * XXXX - Working storage                                              *
 **********************************************************************/
 DCL 1 XXXX_WORK,
       2 EYE_CATCH06          CHAR         (16) INIT ('XXXX WORK06'),
       2 DYNAM                CHAR       (8192) VAR,
       2 EYE_CATCH99          CHAR         (16) INIT ('XXXX WORK99');

1/**********************************************************************
 * XXXX - DB2 cursors                                                  *
 **********************************************************************/
 EXEC SQL
   DECLARE SUMMARY CURSOR FOR XXXX_1_STMT;

 /**********************************************************************
 * XXXX - Retrieve data from database (or not)                         *
 **********************************************************************/
 CALL BUILD_XXXX_QUEUES();

1/**********************************************************************
 * BUILD_XXXX_QUEUES:                                                  *
 *                                                                     *
 * This procedure builds a temporary storage queue with the data       *
 * retrieved from the database.                                        *
 *                                                                     *
 * If XXXX is entered through non-standard means, ie not from the      *
 * normal selection screen, the calling program should                 *
 *                                                                     *
 *  - set the non_edx indicator to '1'b                                *
 *  - store the required UMR & TR in the pass fields in the comarea    *
 **********************************************************************/
 BUILD_XXXX_QUEUES: PROC;
 DYNAM = 'SELECT '                  ||
           'P1.RISK_UMR, '          ||
           'P1.TRAN_REF, '          ||
           'P1.TRAD_PTR_ID, '       ||
           'CLSG_SET_CCY, '         ||
           'RSKT_NET_PSTG_AMT, '    ||
           'CLSG_SET_DTED, '        ||
           'PAY_STUS, '             ||
           'FST_TRANSM_DTE, '       ||
           'TRANSM_DTE, '           ||
           'TBK_STUS, '             ||
           'TBK_DTE, '              ||
           'LIMRES_STUS, '          ||
           'LIMRES_DTE, '           ||
           'ACCT_NO, '              ||
           'TTRN_CODE, '            ||
           'MSG_FWDCHN_UMR,'        ||
           'IPOS_SND_PAY_IND, '     ||
           'IPOS_SPSET_IND, '       ||
           'MSG_PAY_OS_IND, '       ||
           'PST_ACCEPT_REF, '       ||
           'IPOS_SET_DTED, '        ||
           'P1.UPD_CNT, '           ||
           'M1.UPD_CNT, '           ||
           'MSG_TIME_STAMP, '       ||
           'MOD_UW_REF, '           ||
           'RISK_DIVN_IDENT, '      ||
           'TYR_CODE, '             ||
           'RISK_ROOT_NO, '         ||
           'PRM_RISK_SUFFIX, '      ||
           'PRM_TRANS_SEQ, '        ||
           'IPOS_NO, '              ||
           'TRACKING_IND ';

 DYNAM = DYNAM ||
         'FROM '                    ||
            SQLID || 'VPYPOST P1, ' ||
            SQLID || 'VPYMSG M1 ';

 DYNAM = DYNAM  ||
         'WHERE ' ||
           'P1.RISK_UMR    = M1.RISK_UMR AND ' ||
           'P1.TRAN_REF    = M1.TRAN_REF AND ' ||
           'TOPR_LEGAL_ENT = ''' || XXXX_WORK.TOPR_LEGAL_ENT || ''' ';

 IF COM_DATA.TRAD_PTR_ID ^= '' THEN
   DYNAM = DYNAM ||
           'AND P1.TRAD_PTR_ID  = ''' || COM_DATA.TRAD_PTR_ID || ''' ';

 SELECT;
   WHEN (COM_DATA.POSTCODE = ' ');

   WHEN (INDEX(COM_DATA.POSTCODE, ' ') ^= 0 |
         INDEX(COM_DATA.POSTCODE, '%') ^= 0 |
         INDEX(COM_DATA.POSTCODE, '_') ^= 0)
     DO;
       DYNAM = DYNAM ||
               'AND TOPR_DIVCODE = ''' ||
                SUBSTR(COM_DATA.POSTCODE, 1, 2) || ''' ';

       IF SUBSTR(COM_DATA.POSTCODE, 3, 3) ^= ' ' THEN
         DO;
           DYNAM = DYNAM ||
                   'AND TOPR_CODE LIKE ''';

           DO #I = 3 TO LENGTH(COM_DATA.POSTCODE);
             SELECT (SUBSTR(COM_DATA.POSTCODE, #I, 1));
               WHEN (' ') DYNAM = DYNAM || '_';
               OTHER      DYNAM = DYNAM ||
                                  SUBSTR(COM_DATA.POSTCODE, #I, 1);
             END;
           END;

           DYNAM = DYNAM || ''' ';
         END;
     END;

   OTHER
     DYNAM = DYNAM ||
             'AND  TOPR_DIVCODE || TOPR_CODE = ''' ||
                                   COM_DATA.POSTCODE || ''' ';
 END;

 SELECT;
   WHEN (NON_EDX |
         LTSE_TREATY);

   WHEN (FROM_CLOSURE)
     DO;
       DYNAM = DYNAM ||
               'AND CLSG_SET_CCY = ''' || CLSG_SET_ISO || ''' ';

       DYNAM = DYNAM ||
               'AND CLSG_SET_DTED = ''' ||
               SUBSTR(COM_DATA.CLSG_SET_DTED, 1, 2) || '.' ||
               SUBSTR(COM_DATA.CLSG_SET_DTED, 3, 2) || '.' ||
               SUBSTR(COM_DATA.CLSG_SET_DTED, 5, 4) || ''' ';

       DYNAM = DYNAM ||
               'AND CLSG_UW_ACCT_REF = ''' ||
                COM_DATA.UW_ACCT_REF || ''' ';
     END;

   WHEN (COM_DATA.HELD_ITEMS ^= '')
     DO;
       DYNAM = DYNAM ||
               'AND PAY_STUS = ''H'' ';

       CALL ADD_DATES('FST_TRANSM_DTE');
     END;

   WHEN (COM_DATA.OVERNIGHT ^= '')
     DYNAM = DYNAM ||
             'AND PAY_STUS = ''S'' ';

   OTHER
     CALL FULL_SELECT();
 END;

 DYNAM = DYNAM  ||
         'AND M1.MSG_TIME_STAMP = '                 ||
              '(SELECT MAX(MSG_TIME_STAMP) '        ||
                 'FROM '                            ||
                    SQLID || 'VPYMSG MC '           ||
                 'WHERE '                           ||
                       'P1.RISK_UMR = MC.RISK_UMR ' ||
                   'AND P1.TRAN_REF = MC.TRAN_REF) ';

 DYNAM = DYNAM                 ||
         'ORDER BY '           ||
           'RISK_DIVN_IDENT, ' ||
           'TYR_CODE, '        ||
           'RISK_ROOT_NO, '    ||
           'PRM_RISK_SUFFIX, ' ||
           'PRM_TRANS_SEQ, '   ||
           'IPOS_NO, '         ||
           'P1.TRAN_REF';

 EXEC SQL
   PREPARE
     XXXX_1_STMT
   FROM
     :DYNAM;
 $$NON_00000;

 EXEC SQL
   OPEN SUMMARY;
 $$NON_00000;


 CALL FETCH_SUMMARY();
 DO WHILE(SQLSTATE = '00000');
   DATA_FOUND = '1'B;
   CALL STORE_DATA_IN_QUEUE();
   CALL FETCH_SUMMARY();
 END;
 $$NON_02000;

 EXEC SQL
   CLOSE SUMMARY;
 $$NON_00000;


_________________
Robert AH Prins
robert.ah.prins @ the.17+Gb.Google thingy
No programming here (yet) icon_smile.gif


Viewing all articles
Browse latest Browse all 9405

Trending Articles