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

  1. /*
  2.  *    Program type:    Embedded Dynamic SQL
  3.  *
  4.  *    Description:
  5.  *        This program adds several departments with small default
  6.  *        budgets, using 'execute immediate' statement.
  7.  *        Then, a prepared statement, which doubles budgets for
  8.  *        departments with low budgets, is executed.
  9.  */
  10.  
  11. #include "example.h"
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #define    MAXLEN        256
  16.  
  17. int get_line PROTO((char *line));
  18. void clean_up PROTO((void));
  19.  
  20. static char *Dept_data[] =
  21. {
  22.     "117", "Field Office: Hong Kong",   "110",
  23.     "118", "Field Office: Australia",   "110",
  24.     "119", "Field Office: New Zealand", "110",
  25.     0
  26. };
  27. int Dept_ptr = 0;
  28. char Db_name[128];
  29.  
  30. EXEC SQL 
  31.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  32.  
  33.  
  34. int main(ARG(int, argc), ARG(char **, argv))
  35. ARGLIST(int argc)
  36. ARGLIST(char **argv)
  37. {
  38.     BASED_ON department.department    dept_name;
  39.     BASED_ON department.dept_no        dept_id;
  40.     char    exec_str[MAXLEN], prep_str[MAXLEN];
  41.  
  42.     if (argc > 1)
  43.         strcpy(Db_name, argv[1]);
  44.     else
  45.         strcpy(Db_name, "employee.gdb");
  46.  
  47.     EXEC SQL
  48.         WHENEVER SQLERROR GO TO MainError;
  49.  
  50.     EXEC SQL
  51.         CONNECT empdb;
  52.  
  53.     clean_up();
  54.  
  55.  
  56.     EXEC SQL
  57.         SET TRANSACTION;
  58.  
  59.     /*
  60.      *    Prepare a statement, which may be executed more than once.
  61.      */
  62.     strcpy(prep_str,
  63.         "UPDATE DEPARTMENT SET budget = budget * 2 WHERE budget < 100000");
  64.  
  65.     EXEC SQL
  66.         PREPARE double_small_budget FROM :prep_str;
  67.  
  68.     /*
  69.      *  Add new departments, using 'execute immediate'.
  70.      *  Build each 'insert' statement, using the supplied parameters.
  71.      *  Since these statements will not be needed after they are executed,
  72.      *  use 'execute immediate'.
  73.      */
  74.  
  75.  
  76.     while (get_line(exec_str))
  77.     {
  78.         printf("\nExecuting statement:\n\t%s;\n", exec_str);
  79.  
  80.         EXEC SQL
  81.             EXECUTE IMMEDIATE :exec_str;
  82.     }
  83.  
  84.     EXEC SQL
  85.         COMMIT RETAIN;
  86.  
  87.     /*
  88.      *    Execute a previously prepared statement.
  89.      */
  90.     printf("\nExecuting a prepared statement:\n\t%s;\n\n", prep_str);
  91.  
  92.     EXEC SQL
  93.         EXECUTE double_small_budget;
  94.  
  95.     EXEC SQL
  96.         COMMIT;
  97.  
  98.     EXEC SQL
  99.         DISCONNECT empdb;
  100.  
  101.     exit(0);
  102.  
  103. MainError:
  104.     EXEC SQL
  105.         WHENEVER SQLERROR CONTINUE;
  106.  
  107.     isc_print_status(gds__status);
  108.     printf("SQLCODE=%d\n", SQLCODE);
  109.     EXEC SQL ROLLBACK;
  110.      
  111.         exit(1);
  112.  
  113. }
  114.  
  115.  
  116. /*
  117.  *  Construct an 'insert' statement from the supplied parameters.
  118.  */
  119. int get_line(ARG(char *, line))
  120. ARGLIST(char    *line)
  121. {
  122.     if (Dept_data[Dept_ptr] == 0)
  123.         return 0;
  124.     if (Dept_data[Dept_ptr + 1] == 0)
  125.         return 0;
  126.     if (Dept_data[Dept_ptr + 2] == 0)
  127.         return 0;
  128.  
  129.     sprintf(line, "INSERT INTO DEPARTMENT (dept_no, department, head_dept) \
  130.                VALUES ('%s', '%s', '%s')", Dept_data[Dept_ptr],
  131.                Dept_data[Dept_ptr + 1], Dept_data[Dept_ptr + 2]);
  132.     Dept_ptr += 3;
  133.  
  134.     return(1);
  135. }
  136.  
  137.  
  138. /*
  139.  *    Delete old data.
  140.  */
  141. void clean_up PROTO((void))
  142. {
  143.     EXEC SQL WHENEVER SQLERROR GO TO CleanErr;
  144.  
  145.     EXEC SQL SET TRANSACTION;
  146.  
  147.     EXEC SQL EXECUTE IMMEDIATE
  148.         "DELETE FROM department WHERE dept_no IN ('117', '118', '119')";
  149.  
  150.     EXEC SQL COMMIT;
  151.     return;
  152.  
  153. CleanErr:
  154.  
  155.     isc_print_status(gds__status);
  156.     printf("SQLCODE=%d\n", SQLCODE);
  157.     exit(1);
  158. }
  159.