1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
#include <stdlib.h>
#include <string.h>
exec sql include ../regression;
exec sql whenever sqlerror stop;
exec sql type c is char reference;
typedef char* c;
exec sql type ind is union { int integer; short smallint; };
typedef union { int integer; short smallint; } ind;
#define BUFFERSIZ 8
exec sql type str is varchar[BUFFERSIZ];
#define CURNAME "mycur"
int
main (void)
{
exec sql begin declare section;
char *stmt1 = "SELECT id, t FROM t1";
char *curname1 = CURNAME;
char *curname2 = CURNAME;
char *curname3 = CURNAME;
varchar curname4[50];
char *curname5 = CURNAME;
int count;
int id;
char t[64];
exec sql end declare section;
char msg[128];
ECPGdebug(1, stderr);
strcpy(msg, "connect");
exec sql connect to REGRESSDB1 as test1;
exec sql connect to REGRESSDB2 as test2;
strcpy(msg, "set");
exec sql at test1 set datestyle to iso;
strcpy(msg, "create");
exec sql at test1 create table t1(id serial primary key, t text);
exec sql at test2 create table t1(id serial primary key, t text);
strcpy(msg, "insert");
exec sql at test1 insert into t1(id, t) values (default, 'a');
exec sql at test1 insert into t1(id, t) values (default, 'b');
exec sql at test1 insert into t1(id, t) values (default, 'c');
exec sql at test1 insert into t1(id, t) values (default, 'd');
exec sql at test2 insert into t1(id, t) values (default, 'e');
strcpy(msg, "commit");
exec sql at test1 commit;
exec sql at test2 commit;
/* Dynamic cursorname test with INTO list in FETCH stmts */
strcpy(msg, "declare");
exec sql at test1 declare :curname1 cursor for
select id, t from t1;
strcpy(msg, "open");
exec sql at test1 open :curname1;
strcpy(msg, "fetch from");
exec sql at test1 fetch forward from :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
exec sql at test1 fetch forward :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
exec sql at test1 fetch 1 from :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count from");
count = 1;
exec sql at test1 fetch :count from :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "move in");
exec sql at test1 move absolute 0 in :curname1;
strcpy(msg, "fetch 1");
exec sql at test1 fetch 1 :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count");
count = 1;
exec sql at test1 fetch :count :curname1 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "close");
exec sql at test1 close :curname1;
/* Dynamic cursorname test with INTO list in DECLARE stmt */
strcpy(msg, "declare");
exec sql at test1 declare :curname2 cursor for
select id, t into :id, :t from t1;
strcpy(msg, "open");
exec sql at test1 open :curname2;
strcpy(msg, "fetch from");
exec sql at test1 fetch from :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
exec sql at test1 fetch :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
exec sql at test1 fetch 1 from :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count from");
count = 1;
exec sql at test1 fetch :count from :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "move");
exec sql at test1 move absolute 0 :curname2;
strcpy(msg, "fetch 1");
exec sql at test1 fetch 1 :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count");
count = 1;
exec sql at test1 fetch :count :curname2;
printf("%d %s\n", id, t);
strcpy(msg, "close");
exec sql at test1 close :curname2;
/* Dynamic cursorname test with PREPARED stmt */
strcpy(msg, "prepare");
exec sql at test1 prepare st_id1 from :stmt1;
exec sql at test2 prepare st_id1 from :stmt1;
strcpy(msg, "declare");
exec sql at test1 declare :curname3 cursor for st_id1;
exec sql at test2 declare :curname5 cursor for st_id1;
strcpy(msg, "open");
exec sql at test1 open :curname3;
exec sql at test2 open :curname5;
strcpy(msg, "fetch");
exec sql at test2 fetch :curname5 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
exec sql at test1 fetch from :curname3 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
exec sql at test1 fetch 1 from :curname3 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count from");
count = 1;
exec sql at test1 fetch :count from :curname3 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "move");
exec sql at test1 move absolute 0 :curname3;
strcpy(msg, "fetch 1");
exec sql at test1 fetch 1 :curname3 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count");
count = 1;
exec sql at test1 fetch :count :curname3 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "close");
exec sql at test1 close :curname3;
exec sql at test2 close :curname5;
strcpy(msg, "deallocate prepare");
exec sql at test1 deallocate prepare st_id1;
exec sql at test2 deallocate prepare st_id1;
/* Dynamic cursorname test with PREPARED stmt,
cursor name in varchar */
curname4.len = strlen(CURNAME);
strcpy(curname4.arr, CURNAME);
strcpy(msg, "prepare");
exec sql at test1 prepare st_id2 from :stmt1;
strcpy(msg, "declare");
exec sql at test1 declare :curname4 cursor for st_id2;
strcpy(msg, "open");
exec sql at test1 open :curname4;
strcpy(msg, "fetch from");
exec sql at test1 fetch from :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
exec sql at test1 fetch :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
exec sql at test1 fetch 1 from :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count from");
count = 1;
exec sql at test1 fetch :count from :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "move");
exec sql at test1 move absolute 0 :curname4;
strcpy(msg, "fetch 1");
exec sql at test1 fetch 1 :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "fetch :count");
count = 1;
exec sql at test1 fetch :count :curname4 into :id, :t;
printf("%d %s\n", id, t);
strcpy(msg, "close");
exec sql at test1 close :curname4;
strcpy(msg, "deallocate prepare");
exec sql at test1 deallocate prepare st_id2;
/* End test */
strcpy(msg, "drop");
exec sql at test1 drop table t1;
exec sql at test2 drop table t1;
strcpy(msg, "commit");
exec sql at test1 commit;
strcpy(msg, "disconnect");
exec sql disconnect all;
return 0;
}
|