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 / dyn3.e < prev    next >
Text File  |  2000-06-23  |  4KB  |  150 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.  * The contents of this file are subject to the Interbase Public
  10.  * License Version 1.0 (the "License"); you may not use this file
  11.  * except in compliance with the License. You may obtain a copy
  12.  * of the License at http://www.Interbase.com/IPL/
  13.  *
  14.  * Software distributed under the License is distributed on an
  15.  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  16.  * or implied. See the License for the specific language governing
  17.  * rights and limitations under the License.
  18.  *
  19.  * The Original Code was created by Interbase Software Corporation
  20.  * and its successors. Portions created by Borland/Inprise are
  21.  * Copyright (C) 1992-1998 and 1999-2000 Borland/Inprise. Portions
  22.  * created by InterBase Software Corporation are Copyright (C)
  23.  * 1998-1999 InterBase Software Corporation.
  24.  *
  25.  * Copyright (C) 2000 InterBase Software Corporation
  26.  * All Rights Reserved.
  27.  * Contributor(s): ______________________________________.
  28.  */
  29.  
  30. #include "example.h"
  31. #include <stdlib.h>
  32. #include <string.h>
  33.  
  34. void print_error (void);
  35.  
  36. char    *sel_str =
  37.     "SELECT last_name, first_name, phone_ext FROM phone_list \
  38.     WHERE location = 'Monterey' ORDER BY last_name, first_name;";
  39.  
  40. /* This macro is used to declare structures representing SQL VARCHAR types */
  41. #define SQL_VARCHAR(len) struct {short vary_length; char vary_string[(len)+1];}
  42.  
  43. char Db_name[128];
  44.  
  45. EXEC SQL
  46.     SET DATABASE empdb = "employee.gdb" RUNTIME :Db_name;
  47.  
  48.  
  49. int main(ARG(int, argc), ARG(char **, argv))
  50. ARGLIST(int argc)
  51. ARGLIST(char **argv)
  52. {
  53.  
  54.     SQL_VARCHAR(15) first_name;
  55.     SQL_VARCHAR(20) last_name;
  56.     char phone_ext[6];
  57.  
  58.     XSQLDA    *sqlda;
  59.     short    flag0 = 0, flag1 = 0, flag2 = 0;
  60.  
  61.     if (argc > 1)
  62.                 strcpy(Db_name, argv[1]);
  63.         else
  64.                 strcpy(Db_name, "employee.gdb");
  65.  
  66.     EXEC SQL
  67.         WHENEVER SQLERROR GO TO Error;
  68.  
  69.     EXEC SQL
  70.         CONNECT empdb;
  71.  
  72.     EXEC SQL
  73.         SET TRANSACTION;
  74.  
  75.     /* Allocate an output SQLDA. */
  76.     sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(3));
  77.     sqlda->sqln = 3;
  78.     sqlda->version = 1;
  79.  
  80.     /* Prepare the query. */
  81.     EXEC SQL
  82.         PREPARE q INTO SQL DESCRIPTOR sqlda FROM :sel_str;
  83.  
  84.     /*
  85.      *  Although, all three selected columns are of type varchar, the
  86.      *  third field's type is changed and printed as type TEXT.
  87.      */
  88.  
  89.     sqlda->sqlvar[0].sqldata = (char *)&last_name;
  90.     sqlda->sqlvar[0].sqltype = SQL_VARYING + 1;
  91.     sqlda->sqlvar[0].sqlind = &flag0;
  92.  
  93.     sqlda->sqlvar[1].sqldata = (char *)&first_name;
  94.     sqlda->sqlvar[1].sqltype = SQL_VARYING + 1;
  95.     sqlda->sqlvar[1].sqlind = &flag1;
  96.  
  97.     sqlda->sqlvar[2].sqldata = phone_ext;
  98.     sqlda->sqlvar[2].sqltype = SQL_TEXT + 1;
  99.     sqlda->sqlvar[2].sqlind = &flag2;
  100.  
  101.     /* Declare the cursor for the prepared query. */
  102.     EXEC SQL
  103.         DECLARE s CURSOR FOR q;
  104.  
  105.     EXEC SQL
  106.         OPEN s;
  107.  
  108.     printf("\n%-20s %-15s %-10s\n\n", "LAST NAME", "FIRST NAME", "EXTENSION");
  109.  
  110.     /*
  111.      *  Fetch and print the records.
  112.      */
  113.     while (SQLCODE == 0)
  114.     {
  115.         EXEC SQL
  116.             FETCH s USING SQL DESCRIPTOR sqlda;
  117.  
  118.         if (SQLCODE == 100)
  119.             break;
  120.  
  121.         printf("%-20.*s ", last_name.vary_length, last_name.vary_string);
  122.  
  123.         printf("%-15.*s ", first_name.vary_length, first_name.vary_string);
  124.  
  125.         phone_ext[sqlda->sqlvar[2].sqllen] = '\0';
  126.         printf("%-10s\n", phone_ext);
  127.     }
  128.  
  129.     EXEC SQL
  130.         CLOSE s;
  131.  
  132.     EXEC SQL
  133.         COMMIT;
  134.  
  135.     EXEC SQL
  136.         DISCONNECT empdb;
  137.  
  138.     free( sqlda);
  139.     return(0);
  140.         
  141. Error:
  142.     print_error();
  143. }
  144.  
  145. void print_error (void)
  146. {
  147.     isc_print_status(gds__status);
  148.     printf("SQLCODE=%d\n", SQLCODE);
  149. }
  150.