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 / dyn5.e < prev    next >
Text File  |  2000-06-23  |  3KB  |  131 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.  * The contents of this file are subject to the Interbase Public
  11.  * License Version 1.0 (the "License"); you may not use this file
  12.  * except in compliance with the License. You may obtain a copy
  13.  * of the License at http://www.Interbase.com/IPL/
  14.  *
  15.  * Software distributed under the License is distributed on an
  16.  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  17.  * or implied. See the License for the specific language governing
  18.  * rights and limitations under the License.
  19.  *
  20.  * The Original Code was created by Interbase Software Corporation
  21.  * and its successors. Portions created by Borland/Inprise are
  22.  * Copyright (C) 1992-1998 and 1999-2000 Borland/Inprise. Portions
  23.  * created by InterBase Software Corporation are Copyright (C)
  24.  * 1998-1999 InterBase Software Corporation.
  25.  *
  26.  * Copyright (C) 2000 InterBase Software Corporation
  27.  * All Rights Reserved.
  28.  * Contributor(s): ______________________________________.
  29.  */
  30.  
  31.  
  32. #include "example.h"
  33. #include <stdlib.h>
  34. #include <string.h>
  35.  
  36. char *sel_str =
  37.     "SELECT department, mngr_no, location, head_dept \
  38.      FROM department WHERE head_dept in ('100', '900', '600')";
  39.  
  40. char Db_name[128];
  41.  
  42. EXEC SQL
  43.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  44.  
  45.  
  46. int main(ARG(int, argc), ARG(char **, argv))
  47. ARGLIST(int argc)
  48. ARGLIST(char **argv)
  49. {
  50.     short    num_cols, i;
  51.     XSQLDA    *sqlda;
  52.  
  53.         if (argc > 1)
  54.                 strcpy(Db_name, argv[1]);
  55.         else
  56.                 strcpy(Db_name, "employee.gdb");
  57.  
  58.     EXEC SQL
  59.         WHENEVER SQLERROR GO TO Error;
  60.  
  61.     EXEC SQL
  62.         CONNECT empdb;
  63.  
  64.     EXEC SQL
  65.         SET TRANSACTION;
  66.  
  67.     /* Allocate SQLDA of an arbitrary size. */
  68.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(4));
  69.     sqlda->sqln = 4;
  70.     sqlda->sqld = 4;
  71.     sqlda->version = 1;
  72.  
  73.     /* Prepare an unknown statement. */
  74.     EXEC SQL
  75.         PREPARE q INTO SQL DESCRIPTOR sqlda FROM :sel_str;
  76.  
  77.     /* Describe the statement. */
  78.     EXEC SQL
  79.         DESCRIBE q INTO SQL DESCRIPTOR sqlda;
  80.  
  81.     /* This is a non-select statement, which can now be executed. */
  82.     if (sqlda->sqld == 0)
  83.         return(0);
  84.     
  85.     /* If this is a select statement, print more information about it. */
  86.     else
  87.         printf("Query Type:  SELECT\n\n");
  88.     
  89.     num_cols = sqlda->sqld;
  90.  
  91.     printf("Number of columns selected:  %d\n", num_cols);
  92.  
  93.     /* Reallocate SQLDA if necessary. */
  94.     if (sqlda->sqln < sqlda->sqld)
  95.     {
  96.         free(sqlda);
  97.  
  98.         sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(num_cols));
  99.         sqlda->sqln = num_cols;
  100.         sqlda->sqld = num_cols;
  101.  
  102.         /* Re-describe the statement. */
  103.         EXEC SQL
  104.             DESCRIBE q INTO SQL DESCRIPTOR sqlda;
  105.  
  106.         num_cols = sqlda->sqld;
  107.     }
  108.  
  109.     /* List column names, types, and lengths. */
  110.     for (i = 0; i < num_cols; i++)
  111.     {
  112.         printf("\nColumn name:    %s\n", sqlda->sqlvar[i].sqlname);
  113.         printf("Column type:    %d\n", sqlda->sqlvar[i].sqltype);
  114.         printf("Column length:  %d\n", sqlda->sqlvar[i].sqllen);
  115.     }
  116.  
  117.     EXEC SQL
  118.         COMMIT;
  119.  
  120.     EXEC SQL
  121.         DISCONNECT empdb;
  122.  
  123.     free( sqlda);
  124.     return(0);
  125.  
  126. Error:
  127.     isc_print_status(gds__status);
  128.     printf("SQLCODE=%d\n", SQLCODE);
  129.     return(1);
  130. }
  131.