1#include <stdlib.h>
2#include <string.h>
3
4exec sql include ../regression;
5
6exec sql whenever sqlerror stop;
7
8exec sql type c is char reference;
9typedef char* c;
10
11exec sql type ind is union { int integer; short smallint; };
12typedef union { int integer; short smallint; } ind;
13
14#define BUFFERSIZ 8
15exec sql type str is varchar[BUFFERSIZ];
16
17exec sql declare cur cursor for
18       select name, born, age, married, children from family;
19
20int
21main (void)
22{
23	exec sql struct birthinfo { long born; short age; };
24exec sql begin declare section;
25	struct personal_struct	{	str name;
26					struct birthinfo birth;
27				} personal, *p;
28	struct personal_indicator {	int ind_name;
29					struct birthinfo ind_birth;
30				  } ind_personal, *i;
31	ind ind_children;
32	struct t1 { str name; }; struct t2 { str name; };
33exec sql end declare section;
34
35	exec sql char *married = NULL;
36	exec sql long ind_married;
37	exec sql ind children;
38	int loopcount;
39	char msg[128];
40
41        ECPGdebug(1, stderr);
42
43	strcpy(msg, "connect");
44	exec sql connect to REGRESSDB1;
45
46	strcpy(msg, "set");
47	exec sql set datestyle to iso;
48
49	strcpy(msg, "create");
50	exec sql create table family(name char(8), born integer, age smallint, married date, children integer);
51
52	strcpy(msg, "insert");
53	exec sql insert into family(name, married, children) values ('Mum', '19870714', 3);
54	exec sql insert into family(name, born, married, children) values ('Dad', '19610721', '19870714', 3);
55	exec sql insert into family(name, age) values ('Child 1', 16);
56	exec sql insert into family(name, age) values ('Child 2', 14);
57	exec sql insert into family(name, age) values ('Child 3', 9);
58
59	strcpy(msg, "commit");
60	exec sql commit;
61
62	strcpy(msg, "open");
63	exec sql open cur;
64
65	exec sql whenever not found do break;
66
67	p=&personal;
68	i=&ind_personal;
69	memset(i, 0, sizeof(ind_personal));
70	for (loopcount = 0; loopcount < 100; loopcount++) {
71		strcpy(msg, "fetch");
72		exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint;
73		printf("%8.8s", personal.name.arr);
74		if (i->ind_birth.born >= 0)
75			printf(", born %ld", personal.birth.born);
76		if (i->ind_birth.age >= 0)
77			printf(", age = %d", personal.birth.age);
78		if (ind_married >= 0)
79			printf(", married %s", married);
80		if (ind_children.smallint >= 0)
81			printf(", children = %d", children.integer);
82		putchar('\n');
83
84		free(married);
85		married = NULL;
86	}
87
88	strcpy(msg, "close");
89	exec sql close cur;
90
91	strcpy(msg, "drop");
92	exec sql drop table family;
93
94	strcpy(msg, "commit");
95	exec sql commit;
96
97	strcpy(msg, "disconnect");
98	exec sql disconnect;
99
100	return (0);
101}
102