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