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

  1. /*
  2.  *  Program type:   Embedded Static SQL
  3.  *
  4.  *    Description:
  5.  *        This program demonstrates 'set transaction' statements
  6.  *        with the three isolation options:
  7.  *
  8.  *            - snapshot
  9.  *            - read committed
  10.  *            - shapshot table stability.
  11.  */
  12.  
  13. #include "example.h"
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <stdio.h>
  17.  
  18. EXEC SQL
  19.     BEGIN DECLARE SECTION;
  20.  
  21. long *t1;
  22. long *t2;
  23. long *t3;
  24. char Db_name[128];
  25.  
  26. EXEC SQL
  27.     SET DATABASE empdb = COMPILETIME "employee.gdb" RUNTIME :Db_name;
  28.  
  29. long        cust_no;
  30. long        tot;
  31. char    ord_stat[8];
  32.  
  33. EXEC SQL
  34.     END DECLARE SECTION;
  35.  
  36.  
  37.  
  38. int main(ARG(int, argc), ARG(char **, argv))
  39. ARGLIST(int argc)
  40. ARGLIST(char **argv)
  41. {
  42.  
  43.     if (argc > 1)
  44.         strcpy (Db_name, argv[1]);
  45.     else
  46.         strcpy (Db_name, "employee.gdb");
  47.     /* Connect to the database. */
  48.  
  49.     EXEC SQL 
  50.         WHENEVER SQLERROR GOTO :err;
  51.     EXEC SQL
  52.         CONNECT empdb;
  53.  
  54.     /*
  55.      *    Start a transaction with SNAPSHOT isolation option.
  56.      *    This transaction wants to see a stable, unchanging view
  57.      *    of the sales orders, while it computes the totals.
  58.      *    Name the transaction t1.
  59.      */
  60.  
  61.     printf("Starting a transaction with SNAPSHOT isolation option.\n\n");
  62.  
  63.     EXEC SQL
  64.         SET TRANSACTION NAME t1 READ WRITE SNAPSHOT;
  65.  
  66.     EXEC SQL
  67.         DECLARE s CURSOR FOR
  68.         SELECT cust_no, SUM(qty_ordered)
  69.         FROM sales GROUP BY cust_no;
  70.  
  71.     EXEC SQL
  72.         OPEN TRANSACTION t1 s;
  73.     EXEC SQL
  74.         FETCH s INTO :cust_no, :tot;        /* get the first row only */
  75.     if (!SQLCODE)
  76.         printf("\tCustomer: %ld    Quantity Ordered: %ld\n\n", cust_no, tot);
  77.     EXEC SQL
  78.         CLOSE s;
  79.  
  80.     EXEC SQL
  81.         COMMIT TRANSACTION t1;
  82.  
  83.  
  84.     /*
  85.      *    Start a transaction with READ COMMITTED isolation option.
  86.      *    This transaction wants to see changes for the order status
  87.      *    as they come in.
  88.      *    Name the transaction t2.
  89.      */
  90.  
  91.     printf("Starting a transaction with READ COMMITTED isolation option.\n\n");
  92.  
  93.     EXEC SQL
  94.         SET TRANSACTION NAME t2 READ WRITE READ COMMITTED;
  95.  
  96.     EXEC SQL
  97.         DECLARE c CURSOR FOR
  98.         SELECT cust_no, order_status
  99.         FROM sales
  100.         WHERE order_status IN ("open", "shipping");
  101.  
  102.     EXEC SQL
  103.         OPEN TRANSACTION t2 c;
  104.     EXEC SQL
  105.         FETCH c INTO :cust_no, :ord_stat;    /* get the first row only */
  106.     if (!SQLCODE)
  107.         printf("\tCustomer number: %ld   Status: %s\n\n", cust_no, ord_stat);
  108.         
  109.     EXEC SQL
  110.         CLOSE c;
  111.  
  112.     EXEC SQL
  113.         COMMIT TRANSACTION t2;
  114.  
  115.  
  116.     /*
  117.      *    Start a transaction with SNAPSHOT TABLE STABILITY isolation
  118.      *    option.  This transaction wants to lock out all other users
  119.      *    from making any changes to the customer table, while it goes
  120.      *    through and updates customer status.
  121.      *    Name the transaction t3.
  122.      */
  123.  
  124.     printf("Starting a transaction with SNAPSHOT TABLE STABILITY.\n\n");
  125.  
  126.     EXEC SQL
  127.         SET TRANSACTION NAME t3 READ WRITE SNAPSHOT TABLE STABILITY;
  128.  
  129.     EXEC SQL
  130.         DECLARE h CURSOR FOR
  131.         SELECT cust_no
  132.         FROM customer
  133.         WHERE on_hold = '*'
  134.         FOR UPDATE OF on_hold;
  135.  
  136.     EXEC SQL
  137.         OPEN TRANSACTION t3 h;
  138.     EXEC SQL
  139.         FETCH h INTO :cust_no;                /* get the first row only */
  140.     if (!SQLCODE)
  141.         printf("\tCustomer on hold: %ld\n\n", cust_no);
  142.         
  143.     EXEC SQL
  144.         CLOSE h;
  145.  
  146.     EXEC SQL
  147.         COMMIT TRANSACTION t3;
  148.  
  149.  
  150.     EXEC SQL
  151.         DISCONNECT empdb;
  152. return (0);
  153. err:
  154.     isc_print_status(isc_status);
  155.     return 1;
  156. }
  157.  
  158.