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

  1. /*
  2.  *  Program type:   Embedded Dynamic SQL
  3.  *
  4.  *    Description:
  5.  *        This program demonstrates the reallocation of SQLDA and
  6.  *        the 'describe' statement.  After a query is examined with
  7.  *        'describe', an SQLDA of correct size is reallocated, and some
  8.  *        information is printed about the query:  its type (select,
  9.  *        non-select), the number of columns, etc.
  10.  */
  11.  
  12.  
  13. #include "example.h"
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17. char *sel_str =
  18.     "SELECT department, mngr_no, location, head_dept \
  19.      FROM department WHERE head_dept in ('100', '900', '600')";
  20.  
  21. char Db_name[128];
  22.  
  23. EXEC SQL
  24.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  25.  
  26.  
  27. int main(ARG(int, argc), ARG(char **, argv))
  28. ARGLIST(int argc)
  29. ARGLIST(char **argv)
  30. {
  31.     short    num_cols, i;
  32.     XSQLDA    *sqlda;
  33.  
  34.         if (argc > 1)
  35.                 strcpy(Db_name, argv[1]);
  36.         else
  37.                 strcpy(Db_name, "employee.gdb");
  38.  
  39.     EXEC SQL
  40.         WHENEVER SQLERROR GO TO Error;
  41.  
  42.     EXEC SQL
  43.         CONNECT empdb;
  44.  
  45.     EXEC SQL
  46.         SET TRANSACTION;
  47.  
  48.     /* Allocate SQLDA of an arbitrary size. */
  49.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(4));
  50.     sqlda->sqln = 4;
  51.     sqlda->sqld = 4;
  52.     sqlda->version = 1;
  53.  
  54.     /* Prepare an unknown statement. */
  55.     EXEC SQL
  56.         PREPARE q INTO SQL DESCRIPTOR sqlda FROM :sel_str;
  57.  
  58.     /* Describe the statement. */
  59.     EXEC SQL
  60.         DESCRIBE q INTO SQL DESCRIPTOR sqlda;
  61.  
  62.     /* This is a non-select statement, which can now be executed. */
  63.     if (sqlda->sqld == 0)
  64.         return(0);
  65.     
  66.     /* If this is a select statement, print more information about it. */
  67.     else
  68.         printf("Query Type:  SELECT\n\n");
  69.     
  70.     num_cols = sqlda->sqld;
  71.  
  72.     printf("Number of columns selected:  %d\n", num_cols);
  73.  
  74.     /* Reallocate SQLDA if necessary. */
  75.     if (sqlda->sqln < sqlda->sqld)
  76.     {
  77.         free(sqlda);
  78.  
  79.         sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(num_cols));
  80.         sqlda->sqln = num_cols;
  81.         sqlda->sqld = num_cols;
  82.  
  83.         /* Re-describe the statement. */
  84.         EXEC SQL
  85.             DESCRIBE q INTO SQL DESCRIPTOR sqlda;
  86.  
  87.         num_cols = sqlda->sqld;
  88.     }
  89.  
  90.     /* List column names, types, and lengths. */
  91.     for (i = 0; i < num_cols; i++)
  92.     {
  93.         printf("\nColumn name:    %s\n", sqlda->sqlvar[i].sqlname);
  94.         printf("Column type:    %d\n", sqlda->sqlvar[i].sqltype);
  95.         printf("Column length:  %d\n", sqlda->sqlvar[i].sqllen);
  96.     }
  97.  
  98.     EXEC SQL
  99.         COMMIT;
  100.  
  101.     EXEC SQL
  102.         DISCONNECT empdb;
  103.  
  104.     free( sqlda);
  105.     return(0);
  106.  
  107. Error:
  108.     isc_print_status(gds__status);
  109.     printf("SQLCODE=%d\n", SQLCODE);
  110.     return(1);
  111. }
  112.