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 / stat4.e < prev    next >
Text File  |  2000-06-23  |  4KB  |  177 lines

  1. /*
  2.  *  Program type:   Embedded Static SQL
  3.  *
  4.  *  Description:
  5.  *        This program declares and creates a new table.
  6.  *        Some rows, describing a department structure,
  7.  *        are added to the new table as a test.
  8.  *
  9.  *        The table is created temporarily for figuring
  10.  *        out which level in the department structure each
  11.  *        department belongs too.
  12.  * The contents of this file are subject to the Interbase Public
  13.  * License Version 1.0 (the "License"); you may not use this file
  14.  * except in compliance with the License. You may obtain a copy
  15.  * of the License at http://www.Interbase.com/IPL/
  16.  *
  17.  * Software distributed under the License is distributed on an
  18.  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  19.  * or implied. See the License for the specific language governing
  20.  * rights and limitations under the License.
  21.  *
  22.  * The Original Code was created by Interbase Software Corporation
  23.  * and its successors. Portions created by Borland/Inprise are
  24.  * Copyright (C) 1992-1998 and 1999-2000 Borland/Inprise. Portions
  25.  * created by InterBase Software Corporation are Copyright (C)
  26.  * 1998-1999 InterBase Software Corporation.
  27.  *
  28.  * Copyright (C) 2000 InterBase Software Corporation
  29.  * All Rights Reserved.
  30.  * Contributor(s): ______________________________________.
  31.  */
  32.  
  33. #include "example.h"
  34. #include <stdlib.h>
  35. #include <stdio.h>
  36.  
  37. void build_tree (void);
  38. void pr_error (void);
  39.  
  40. EXEC SQL
  41.     BEGIN DECLARE SECTION;
  42. EXEC SQL
  43.     END DECLARE SECTION;
  44.  
  45.  
  46. int main (void)
  47. {
  48.     char    dept[4];
  49.     long        lvl = 1;
  50.  
  51.     /* Describe the new table's structure. */
  52.     EXEC SQL
  53.         DECLARE tmp_dept_tree TABLE (
  54.             dept_no CHAR(3) NOT NULL PRIMARY KEY,
  55.             tree_level INTEGER);
  56.  
  57.     /* Drop the table in case it exists. Ignore error */
  58.     EXEC SQL
  59.         DROP TABLE tmp_dept_tree;
  60.  
  61.     EXEC SQL
  62.         WHENEVER SQLERROR GO TO Error1;
  63.     /* Create the new table. */
  64.     printf ("creating tmp_dept_tree\n");
  65.     EXEC SQL
  66.         CREATE TABLE tmp_dept_tree (
  67.             dept_no CHAR(3) NOT NULL PRIMARY KEY,
  68.             tree_level INTEGER);
  69.  
  70.     /* Fill the new table. */
  71.     build_tree();
  72.  
  73.     /* Look at it */
  74.     EXEC SQL DECLARE dc CURSOR FOR
  75.         SELECT dept_no, tree_level
  76.         FROM tmp_dept_tree;
  77.  
  78.     EXEC SQL 
  79.         OPEN dc;
  80.  
  81.     EXEC SQL 
  82.         FETCH dc INTO :dept, :lvl;
  83.  
  84.     while (SQLCODE == 0)
  85.     {
  86.     printf ("Dept = %s:  Level = %d\n", dept, lvl);
  87.     EXEC SQL 
  88.         FETCH dc INTO :dept, :lvl;
  89.     }
  90.     EXEC SQL
  91.         COMMIT RELEASE;
  92.  
  93. return 0;
  94.  
  95. Error1:
  96.         pr_error();
  97. return 1;
  98. }
  99.  
  100.  
  101. /*
  102.  *  For each department find its sub-departments and mark them
  103.  *  with the next level number.
  104.  */
  105. void build_tree (void)
  106. {
  107.     char    dept[4];
  108.     long        lvl = 1;
  109.  
  110.     EXEC SQL
  111.         WHENEVER SQLERROR GO TO Error2;
  112.  
  113.     /* Initialize the department structure by adding the first level.  */
  114.     EXEC SQL
  115.         INSERT INTO tmp_dept_tree VALUES ('000', :lvl);
  116.  
  117.     /* Declare the cursor for selecting all departments with level 'lvl'. */
  118.     EXEC SQL
  119.         DECLARE ds CURSOR FOR
  120.         SELECT dept_no
  121.         FROM tmp_dept_tree
  122.         WHERE tree_level = :lvl;
  123.     
  124.     /* For each department with level 'lvl', find its sub-departments. */
  125.     while (SQLCODE == 0)
  126.     {
  127.         EXEC SQL
  128.             OPEN ds;
  129.  
  130.         /* Initialize the next level. */
  131.         lvl++;
  132.  
  133.         /* Add all the sub-departments of the next level to the table. */
  134.         for (;;)
  135.         {
  136.             EXEC SQL
  137.                 FETCH ds INTO :dept;
  138.  
  139.             if (SQLCODE == 100)
  140.                 break;
  141.  
  142.             EXEC SQL
  143.                 INSERT INTO tmp_dept_tree
  144.                 SELECT dept_no, :lvl
  145.                 FROM department
  146.                 WHERE head_dept = :dept;
  147.         }
  148.  
  149.         EXEC SQL
  150.             CLOSE ds;
  151.         EXEC SQL
  152.             COMMIT;
  153.  
  154.         /* Done, if no next level was created by the INSERT above. */
  155.         EXEC SQL
  156.             SELECT tree_level
  157.             FROM tmp_dept_tree
  158.             WHERE tree_level = :lvl;
  159.  
  160.         if (SQLCODE == 100)
  161.             return;
  162.     };
  163.  
  164. Error2:
  165.     pr_error();
  166. return ;
  167. }
  168.  
  169.  
  170. /*
  171.  *    Print any error and exit.
  172.  */
  173. void pr_error (void)
  174. {
  175.     isc_print_sqlerror((short)SQLCODE, gds__status);
  176. }
  177.