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

  1. /*
  2.  *  Program type:   Embedded Static SQL
  3.  *
  4.  *  Description:
  5.  *        This program executes a stored procedure and selects from
  6.  *        a stored procedure.  First, a list of projects an employee
  7.  *        is involved in is printed.  Then the employee is added to
  8.  *        another project.  The new list of projects is printed again.
  9.  */
  10.  
  11. #include "example.h"
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <stdio.h>
  15.  
  16. EXEC SQL INCLUDE SQLCA;
  17.  
  18. void select_projects PROTO((short emp_no));
  19. void get_params PROTO((short *emp_no, char* proj_id));
  20. void pr_error PROTO((long status));
  21. int add_emp_proj PROTO((short emp_no,char * proj_id));
  22.  
  23.  
  24.  
  25. int main PROTO ((void))
  26. {
  27.     BASED_ON employee.emp_no    emp_no;
  28.     BASED_ON project.proj_id    proj_id;
  29.  
  30.     /*
  31.      *    Add employee with id 8 to project 'MAPDB'.
  32.      */
  33.     get_params(&emp_no, proj_id);
  34.  
  35.     /*
  36.      *    Display employee's current projects.
  37.      */
  38.     printf("\nCurrent projects for employee id: %d\n\n", emp_no);
  39.     select_projects(emp_no);
  40.  
  41.     /*
  42.      *    Insert a new employee project row.
  43.      */
  44.     printf("\nAdd employee id: %d to project: %s\n", emp_no, proj_id);
  45.     add_emp_proj(emp_no, proj_id);
  46.  
  47.     /*
  48.      *    Display employee's new current projects.
  49.      */
  50.     printf("\nCurrent projects for employee id: %d\n\n", emp_no);
  51.     select_projects(emp_no);
  52.  
  53. }
  54.  
  55.  
  56. /*
  57.  *    Select from a stored procedure.
  58.  *    Procedure 'get_emp_proj' gets employee's projects.
  59.  */
  60. void select_projects(ARG(short, emp_no))
  61.     ARGLIST(short emp_no)
  62. {
  63.     BASED_ON project.proj_id    proj_id;
  64.  
  65.     EXEC SQL
  66.         WHENEVER SQLERROR GO TO SelError;
  67.  
  68.     /* Declare a cursor on the stored procedure. */
  69.     EXEC SQL
  70.         DECLARE projects CURSOR FOR
  71.         SELECT proj_id FROM get_emp_proj (:emp_no)
  72.         ORDER BY proj_id;
  73.  
  74.     EXEC SQL
  75.         OPEN projects;
  76.     
  77.     /* Print employee projects. */
  78.     while (SQLCODE == 0)
  79.     {
  80.         EXEC SQL
  81.             FETCH projects INTO :proj_id;
  82.  
  83.         if (SQLCODE == 100)
  84.             break;
  85.  
  86.         printf("\t%s\n", proj_id);
  87.     }
  88.  
  89.     EXEC SQL
  90.         CLOSE projects;
  91.     
  92.     EXEC SQL
  93.         COMMIT RETAIN;
  94.  
  95. SelError:
  96.     if (SQLCODE)
  97.         pr_error((long)gds__status);
  98. }
  99.  
  100.  
  101. /*
  102.  *    Execute a stored procedure.
  103.  *    Procedure 'add_emp_proj' adds an employee to a project.
  104.  */
  105. add_emp_proj(ARG(short, emp_no),
  106.              ARG(char *, proj_id))
  107.     ARGLIST(BASED_ON employee.emp_no    emp_no)
  108.     ARGLIST(BASED_ON project.proj_id    proj_id)
  109. {
  110.     EXEC SQL
  111.         WHENEVER SQLERROR GO TO AddError;
  112.  
  113.     EXEC SQL
  114.         EXECUTE PROCEDURE add_emp_proj :emp_no, :proj_id;
  115.  
  116.     EXEC SQL
  117.         COMMIT;
  118.  
  119. AddError:
  120.     if (SQLCODE) 
  121.         pr_error((long)gds__status);
  122. }
  123.  
  124.  
  125. /*
  126.  *    Set-up procedure parameters and clean-up old data.
  127.  */
  128. void get_params(ARG(short *, emp_no),
  129.                 ARG(char *, proj_id))
  130. ARGLIST(BASED_ON employee.emp_no        *emp_no)
  131. ARGLIST(BASED_ON project.proj_id        proj_id)
  132. {
  133.     *emp_no = 8;
  134.     strcpy(proj_id, "MAPDB");
  135.  
  136.     EXEC SQL
  137.         WHENEVER SQLERROR GO TO CleanupError;
  138.  
  139.     /* Cleanup:  delete row from the previous run. */
  140.     EXEC SQL
  141.         DELETE FROM employee_project
  142.         WHERE emp_no = 8 AND proj_id = "MAPDB";
  143.  
  144. CleanupError:
  145.     return;
  146. }
  147.  
  148.  
  149. /*
  150.  *    Print an error message.
  151.  */
  152. void pr_error(ARG(long, status))
  153.     ARGLIST(long    status)
  154. {
  155.     isc_print_sqlerror(SQLCODE, gds__status);
  156. }
  157.  
  158.