对OCI_C调用中ODSC()函数的改进


 

        OCI_C调用中ODSC()函数的改进

        

       中国人民银行保山分行科技科 周易达

       (邮编:678000 电话:0875 2218361)

 

 

  在多用户xenix 系统中,ORACLE数据库的应用日益广泛,尤其是OCI_C调用接口函数,为程序员提供了方便快捷的调用方式。笔者在实际操作调用中,发现调用ODSC()函数查找表结构中字段名、类型、长度时存在着如下的问题:

  ⒈查出的数据类型不直观。即不是用“CND 来表示,而是用数据类型码来表示。

  ⒉对数值型字段,查出来的长度都是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);

}