1 /* dynamic SQL test program
3 * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
5 * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.6 2000/03/17 23:26:36 tgl Exp $
10 exec sql include sql3types;
11 exec sql include sqlca;
14 { printf("#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
18 int main(int argc,char **argv)
19 { exec sql begin declare section;
25 int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
26 int DATETIME_INTERVAL_CODE;
33 exec sql end declare section;
36 snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0]?argv[1]:"pg_tables");
38 exec sql whenever sqlerror do error();
40 exec sql allocate descriptor MYDESC;
42 strncpy(DB,argc>2?argv[2]:"mm",sizeof DB);
43 exec sql connect to :DB;
45 exec sql prepare MYQUERY from :QUERY;
46 exec sql declare MYCURS cursor for MYQUERY;
51 { exec sql fetch in MYCURS into sql descriptor MYDESC;
53 if (sqlca.sqlcode) break;
55 exec sql get descriptor MYDESC :COUNT = count;
57 { printf("%d Columns\n",COUNT);
58 for (INDEX=1;INDEX<=COUNT;++INDEX)
59 { exec sql get descriptor MYDESC value :INDEX
61 :LENGTH = length, :OCTET_LENGTH=octet_length,
62 :PRECISION = precision, :SCALE=scale,
63 :NULLABLE=nullable, :NAME=name;
70 printf("numeric(%d,%d) ",PRECISION,SCALE);
73 printf("decimal(%d,%d) ",PRECISION,SCALE);
82 printf("float(%d,%d) ",PRECISION,SCALE);
87 case SQL3_DOUBLE_PRECISION:
88 printf("double precision ");
90 case SQL3_DATE_TIME_TIMESTAMP:
91 exec sql get descriptor MYDESC value :INDEX
92 :DATETIME_INTERVAL_CODE=datetime_interval_code;
93 switch(DATETIME_INTERVAL_CODE)
95 printf("date "); break;
97 printf("time "); break;
98 case SQL3_DDT_TIMESTAMP:
99 printf("timestamp "); break;
100 case SQL3_DDT_TIME_WITH_TIME_ZONE:
101 printf("time with time zone "); break;
102 case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE:
103 printf("timestamp with time zone "); break;
110 if (LENGTH>0) printf("char(%d) ",LENGTH);
111 else printf("char(?) ");
113 case SQL3_CHARACTER_VARYING:
114 if (LENGTH>0) printf("varchar(%d) ",LENGTH);
115 else printf("varchar() ");
118 if (TYPE<0) printf("<OID %d> ",-TYPE);
119 else printf("<SQL3 %d> ",TYPE);
122 if (!NULLABLE) printf("not null ");
123 if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
130 for (INDEX=1;INDEX<=COUNT;++INDEX)
131 { exec sql get descriptor MYDESC value :INDEX
132 :TYPE = type, :SCALE=scale, :PRECISION = precision,
133 :INDICATOR=indicator;
134 if (INDICATOR==-1) printf("NULL");
137 exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
138 printf(BOOLVAR?"true":"false");
142 if (SCALE==0) /* we might even print leading zeros "%0*d" */
143 { exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
144 printf("%*d",PRECISION,INTVAR);
147 { exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
148 printf("%*.*f",PRECISION+1,SCALE,FLOATVAR);
153 exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
158 exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
159 printf("%f",FLOATVAR);
161 case SQL3_DOUBLE_PRECISION:
162 exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
163 printf("%f",DOUBLEVAR);
165 case SQL3_DATE_TIME_TIMESTAMP:
168 case SQL3_CHARACTER_VARYING:
170 exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
171 printf("'%s'",STRINGVAR);
179 exec sql close MYCURS;
181 exec sql deallocate descriptor MYDESC;