DSN8ED5

Demonstrates how to call the sample SQL procedure DSN8.

 /********************************************************************* 00010000
 * Module name = DSN8ED5 (DB2 sample program)                         * 00020000
 *                                                                    * 00030000
 * DESCRIPTIVE NAME = Client for sample SQL Procedure DSN8.DSN8ES2    * 00040000
 *                                                                    * 00050000
 *                                                                    * 00060000
 *    LICENSED MATERIALS - PROPERTY OF IBM                            * 00070000
 *    5675-DB2                                                        * 00080000
 *    (C) COPYRIGHT 1999, 2000 IBM CORP. ALL RIGHTS RESERVED.         * 00100000
 *                                                                    * 00130000
 *    STATUS = VERSION 7                                              * 00140000
 *                                                                    * 00170000
 * Function: Demonstrates how to call the sample SQL procedure        * 00230000
 *           DSN8.DSN8ES2 using static SQL.                           * 00240000
 *                                                                    * 00250000
 * Notes:                                                             * 00260000
 *   Dependencies: Requires IBM C/C++ for OS/390 V1R3 or higher       * 00270000
 *                                                                    * 00280000
 *   Restrictions:                                                    * 00290000
 *                                                                    * 00300000
 * Module type: C program                                             * 00310000
 *   Processor: IBM C/C++ for OS/390 V1R3 or higher                   * 00320000
 * Module size: See linkedit output                                   * 00330000
 *  Attributes: Re-entrant and re-usable                              * 00340000
 *                                                                    * 00350000
 * Entry Point: DSN8ED5                                               * 00360000
 *     Purpose: See Function                                          * 00370000
 *     Linkage: Standard MVS program invocation, one parameter.       * 00380000
 *                                                                    * 00390000
 *                                                                    * 00400000
 *  Parameters: DSN8ED5 uses the C "main" argument convention of      * 00410000
 *              argv (argument vector) and argc (argument count).     * 00420000
 *                                                                    * 00430000
 *              - ARGV[0]: (input) pointer to a char[9],              * 00440000
 *                         null-terminated string having the name of  * 00450000
 *                         this program (DSN8ED5)                     * 00460000
 *              - ARGV[1]: (input) pointer to a char[10],             * 00470000
 *                         null-terminated string that contains the   * 00480000
 *                         amount of the base bonus for sample        * 00490000
 *                         managers.  The format is: nnnnnn.nn        * 00500000
 *              - ARGV[2]: (input) pointer to a char[17],             * 00510000
 *                         null-terminated string having the name of  * 00520000
 *                         the server where DSN8.DSN8ES2 resides.     * 00530000
 *                         This is an optional parameter; the local   * 00540000
 *                         server is used if no argument is provided. * 00550000
 *                                                                    * 00560000
 * Normal Exit: Return Code: 0000                                     * 00570000
 *              - Message: none                                       * 00580000
 *                                                                    * 00590000
 *  Error Exit: Return Code: 0008                                     * 00600000
 *              - Message: DSN8ED5 failed: Invalid parameter count    * 00610000
 *              - Message: DSN8ED5 failed: Argument to parameter 1    * 00620000
 *                                         exceeds 9 bytes            * 00630000
 *              - Message: DSN8ED5 failed: No result from DSN8.DSN8ES2* 00640000
 *              - Message: <formatted SQL text from DSNTIAR>          * 00650000
 *                                                                    * 00660000
 *                                                                    * 00670000
 *    External References:                                            * 00680000
 *             - Routines/Services: DSNTIAR: DB2 msg text formatter   * 00690000
 *             - Data areas       : None                              * 00700000
 *             - Control blocks   : None                              * 00710000
 *                                                                    * 00720000
 *  Pseudocode:                                                       * 00730000
 *   DSN8ED5:                                                         * 00740000
 *   - Verify that 2 or 3 input parameters (program name, base bonus  * 00750000
 *     amount and, optionally, remote location name) were passed.     * 00760000
 *     - if not, issue diagnostic message and end with code 0008      * 00770000
 *   - Connect to the remote location, if one was specified           * 00780000
 *   - Call sample SQL Procedure DSN8.DSN8ES2, passing the base bonus * 00790000
 *     amount as the argument of the first (input) parameter.         * 00800000
 *     - if unsuccessful, call sql_error to issue a diagnostic mes-   * 00810000
 *       sage, then end with code 0008.                               * 00820000
 *   - Report the value returned by DSN8.DSN8ES2 in its second        * 00830000
 *     (output) parameter.                                            * 00840000
 *   End DSN8ED5                                                      * 00850000
 *                                                                    * 00860000
 *   sql_error:                                                       * 00870000
 *   - call DSNTIAR to format the unexpected SQLCODE.                 * 00880000
 *   End sql_error                                                    * 00890000
 *                                                                    * 00900000
 *********************************************************************/ 00910000
 /********************** C library definitions ***********************/ 00920000
 #include <stdio.h>                                                     00930000
 #include <stdlib.h>                                                    00940000
 #include <string.h>                                                    00950000
 #include <decimal.h>                                                   00960000
                                                                        00970000
 /***************************** Equates ******************************/ 00980000
 #define         NULLCHAR     '\0'     /* Null character             */ 00990000
                                                                        01000000
 #define         OUTLEN        80      /* Length of output line      */ 01010000
 #define         DATA_DIM      10      /* Number of message lines    */ 01020000
                                                                        01030000
 #define         NOT_OK         0      /* Run status indicator: Error*/ 01040000
 #define         OK             1      /* Run status indicator: Good */ 01050000
                                                                        01060000
                                                                        01070000
 /******************** DB2 SQL Communication Area ********************/ 01080000
 EXEC SQL INCLUDE SQLCA;                                                01090000
                                                                        01100000
                                                                        01110000
 /************************ DB2 Host Variables ************************/ 01120000
 EXEC SQL BEGIN DECLARE SECTION;                                        01130000
   char          locationName[17];     /* Server location name       */ 01140000
                                                                        01150000
   decimal(15,2) hvBonusBase     = 0;  /* base bonus for managers    */ 01160000
   short int     niBonusBase     = 0;  /* Indic var for hvBonusBase  */ 01170000
                                                                        01180000
   decimal(15,2) hvBonuses       = 0;  /* tot bonuses rtnd by DSN8ES2*/ 01190000
   short int     niBonuses       = 0;  /* Indic var for hvBonuses    */ 01200000
                                                                        01210000
   long int      hvSqlErrCd      = 0;  /* Err SQLCODE from DSN8ES2   */ 01220000
   short int     niSqlErrCd      = 0;  /* Indic var for hvSqlErrCd   */ 01230000
                                                                        01240000
 EXEC SQL END DECLARE SECTION;                                          01250000
                                                                        01260000
                                                                        01270000
 /********************** DB2 Message Formatter ***********************/ 01280000
 struct          error_struct          /* DSNTIAR message structure  */ 01290000
 {                                                                      01300000
   short int     error_len;                                             01310000
   char          error_text[DATA_DIM][OUTLEN];                          01320000
 }               error_message = {DATA_DIM * (OUTLEN)};                 01330000
                                                                        01340000
 #pragma         linkage( dsntiar, OS )                                 01350000
                                                                        01360000
 extern short int dsntiar( struct      sqlca         *sqlca,            01370000
                           struct      error_struct  *msg,              01380000
                           int                       *len );            01390000
                                                                        01400000
                                                                        01410000
 /********************* DSN8ED5 Global Variables *********************/ 01420000
 short int       status = OK;          /* DSN8ED5 run status         */ 01430000
                                                                        01440000
 long int        completion_code = 0;  /* DSN8ED5 return code        */ 01450000
                                                                        01460000
                                                                        01470000
 /******************** DSN8ED5 Function Prototypes *******************/ 01480000
 int main( int argc, char *argv[] );                                    01490000
 void sql_error( char locmsg[] );                                       01500000
                                                                        01510000
                                                                        01520000
 int main( int argc, char *argv[] )                                     01530000
 /********************************************************************* 01540000
 * Get input parms, pass them to DSN8ES2, and process the results     * 01550000
 *********************************************************************/ 01560000
 {                                                                      01570000
   printf( "**** DSN8ED5: Sample client for DB2 SQL Procedure Sample "  01580000
                         "(DSN8.DSN8ES2)\n\n" );                        01590000
   printf( "*\n" );                                                     01600000
                                                                        01610000
   if( argc < 2  ||  argc > 3 )                                         01620000
     {                                                                  01630000
       printf( "DSN8ED5 failed: Invalid parameter count\n" );           01640000
       status = NOT_OK;                                                 01650000
     }                                                                  01660000
   else if( strlen(argv[1]) > 9 )                                       01670000
     {                                                                  01680000
       printf( "DSN8ED5 failed: Bonus base exceeds 9 bytes.  "          01690000
                               "Use format: nnnnnn.nn\n" );             01700000
       status = NOT_OK;                                                 01710000
     }                                                                  01720000
   else                                                                 01730000
     { /* Convert the input parameter from a string to a decimal */     01740000
       hvBonusBase = atof( argv[1] );                                   01750000
     }                                                                  01760000
                                                                        01770000
   /******************************************************************* 01780000
   * Validate remote location name, if one is specified               * 01790000
   *******************************************************************/ 01800000
   if( argc == 3  &&  status == OK )                                    01810000
     if( strlen( argv[2] ) < 1  ||  strlen( argv[2] ) > 16 )            01820000
       {                                                                01830000
         printf( "DSN8ED5 failed: Length of location name must be "     01840000
                                 "1 to 16 bytes\n" );                   01850000
         status = NOT_OK;                                               01860000
       }                                                                01870000
     else                                                               01880000
       {                                                                01890000
         strcpy( locationName,argv[2] );                                01900000
         printf( "* Processing at location: %s\n",locationName );       01910000
         printf( "*\n" );                                               01920000
       }                                                                01930000
   else                                                                 01940000
     locationName[0] = NULLCHAR;                                        01950000
                                                                        01960000
   if( status == OK )                                                   01970000
     {                                                                  01980000
       printf( "* Base bonus amount: %D(15,2)\n",hvBonusBase );         01990000
       printf( "*\n" );                                                 02000000
     }                                                                  02010000
                                                                        02020000
   /******************************************************************* 02030000
   * Connect to the remote location, if one was specified             * 02040000
   *******************************************************************/ 02050000
   if( strlen(locationName) > 0  &&  status == OK )                     02060000
     {                                                                  02070000
       EXEC SQL CONNECT TO :locationName;                               02080000
       if( SQLCODE != 0 )                                               02090000
         sql_error( " *** Connect to remote server" );                  02100000
     }                                                                  02110000
                                                                        02120000
   /******************************************************************* 02130000
   * Process the call to DSN8.DSN8ES2                                 * 02140000
   *******************************************************************/ 02150000
   if( status == OK )                                                   02160000
     {                                                                  02170000
       EXEC SQL CALL DSN8.DSN8ES2( :hvBonusBase :niBonusBase,           02180000
                                   :hvBonuses   :niBonuses,             02190000
                                   :hvSqlErrCd  :niSqlErrCd );          02200000
       if( SQLCODE != 0 )                                               02210000
         sql_error( " *** Call DSN8.DSN8ES2" );                         02220000
       else if( niSqlErrCd == 0 )                                       02230000
         {                                                              02240000
           printf( "DSN8ED5 failed: Error SQLCODE from DSN8.DSN8ES2 "   02250000
                                   "is %i\n", hvSqlErrCd );             02260000
           status = NOT_OK;                                             02270000
         }                                                              02280000
       else if( niBonuses != 0 )                                        02290000
         {                                                              02300000
           printf( "DSN8ED5 failed: No result from DSN8.DSN8ES2\n" );   02310000
           status = NOT_OK;                                             02320000
         }                                                              02330000
       else                                                             02340000
         {                                                              02350000
           printf( "* Total bonuses paid to management: $%D(15,2)\n",   02360000
                   hvBonuses );                                         02370000
         }                                                              02380000
     }                                                                  02390000
                                                                        02400000
   if( status != OK )                                                   02410000
     completion_code = 8;                                               02420000
                                                                        02430000
   return( completion_code );                                           02440000
                                                                        02450000
 } /* end main */                                                       02460000
                                                                        02470000
                                                                        02480000
 /********************************************************************* 02490000
 ********************************************************************** 02500000
 ** SQL error handler                                                ** 02510000
 ********************************************************************** 02520000
 *********************************************************************/ 02530000
 void sql_error( char locmsg[] )                               /*proc*/ 02540000
 {                                                                      02550000
                                                                        02560000
                                                                        02570000
   short int   rc;                     /* DSNTIAR Return code        */ 02580000
   int         j,k;                    /* Loop control               */ 02590000
   static int  lrecl = OUTLEN;         /* Width of message lines     */ 02600000
                                                                        02610000
   /******************************************************************* 02620000
   * set status to prevent further processing                         * 02630000
   *******************************************************************/ 02640000
   status = NOT_OK;                                                     02650000
                                                                        02660000
   /******************************************************************* 02670000
   * print the locator message                                        * 02680000
   *******************************************************************/ 02690000
   printf( " %.80s\n", locmsg );                                        02700000
                                                                        02710000
   /******************************************************************* 02720000
   * format and print the SQL message                                 * 02730000
   *******************************************************************/ 02740000
   rc = dsntiar( &sqlca, &error_message, &lrecl );                      02750000
   if( rc == 0 )                                                        02760000
     for( j=0; j<DATA_DIM; j++ )                                        02770000
       {                                                                02780000
         for( k=0; k<OUTLEN; k++ )                                      02790000
           putchar(error_message.error_text[j][k] );                    02800000
         putchar('\n');                                                 02810000
       }                                                                02820000
   else                                                                 02830000
     {                                                                  02840000
       printf( " *** ERROR: DSNTIAR could not format the message\n" );  02850000
       printf( " ***        SQLCODE is %d\n",SQLCODE );                 02860000
       printf( " ***        SQLERRM is \n" );                           02870000
       for( j=0; j<sqlca.sqlerrml; j++ )                                02880000
         printf( "%c", sqlca.sqlerrmc[j] );                             02890000
       printf( "\n" );                                                  02900000
     }                                                                  02910000
                                                                        02920000
 } /* end of sql_error */                                               02930000