1/* dynamic SQL test program 2 */ 3 4#include <stdio.h> 5#include <stdlib.h> 6 7exec sql include sql3types; 8exec sql include sqlca; 9exec sql include ../regression; 10 11static void 12error (void) 13{ 14 printf ("\n#%ld:%s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 15 exit (1); 16} 17 18int 19main () 20{ 21 exec sql begin declare section; 22 int COUNT; 23 int INTVAR; 24 int INDEX; 25 int INDICATOR; 26 int TYPE, LENGTH, OCTET_LENGTH, PRECISION, SCALE, RETURNED_OCTET_LENGTH; 27 int DATETIME_INTERVAL_CODE; 28 char NAME[120], BOOLVAR; 29 char STRINGVAR[1024]; 30 double DOUBLEVAR; 31 char *QUERY; 32 exec sql end declare section; 33 int done = 0; 34 35 exec sql var BOOLVAR is bool; 36 37 ECPGdebug (1, stderr); 38 39 QUERY = "select * from dyntest"; 40 41 exec sql whenever sqlerror 42 do 43 error (); 44 45 exec sql allocate descriptor MYDESC; 46 47 exec sql connect to REGRESSDB1; 48 49 exec sql set datestyle to german; 50 51 exec sql create table dyntest (name char (14), d float8, i int, 52 bignumber int8, b boolean, comment text, 53 day date); 54 exec sql insert into dyntest values ('first entry', 14.7, 14, 123045607890, true, 'The world''''s most advanced open source database.', '1987-07-14'); 55 exec sql insert into dyntest values ('second entry', 1407.87, 1407, 987065403210, false, 'The elephant never forgets.', '1999-11-5'); 56 57 exec sql prepare MYQUERY from :QUERY; 58 exec sql declare MYCURS cursor for MYQUERY; 59 60 exec sql open MYCURS; 61 62 while (1) 63 { 64 exec sql fetch in MYCURS into sql descriptor MYDESC; 65 66 if (sqlca.sqlcode) 67 break; 68 69 exec sql get descriptor MYDESC:COUNT = count; 70 if (!done) 71 { 72 printf ("Found %d columns\n", COUNT); 73 done = 1; 74 } 75 76 for (INDEX = 1; INDEX <= COUNT; ++INDEX) 77 { 78 exec sql get descriptor MYDESC value :INDEX 79 :TYPE = type, 80 :LENGTH = length, 81 :OCTET_LENGTH = octet_length, 82 :RETURNED_OCTET_LENGTH = returned_octet_length, 83 :PRECISION = precision, 84 :SCALE = scale, 85 :NAME = name, 86 :INDICATOR = indicator; 87 printf ("%2d\t%s (type: %d length: %d precision: %d scale: %d = " , INDEX, NAME, TYPE, LENGTH, PRECISION, SCALE); 88 switch (TYPE) 89 { 90 case SQL3_BOOLEAN: 91 printf ("bool"); 92 break; 93 case SQL3_NUMERIC: 94 printf ("numeric(%d,%d)", PRECISION, SCALE); 95 break; 96 case SQL3_DECIMAL: 97 printf ("decimal(%d,%d)", PRECISION, SCALE); 98 break; 99 case SQL3_INTEGER: 100 printf ("integer"); 101 break; 102 case SQL3_SMALLINT: 103 printf ("smallint"); 104 break; 105 case SQL3_FLOAT: 106 printf ("float(%d,%d)", PRECISION, SCALE); 107 break; 108 case SQL3_REAL: 109 printf ("real"); 110 break; 111 case SQL3_DOUBLE_PRECISION: 112 printf ("double precision"); 113 break; 114 case SQL3_DATE_TIME_TIMESTAMP: 115 exec sql get descriptor MYDESC value :INDEX 116 :DATETIME_INTERVAL_CODE = datetime_interval_code; 117 switch (DATETIME_INTERVAL_CODE) 118 { 119 case SQL3_DDT_DATE: 120 printf ("date"); 121 break; 122 case SQL3_DDT_TIME: 123 printf ("time"); 124 break; 125 case SQL3_DDT_TIMESTAMP: 126 printf ("timestamp"); 127 break; 128 case SQL3_DDT_TIME_WITH_TIME_ZONE: 129 printf ("time with time zone"); 130 break; 131 case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE: 132 printf ("timestamp with time zone"); 133 break; 134 } 135 break; 136 case SQL3_INTERVAL: 137 printf ("interval"); 138 break; 139 case SQL3_CHARACTER: 140 if (LENGTH > 0) 141 printf ("char(%d)", LENGTH); 142 else 143 printf ("text"); 144 break; 145 case SQL3_CHARACTER_VARYING: 146 if (LENGTH > 0) 147 printf ("varchar(%d)", LENGTH); 148 else 149 printf ("varchar()"); 150 break; 151 default: 152 printf ("<SQL3 %d>", TYPE); 153 break; 154 } 155 printf (")\n\toctet_length: %d returned_octet_length: %d)\n\t= ", 156 OCTET_LENGTH, RETURNED_OCTET_LENGTH); 157 if (INDICATOR == -1) 158 printf ("NULL\n"); 159 else 160 switch (TYPE) 161 { 162 case SQL3_BOOLEAN: 163 exec sql get descriptor MYDESC value :INDEX :BOOLVAR = data; 164 printf ("%s\n", BOOLVAR ? "true" : "false"); 165 break; 166 case SQL3_INTEGER: 167 case SQL3_SMALLINT: 168 exec sql get descriptor MYDESC value :INDEX :INTVAR = data; 169 printf ("%d\n", INTVAR); 170 break; 171 case SQL3_DOUBLE_PRECISION: 172 exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR = data; 173 printf ("%.*f\n", PRECISION, DOUBLEVAR); 174 break; 175 case SQL3_DATE_TIME_TIMESTAMP: 176 exec sql get descriptor MYDESC value :INDEX 177 :DATETIME_INTERVAL_CODE = datetime_interval_code, 178 :STRINGVAR = data; 179 printf ("%d \"%s\"\n", DATETIME_INTERVAL_CODE, STRINGVAR); 180 break; 181 case SQL3_CHARACTER: 182 case SQL3_CHARACTER_VARYING: 183 exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data; 184 printf ("\"%s\"\n", STRINGVAR); 185 break; 186 default: 187 exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data; 188 printf ("<\"%s\">\n", STRINGVAR); 189 break; 190 } 191 } 192 } 193 194 exec sql close MYCURS; 195 196 exec sql deallocate descriptor MYDESC; 197 198 return 0; 199 } 200