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 / stat11.e < prev    next >
Text File  |  2000-06-23  |  4KB  |  177 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.  * The contents of this file are subject to the Interbase Public
  12.  * License Version 1.0 (the "License"); you may not use this file
  13.  * except in compliance with the License. You may obtain a copy
  14.  * of the License at http://www.Interbase.com/IPL/
  15.  *
  16.  * Software distributed under the License is distributed on an
  17.  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  18.  * or implied. See the License for the specific language governing
  19.  * rights and limitations under the License.
  20.  *
  21.  * The Original Code was created by Interbase Software Corporation
  22.  * and its successors. Portions created by Borland/Inprise are
  23.  * Copyright (C) 1992-1998 and 1999-2000 Borland/Inprise. Portions
  24.  * created by InterBase Software Corporation are Copyright (C)
  25.  * 1998-1999 InterBase Software Corporation.
  26.  *
  27.  * Copyright (C) 2000 InterBase Software Corporation
  28.  * All Rights Reserved.
  29.  * Contributor(s): ______________________________________.
  30.  */
  31.  
  32. #include "example.h"
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <stdio.h>
  36.  
  37. EXEC SQL
  38.     BEGIN DECLARE SECTION;
  39.  
  40. long *t1;
  41. long *t2;
  42. long *t3;
  43. char Db_name[128];
  44.  
  45. EXEC SQL
  46.     SET DATABASE empdb = COMPILETIME "employee.gdb" RUNTIME :Db_name;
  47.  
  48. long        cust_no;
  49. long        tot;
  50. char    ord_stat[8];
  51.  
  52. EXEC SQL
  53.     END DECLARE SECTION;
  54.  
  55.  
  56.  
  57. int main(ARG(int, argc), ARG(char **, argv))
  58. ARGLIST(int argc)
  59. ARGLIST(char **argv)
  60. {
  61.  
  62.     if (argc > 1)
  63.         strcpy (Db_name, argv[1]);
  64.     else
  65.         strcpy (Db_name, "employee.gdb");
  66.     /* Connect to the database. */
  67.  
  68.     EXEC SQL 
  69.         WHENEVER SQLERROR GOTO :err;
  70.     EXEC SQL
  71.         CONNECT empdb;
  72.  
  73.     /*
  74.      *    Start a transaction with SNAPSHOT isolation option.
  75.      *    This transaction wants to see a stable, unchanging view
  76.      *    of the sales orders, while it computes the totals.
  77.      *    Name the transaction t1.
  78.      */
  79.  
  80.     printf("Starting a transaction with SNAPSHOT isolation option.\n\n");
  81.  
  82.     EXEC SQL
  83.         SET TRANSACTION NAME t1 READ WRITE SNAPSHOT;
  84.  
  85.     EXEC SQL
  86.         DECLARE s CURSOR FOR
  87.         SELECT cust_no, SUM(qty_ordered)
  88.         FROM sales GROUP BY cust_no;
  89.  
  90.     EXEC SQL
  91.         OPEN TRANSACTION t1 s;
  92.     EXEC SQL
  93.         FETCH s INTO :cust_no, :tot;        /* get the first row only */
  94.     if (!SQLCODE)
  95.         printf("\tCustomer: %ld    Quantity Ordered: %ld\n\n", cust_no, tot);
  96.     EXEC SQL
  97.         CLOSE s;
  98.  
  99.     EXEC SQL
  100.         COMMIT TRANSACTION t1;
  101.  
  102.  
  103.     /*
  104.      *    Start a transaction with READ COMMITTED isolation option.
  105.      *    This transaction wants to see changes for the order status
  106.      *    as they come in.
  107.      *    Name the transaction t2.
  108.      */
  109.  
  110.     printf("Starting a transaction with READ COMMITTED isolation option.\n\n");
  111.  
  112.     EXEC SQL
  113.         SET TRANSACTION NAME t2 READ WRITE READ COMMITTED;
  114.  
  115.     EXEC SQL
  116.         DECLARE c CURSOR FOR
  117.         SELECT cust_no, order_status
  118.         FROM sales
  119.         WHERE order_status IN ("open", "shipping");
  120.  
  121.     EXEC SQL
  122.         OPEN TRANSACTION t2 c;
  123.     EXEC SQL
  124.         FETCH c INTO :cust_no, :ord_stat;    /* get the first row only */
  125.     if (!SQLCODE)
  126.         printf("\tCustomer number: %ld   Status: %s\n\n", cust_no, ord_stat);
  127.         
  128.     EXEC SQL
  129.         CLOSE c;
  130.  
  131.     EXEC SQL
  132.         COMMIT TRANSACTION t2;
  133.  
  134.  
  135.     /*
  136.      *    Start a transaction with SNAPSHOT TABLE STABILITY isolation
  137.      *    option.  This transaction wants to lock out all other users
  138.      *    from making any changes to the customer table, while it goes
  139.      *    through and updates customer status.
  140.      *    Name the transaction t3.
  141.      */
  142.  
  143.     printf("Starting a transaction with SNAPSHOT TABLE STABILITY.\n\n");
  144.  
  145.     EXEC SQL
  146.         SET TRANSACTION NAME t3 READ WRITE SNAPSHOT TABLE STABILITY;
  147.  
  148.     EXEC SQL
  149.         DECLARE h CURSOR FOR
  150.         SELECT cust_no
  151.         FROM customer
  152.         WHERE on_hold = '*'
  153.         FOR UPDATE OF on_hold;
  154.  
  155.     EXEC SQL
  156.         OPEN TRANSACTION t3 h;
  157.     EXEC SQL
  158.         FETCH h INTO :cust_no;                /* get the first row only */
  159.     if (!SQLCODE)
  160.         printf("\tCustomer on hold: %ld\n\n", cust_no);
  161.         
  162.     EXEC SQL
  163.         CLOSE h;
  164.  
  165.     EXEC SQL
  166.         COMMIT TRANSACTION t3;
  167.  
  168.  
  169.     EXEC SQL
  170.         DISCONNECT empdb;
  171. return (0);
  172. err:
  173.     isc_print_status(isc_status);
  174.     return 1;
  175. }
  176.  
  177.