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

  1. /*
  2.  *    Program type:   Embedded Dynamic SQL
  3.  *
  4.  *    Description:
  5.  *        This program displays employee names and phone extensions.
  6.  *
  7.  *        It allocates an output SQLDA, declares and opens a cursor,
  8.  *        and loops fetching multiple rows.
  9.  */
  10.  
  11. #include "example.h"
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. void print_error PROTO((void));
  16.  
  17. char    *sel_str =
  18.     "SELECT last_name, first_name, phone_ext FROM phone_list \
  19.     WHERE location = 'Monterey' ORDER BY last_name, first_name;";
  20.  
  21. /* This macro is used to declare structures representing SQL VARCHAR types */
  22. #define SQL_VARCHAR(len) struct {short vary_length; char vary_string[(len)+1];}
  23.  
  24. char Db_name[128];
  25.  
  26. EXEC SQL
  27.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  28.  
  29.  
  30. int main(ARG(int, argc), ARG(char **, argv))
  31. ARGLIST(int argc)
  32. ARGLIST(char **argv)
  33. {
  34.  
  35.     SQL_VARCHAR(15) first_name;
  36.     SQL_VARCHAR(20) last_name;
  37.     char phone_ext[6];
  38.  
  39.     XSQLDA    *sqlda;
  40.     short    flag0 = 0, flag1 = 0, flag2 = 0;
  41.  
  42.     if (argc > 1)
  43.                 strcpy(Db_name, argv[1]);
  44.         else
  45.                 strcpy(Db_name, "employee.gdb");
  46.  
  47.     EXEC SQL
  48.         WHENEVER SQLERROR GO TO Error;
  49.  
  50.     EXEC SQL
  51.         CONNECT empdb;
  52.  
  53.     EXEC SQL
  54.         SET TRANSACTION;
  55.  
  56.     /* Allocate an output SQLDA. */
  57.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(3));
  58.     sqlda->sqln = 3;
  59.     sqlda->version = 1;
  60.  
  61.     /* Prepare the query. */
  62.     EXEC SQL
  63.         PREPARE q INTO SQL DESCRIPTOR sqlda FROM :sel_str;
  64.  
  65.     /*
  66.      *  Although, all three selected columns are of type varchar, the
  67.      *  third field's type is changed and printed as type TEXT.
  68.      */
  69.  
  70.     sqlda->sqlvar[0].sqldata = (char *)&last_name;
  71.     sqlda->sqlvar[0].sqltype = SQL_VARYING + 1;
  72.     sqlda->sqlvar[0].sqlind = &flag0;
  73.  
  74.     sqlda->sqlvar[1].sqldata = (char *)&first_name;
  75.     sqlda->sqlvar[1].sqltype = SQL_VARYING + 1;
  76.     sqlda->sqlvar[1].sqlind = &flag1;
  77.  
  78.     sqlda->sqlvar[2].sqldata = phone_ext;
  79.     sqlda->sqlvar[2].sqltype = SQL_TEXT + 1;
  80.     sqlda->sqlvar[2].sqlind = &flag2;
  81.  
  82.     /* Declare the cursor for the prepared query. */
  83.     EXEC SQL
  84.         DECLARE s CURSOR FOR q;
  85.  
  86.     EXEC SQL
  87.         OPEN s;
  88.  
  89.     printf("\n%-20s %-15s %-10s\n\n", "LAST NAME", "FIRST NAME", "EXTENSION");
  90.  
  91.     /*
  92.      *  Fetch and print the records.
  93.      */
  94.     while (SQLCODE == 0)
  95.     {
  96.         EXEC SQL
  97.             FETCH s USING SQL DESCRIPTOR sqlda;
  98.  
  99.         if (SQLCODE == 100)
  100.             break;
  101.  
  102.         printf("%-20.*s ", last_name.vary_length, last_name.vary_string);
  103.  
  104.         printf("%-15.*s ", first_name.vary_length, first_name.vary_string);
  105.  
  106.         phone_ext[sqlda->sqlvar[2].sqllen] = '\0';
  107.         printf("%-10s\n", phone_ext);
  108.     }
  109.  
  110.     EXEC SQL
  111.         CLOSE s;
  112.  
  113.     EXEC SQL
  114.         COMMIT;
  115.  
  116.     EXEC SQL
  117.         DISCONNECT empdb;
  118.  
  119.     free( sqlda);
  120.     return(0);
  121.         
  122. Error:
  123.     print_error();
  124. }
  125.  
  126. void print_error PROTO((void))
  127. {
  128.     isc_print_status(gds__status);
  129.     printf("SQLCODE=%d\n", SQLCODE);
  130. }
  131.