home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 May / PCWorld_1999-05_cd.bin / software / Vyzkuste / inprise / INTRBASE_55 / EXAMPLES / API / STAT4.E < prev    next >
Text File  |  1998-10-18  |  3KB  |  158 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.  */
  13.  
  14. #include "example.h"
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17.  
  18. void build_tree PROTO((void));
  19. void pr_error PROTO((void));
  20.  
  21. EXEC SQL
  22.     BEGIN DECLARE SECTION;
  23. EXEC SQL
  24.     END DECLARE SECTION;
  25.  
  26.  
  27. int main PROTO((void))
  28. {
  29.     char    dept[4];
  30.     long        lvl = 1;
  31.  
  32.     /* Describe the new table's structure. */
  33.     EXEC SQL
  34.         DECLARE tmp_dept_tree TABLE (
  35.             dept_no CHAR(3) NOT NULL PRIMARY KEY,
  36.             tree_level INTEGER);
  37.  
  38.     /* Drop the table in case it exists. Ignore error */
  39.     EXEC SQL
  40.         DROP TABLE tmp_dept_tree;
  41.  
  42.     EXEC SQL
  43.         WHENEVER SQLERROR GO TO Error1;
  44.     /* Create the new table. */
  45.     printf ("creating tmp_dept_tree\n");
  46.     EXEC SQL
  47.         CREATE TABLE tmp_dept_tree (
  48.             dept_no CHAR(3) NOT NULL PRIMARY KEY,
  49.             tree_level INTEGER);
  50.  
  51.     /* Fill the new table. */
  52.     build_tree();
  53.  
  54.     /* Look at it */
  55.     EXEC SQL DECLARE dc CURSOR FOR
  56.         SELECT dept_no, tree_level
  57.         FROM tmp_dept_tree;
  58.  
  59.     EXEC SQL 
  60.         OPEN dc;
  61.  
  62.     EXEC SQL 
  63.         FETCH dc INTO :dept, :lvl;
  64.  
  65.     while (SQLCODE == 0)
  66.     {
  67.     printf ("Dept = %s:  Level = %d\n", dept, lvl);
  68.     EXEC SQL 
  69.         FETCH dc INTO :dept, :lvl;
  70.     }
  71.     EXEC SQL
  72.         COMMIT RELEASE;
  73.  
  74. return 0;
  75.  
  76. Error1:
  77.         pr_error();
  78. return 1;
  79. }
  80.  
  81.  
  82. /*
  83.  *  For each department find its sub-departments and mark them
  84.  *  with the next level number.
  85.  */
  86. void build_tree PROTO((void))
  87. {
  88.     char    dept[4];
  89.     long        lvl = 1;
  90.  
  91.     EXEC SQL
  92.         WHENEVER SQLERROR GO TO Error2;
  93.  
  94.     /* Initialize the department structure by adding the first level.  */
  95.     EXEC SQL
  96.         INSERT INTO tmp_dept_tree VALUES ('000', :lvl);
  97.  
  98.     /* Declare the cursor for selecting all departments with level 'lvl'. */
  99.     EXEC SQL
  100.         DECLARE ds CURSOR FOR
  101.         SELECT dept_no
  102.         FROM tmp_dept_tree
  103.         WHERE tree_level = :lvl;
  104.     
  105.     /* For each department with level 'lvl', find its sub-departments. */
  106.     while (SQLCODE == 0)
  107.     {
  108.         EXEC SQL
  109.             OPEN ds;
  110.  
  111.         /* Initialize the next level. */
  112.         lvl++;
  113.  
  114.         /* Add all the sub-departments of the next level to the table. */
  115.         for (;;)
  116.         {
  117.             EXEC SQL
  118.                 FETCH ds INTO :dept;
  119.  
  120.             if (SQLCODE == 100)
  121.                 break;
  122.  
  123.             EXEC SQL
  124.                 INSERT INTO tmp_dept_tree
  125.                 SELECT dept_no, :lvl
  126.                 FROM department
  127.                 WHERE head_dept = :dept;
  128.         }
  129.  
  130.         EXEC SQL
  131.             CLOSE ds;
  132.         EXEC SQL
  133.             COMMIT;
  134.  
  135.         /* Done, if no next level was created by the INSERT above. */
  136.         EXEC SQL
  137.             SELECT tree_level
  138.             FROM tmp_dept_tree
  139.             WHERE tree_level = :lvl;
  140.  
  141.         if (SQLCODE == 100)
  142.             return;
  143.     };
  144.  
  145. Error2:
  146.     pr_error();
  147. return ;
  148. }
  149.  
  150.  
  151. /*
  152.  *    Print any error and exit.
  153.  */
  154. void pr_error PROTO((void))
  155. {
  156.     isc_print_sqlerror((short)SQLCODE, gds__status);
  157. }
  158.