Method 4 example using SQL descriptors

The following example uses prepare and fetch with dynamic parameter markers and SQL descriptors.

exec sql begin declare section
     int  index_colcnt, coltype;
     int  int_buff;
     char     char_buff[255], void_buff[255];
     char type[255], title[255];
     char colname[255];
     int sales;
     int descnt, occur, cnt;
     int condcnt, diag_cnt, num_msgs;
     char user_id[30], pass_id[30], server_name[30];
     char str1[1024], str2[1024], str3[1024],
         str4[1024];
exec sql end declare section;
...
 void dyn_m4()
 {
  printf("\n\nDynamic sql Method 4\n");
  printf("Enter in a Select statement to retrieve
     any kind of ");
  printf("information from the pubs database:");
  scanf("%s", &str4);
 
  printf("\nEnter the largest number of columns to
     be retrieved or the number ");
  printf("of ? in the sql statement:\n");
  scanf("%d", &occur);
 
 exec sql allocate descriptor dinout with max 
     :occur;
 exec sql prepare s4 from :str4;
exec sql declare c2 cursor for s4;
exec sql describe input s4 using sql descriptor
     dinout;
fill_descriptor();
exec sql open c2 using sql descriptor dinout; 
     
while (sqlca.sqlcode == 0)
 {
     exec sql fetch c2 into sql descriptor dinout;
     if(sqlca.sqlcode == 0) {
         print_descriptor();
     }
 }
 
 exec sql close c2;
exec sql deallocate descriptor dinout;
exec sql deallocate prepare s4;
printf("Dynamic SQL Method 4 completed\n\n");
 
 }
 
 void
 print_descriptor()
 {
exec sql get descriptor dinout :descnt = count;
 printf("Column name \t\tColumn data\n");
  printf("----------- \t\t-------------------------
 ----------------\n");
 
  for (index_colcnt = 1; index_colcnt <= descnt;
      index_colcnt++)
  { /* get each column attribute */
     exec sql get descriptor dinout value
        :index_colcnt :coltype = TYPE;
 
     switch(coltype)
     {
      ...
      case 4:/* integer type */
         exec sql get descriptor dinout value
             :index_colcnt
                 :colname = NAME, :int_buff = DATA;
         printf("%s \t\t %d\n", colname, int_buff);
         break;
      ...
     }
  }
 
 }
 
 void
 fill_descriptor()
 {
 exec sql get descriptor dinout :descnt = count;
     for (cnt = 1; cnt <= descnt; cnt++)
  {
     printf("Enter in the data type of the %d ?:",
         cnt);
     scanf("%d", &coltype;);
     switch(coltype)
     {
      ...
      case 4:/* integer type */
         printf("Enter in the value of the data:");
         scanf("%d\n", ∫_buff);
         exec sql set descriptor dinout VALUE :cnt
             TYPE = :coltype, 
                 DATA = :int_buff;    
         break;
 
      default:
         printf("non-supported column type.\n");
         break;
     }
  }
 }