对OCI_C调用中ODSC()函数的改进
中国人民银行保山分行科技科 周易达
(邮编:678000 电话:0875 2218361)
在多用户xenix 系统中,ORACLE数据库的应用日益广泛,尤其是OCI_C调用接口函数,为程序员提供了方便快捷的调用方式。笔者在实际操作调用中,发现调用ODSC()函数查找表结构中字段名、类型、长度时存在着如下的问题:
⒈查出的数据类型不直观。即不是用“C、N、D” 来表示,而是用数据类型码来表示。
⒉对数值型字段,查出来的长度都是22,不能反映出字段的实际长度。
⒊查不出双精度数值字段的小数位数。
为此,笔者编写了DESC()函数,圆满的解决了上述问题,源程序清单如下:
"ex.c"
#include <curses.h>
#include <ctype.h>
main()
{
int i,n;
char *uid="scoot/tiger",*tab="emp";
char name[100][32],type[100][2];
int len[100],dec[100];
n=desc(uid,tab,name,type,len,dec);
printf("emp:\n");
for(i=0;i<n;i++)
{
printf("name=%-20s type=%s len=%-3d dec=%d\n",\
name[i],type[i],len[i],dec[i]);
}
}
"desc.c"
char txt[100][81],sql[81];
desc(uid,tab,name,type,len,dec)
char *uid,tab[],name[100][32],type[100][2];
int len[100],dec[100];
{
FILE *fopen(),*file;
int i,j,m,n;
file=fopen("F1","w");
sprintf(sql,"%s\n",uid);
fputs(sql,file);
sprintf(sql,"%s\n","spool desc");
fputs(sql,file);
sprintf(sql,"%s %s\n","desc",tab);
fputs(sql,file);
fclose(file);
sprintf(name,"sqlplus<F1 >/dev/null 2>/dev/null");
system(name);
system("rm F1");
file=fopen("desc.lst","r");
for(i=0;i<3;i++) fgets(sql,80,file);
for(i=0;;i++)
{
fgets(txt[i],80,file);
if(strlen(txt[i])<1) break;
txt[i][strlen(txt[i])-1]='\0';
}
fclose(file);
i=i-2;
for(n=0;n<i;n++)
{
strcpy(name[n],"");
strcpy(type[n],"");
len[n]=0;dec[n]=0;
for(j=1;j<32;j++)
{
name[n][j-1]=txt[n][j];
if(txt[n][j]==' ') break;
}
name[n][j-1]='\0';
type[n][0]=txt[n][42];
type[n][1]='\0';
if(type[n][0]=='C') /*求字符型字段长度*/
for(m=0,j=47;;j++)
{
if(txt[n][j]==')') break;
m=(txt[n][j]-48)+10*m;
}
len[n]=m;
if(type[n][0]=='N') /*求数值型字段长度*/
{
for(m=0,j=49;;j++)
{
if(txt[n][j]==')' || txt[n][j]==',') break;
m=(txt[n][j]-48)+10*m;
}
len[n]=m; m=0;
if(txt[n][j]==',') /*求数值型字段小数位数*/
for(j++;;j++)
{
if(txt[n][j]==')') break;
m=(txt[n][j]-48)+10*m;
}
dec[n]=m;
}
if(type[n][0]=='D') len[n]=10; /*求日期型字段长度*/
}
return(i);
}