home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / interb / InterBase_WI-V6.0-server.exe / server / examples / gpre / dyn4.e < prev    next >
Text File  |  2000-06-23  |  4KB  |  168 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.  * The contents of this file are subject to the Interbase Public
  11.  * License Version 1.0 (the "License"); you may not use this file
  12.  * except in compliance with the License. You may obtain a copy
  13.  * of the License at http://www.Interbase.com/IPL/
  14.  *
  15.  * Software distributed under the License is distributed on an
  16.  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  17.  * or implied. See the License for the specific language governing
  18.  * rights and limitations under the License.
  19.  *
  20.  * The Original Code was created by Interbase Software Corporation
  21.  * and its successors. Portions created by Borland/Inprise are
  22.  * Copyright (C) 1992-1998 and 1999-2000 Borland/Inprise. Portions
  23.  * created by InterBase Software Corporation are Copyright (C)
  24.  * 1998-1999 InterBase Software Corporation.
  25.  *
  26.  * Copyright (C) 2000 InterBase Software Corporation
  27.  * All Rights Reserved.
  28.  * Contributor(s): ______________________________________.
  29.  */
  30.  
  31. #include "example.h"
  32. #include <stdlib.h>
  33. #include <string.h>
  34.  
  35. int get_input (char *dept_no, double *percent);
  36.  
  37. static char *Dept_data[] =
  38.     {"622", "100", "116", "900", 0};
  39.  
  40. static double Percent_data[] =
  41.     {0.05,  1.00,  0.075,  0.10, 0};
  42.  
  43. int    Input_ptr = 0;
  44. char Db_name[128];
  45.  
  46. EXEC SQL
  47.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  48.  
  49. char *upd_str =
  50.     "UPDATE department SET budget = ? * budget + budget WHERE dept_no = ?";
  51.  
  52.  
  53. int main(ARG(int, argc), ARG(char **, argv))
  54. ARGLIST(int argc)
  55. ARGLIST(char **argv)
  56. {
  57.     BASED_ON department.dept_no    dept_no;
  58.     double    percent_inc;
  59.     short    nullind = 0;
  60.     XSQLDA    *sqlda;
  61.  
  62.         if (argc > 1)
  63.                 strcpy(Db_name, argv[1]);
  64.         else
  65.                 strcpy(Db_name, "employee.gdb");
  66.  
  67.  
  68.     EXEC SQL
  69.         WHENEVER SQLERROR GO TO Error;
  70.  
  71.     EXEC SQL
  72.         CONNECT empdb;
  73.  
  74.     EXEC SQL
  75.         SET TRANSACTION USING empdb;
  76.  
  77.     /* Allocate an input SQLDA.  There are two unknown parameters. */
  78.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(2));
  79.     sqlda->sqln = 2;
  80.     sqlda->sqld = 2;
  81.     sqlda->version = 1;
  82.  
  83.     /* Prepare the query. */
  84.     EXEC SQL
  85.         PREPARE q FROM :upd_str;
  86.  
  87.     /* Prepare the input sqlda, only data and indicator to set */
  88.  
  89.     EXEC SQL 
  90.         DESCRIBE INPUT q USING SQL DESCRIPTOR sqlda;
  91.  
  92.     sqlda->sqlvar[0].sqldata = (char *) &percent_inc;
  93.     sqlda->sqlvar[0].sqlind = &nullind;
  94.  
  95.     sqlda->sqlvar[1].sqldata = dept_no;
  96.     /* FOrce the type to char instead of varchar */
  97.     sqlda->sqlvar[1].sqltype = SQL_TEXT +1;
  98.     sqlda->sqlvar[1].sqlind = &nullind;
  99.  
  100.     /* Expect an error, trap it */
  101.     EXEC SQL WHENEVER SQLERROR CONTINUE;
  102.  
  103.     /*
  104.      *    Get the next department-percent increase input pair.
  105.      */
  106.     while (get_input(dept_no, &percent_inc))
  107.     {
  108.         printf("\nIncreasing budget for department:  %s  by %5.2f percent.\n",
  109.                 dept_no, percent_inc);
  110.  
  111.  
  112.         /* Update the budget. */
  113.         EXEC SQL
  114.             EXECUTE q USING SQL DESCRIPTOR sqlda;
  115.  
  116.         /* Don't save the update, if the new budget exceeds 
  117.         ** the limit. Detect an integrity violation 
  118.         */
  119.         if (SQLCODE == -625) 
  120.         {
  121.             printf("\tExceeded budget limit -- not updated.\n");
  122.             continue;
  123.         }
  124.         /* Undo all changes, in case of an error. */
  125.         else if (SQLCODE)
  126.             goto Error;
  127.  
  128.         /* Save each department's update independently. */
  129.         EXEC SQL
  130.             COMMIT RETAIN;
  131.     }
  132.  
  133.     EXEC SQL
  134.         COMMIT RELEASE;
  135.     return (0);
  136. Error:
  137.     isc_print_status(gds__status);
  138.     printf("SQLCODE=%d\n", SQLCODE);
  139.  
  140.     EXEC SQL
  141.         ROLLBACK RELEASE;
  142.  
  143.     EXEC SQL
  144.         DISCONNECT empdb;
  145.  
  146.     free( sqlda);
  147.     return(1);
  148. }
  149.  
  150.  
  151. /*
  152.  *    Get the department and percent parameters.
  153.  */
  154. int get_input(ARG(char *, dept_no), ARG(double *, percent))
  155. ARGLIST(char    *dept_no)
  156. ARGLIST(double    *percent)
  157. {
  158.     if (Dept_data[Input_ptr] == 0)
  159.         return 0;
  160.  
  161.     strcpy(dept_no, Dept_data[Input_ptr]);
  162.  
  163.     if ((*percent = Percent_data[Input_ptr++]) == 0)
  164.         return 0;
  165.  
  166.     return(1);
  167. }
  168.