home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 May / PCWorld_1999-05_cd.bin / software / Vyzkuste / inprise / INTRBASE_55 / EXAMPLES / API / DYN4.E < prev    next >
Text File  |  1998-10-18  |  3KB  |  149 lines

  1. /*
  2.  *  Program type:   Embedded Dynamic SQL
  3.  *
  4.  *  Description:
  5.  *        This program updates departments' budgets, given
  6.  *        the department and the new budget information parameters.
  7.  *
  8.  *        An input SQLDA is allocated for the update query
  9.  *        with parameter markers.
  10.  */
  11.  
  12. #include "example.h"
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. int get_input PROTO((char *dept_no, double *percent));
  17.  
  18. static char *Dept_data[] =
  19.     {"622", "100", "116", "900", 0};
  20.  
  21. static double Percent_data[] =
  22.     {0.05,  1.00,  0.075,  0.10, 0};
  23.  
  24. int    Input_ptr = 0;
  25. char Db_name[128];
  26.  
  27. EXEC SQL
  28.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  29.  
  30. char *upd_str =
  31.     "UPDATE department SET budget = ? * budget + budget WHERE dept_no = ?";
  32.  
  33.  
  34. int main(ARG(int, argc), ARG(char **, argv))
  35. ARGLIST(int argc)
  36. ARGLIST(char **argv)
  37. {
  38.     BASED_ON department.dept_no    dept_no;
  39.     double    percent_inc;
  40.     short    nullind = 0;
  41.     XSQLDA    *sqlda;
  42.  
  43.         if (argc > 1)
  44.                 strcpy(Db_name, argv[1]);
  45.         else
  46.                 strcpy(Db_name, "employee.gdb");
  47.  
  48.  
  49.     EXEC SQL
  50.         WHENEVER SQLERROR GO TO Error;
  51.  
  52.     EXEC SQL
  53.         CONNECT empdb;
  54.  
  55.     EXEC SQL
  56.         SET TRANSACTION USING empdb;
  57.  
  58.     /* Allocate an input SQLDA.  There are two unknown parameters. */
  59.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(2));
  60.     sqlda->sqln = 2;
  61.     sqlda->sqld = 2;
  62.     sqlda->version = 1;
  63.  
  64.     /* Prepare the query. */
  65.     EXEC SQL
  66.         PREPARE q FROM :upd_str;
  67.  
  68.     /* Prepare the input sqlda, only data and indicator to set */
  69.  
  70.     EXEC SQL 
  71.         DESCRIBE INPUT q USING SQL DESCRIPTOR sqlda;
  72.  
  73.     sqlda->sqlvar[0].sqldata = (char *) &percent_inc;
  74.     sqlda->sqlvar[0].sqlind = &nullind;
  75.  
  76.     sqlda->sqlvar[1].sqldata = dept_no;
  77.     /* FOrce the type to char instead of varchar */
  78.     sqlda->sqlvar[1].sqltype = SQL_TEXT +1;
  79.     sqlda->sqlvar[1].sqlind = &nullind;
  80.  
  81.     /* Expect an error, trap it */
  82.     EXEC SQL WHENEVER SQLERROR CONTINUE;
  83.  
  84.     /*
  85.      *    Get the next department-percent increase input pair.
  86.      */
  87.     while (get_input(dept_no, &percent_inc))
  88.     {
  89.         printf("\nIncreasing budget for department:  %s  by %5.2f percent.\n",
  90.                 dept_no, percent_inc);
  91.  
  92.  
  93.         /* Update the budget. */
  94.         EXEC SQL
  95.             EXECUTE q USING SQL DESCRIPTOR sqlda;
  96.  
  97.         /* Don't save the update, if the new budget exceeds 
  98.         ** the limit. Detect an integrity violation 
  99.         */
  100.         if (SQLCODE == -625) 
  101.         {
  102.             printf("\tExceeded budget limit -- not updated.\n");
  103.             continue;
  104.         }
  105.         /* Undo all changes, in case of an error. */
  106.         else if (SQLCODE)
  107.             goto Error;
  108.  
  109.         /* Save each department's update independently. */
  110.         EXEC SQL
  111.             COMMIT RETAIN;
  112.     }
  113.  
  114.     EXEC SQL
  115.         COMMIT RELEASE;
  116.     return (0);
  117. Error:
  118.     isc_print_status(gds__status);
  119.     printf("SQLCODE=%d\n", SQLCODE);
  120.  
  121.     EXEC SQL
  122.         ROLLBACK RELEASE;
  123.  
  124.     EXEC SQL
  125.         DISCONNECT empdb;
  126.  
  127.     free( sqlda);
  128.     return(1);
  129. }
  130.  
  131.  
  132. /*
  133.  *    Get the department and percent parameters.
  134.  */
  135. int get_input(ARG(char *, dept_no), ARG(double *, percent))
  136. ARGLIST(char    *dept_no)
  137. ARGLIST(double    *percent)
  138. {
  139.     if (Dept_data[Input_ptr] == 0)
  140.         return 0;
  141.  
  142.     strcpy(dept_no, Dept_data[Input_ptr]);
  143.  
  144.     if ((*percent = Percent_data[Input_ptr++]) == 0)
  145.         return 0;
  146.  
  147.     return(1);
  148. }
  149.