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