炽翼铁冰's Blog

Trying to become a programmer
C不定参数写法
C字符数组赋值

动态SQL语句写法

炽翼铁冰 posted @ 2009年11月20日 07:31 in C(转载) , 4074 阅读

一、下面的这段动态SQl代码只是对从数据库中表中取得固定个数的字段的时候加以使用:

int TestTabPre()
{
 
   EXEC SQL BEGIN DECLARE SECTION;
     int      countFlag;
     VARCHAR  dynstmt[5000];
     char     SubSQL [5000];   
     char     A_char[100];
  EXEC SQL END DECLARE SECTION;

    memset(SubSQL,0,sizeof(SubSQL));
   
   
    /*动态SQL的生成*/   
    strcpy(SubSQL,"SELECT ");
    strcat(SubSQL," A");
    strcat(SubSQL," FROM  TBL_WKKTDAYKEIREKI");
    strcat(SubSQL,"   WHERE    NO = '");
    strcat(SubSQL,"020316");
    strcat(SubSQL,"'");

    /*动态SQL的在数据库中解析*/   
     strcpy((char *)dynstmt.arr,SubSQL);
     dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
     EXEC SQL  PREPARE S FROM :dynstmt;
     EXEC SQL  DECLARE CC CURSOR FOR S;

    /*动态SQL的在游标的打开*/   
     EXEC SQL  OPEN CC ;
     if(sqlca.sqlcode != 0)
     {   
        /*游标的打开ERROR*/
     return -1;
     }
     for(;;)
     {
        memset(A_char,0,sizeof(A_char));
        EXEC SQL FETCH CC INTO :A_char;
        if(sqlca.sqlcode ==0 )
        {   
             /*游标的打开成功*/
                ...
             
        }
        else if(sqlca.sqlcode ==1403)
        {
            /*游标的打开完毕*/
            break;
        }
        else
        {
            /*游标fetch中出现ERROR*/
           EXEC SQL  CLOSE CC ;
           return -1;
        }

   }  /*end for*/
   
    EXEC SQL  CLOSE CC ;
    return 0;
 
}

二、对于从数据库一个表中取得不固定的字段,并且这些字段的数据类型也不明确时,就要使用数据库(Oracle)自带结构体来解决。
 

 

EXEC SQL INCLUDE sqlda;
SQLDA * select_dp;

int DbOperate(char * sql,char * id, char * name)
{
    EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR  dynstmt[5000];
        char     SubSQL [5000];   
        EXEC SQL VAR SubSQL IS STRING(5000);
    EXEC SQL END DECLARE SECTION;

    char  strid[6];
   
    int i,null_ok,precision,scale;
    char foruda[100];
 
   
    memset(strid,0,sizeof(strid));
    memset(foruda,0,sizeof(foruda));

 
    /* if (access(KARI_FILE_PATH,0) != 0)
     {     
        sprintf(foruda,"mkdir -m 777 ../%s",FindSelect(KARI_FILE_PATH));   
        system(foruda);
     }*/

       
     i = setjmp(jmp_continue);
   
     /*不定的SQL的传入*/
     strcpy(SubSQL,sql);

     /*SQL的解析*/
     strcpy((char *)dynstmt.arr,SubSQL);
     dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
     memset(select_dp,0,sizeof(select_dp));
     EXEC SQL  PREPARE S FROM :dynstmt;
   
     if(sqlca.sqlcode != 0)
     {
       printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
        /*ERROR*/
        return -1;
     }

     EXEC SQL DECLARE CC CURSOR FOR S;
     EXEC SQL  OPEN CC;
     
     if(sqlca.sqlcode != 0)
     {
         printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
         return -1;
     }
      /*SQL的所需最大的字段的条数*/
     select_dp->N = MAX_ITEMS;
     EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;
     
      if(sqlca.sqlcode != 0)
     {
         printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
         return -1;
     }
     
     memset(select_dp,0,sizeof(select_dp));
     if(select_dp->F<0)
     {
        return -1;
     }
      /*重新设置最大条数*/
     select_dp->N = select_dp->F;
     
     for(i=0;i<select_dp->F;i++)
     {
               
        sqlnul(&(select_dp->T[i]),&(select_dp->T[i]),&null_ok);
        /*类型的转化*/
        switch(select_dp->T[i])
        {
            case 1:
                  select_dp->L[i]=select_dp->L[i] * 2 + 4;
                  break;
            case 2:
                 sqlprc(&(select_dp->L[i]),&precision,&scale);
                   if(precision==0) precision =40;
                 select_dp->L[i]=precision+2;
                 break;
            case 8:select_dp->L[i]=240;
                 break;
            case 11:
                 select_dp->L[i]=18;
                 break;
            case 12:
               
                 select_dp->L[i]=9;
                 break;
            case 23:
                 break;
            case 96:
                 select_dp->L[i]=select_dp->L[i] + 2;
            case 24:
                 select_dp->L[i]=240;
                 break;
      }
       select_dp->V[i]=(char *)realloc(select_dp->V[i],select_dp->L[i]+1);
       if(select_dp->T[i]!=24)
       {
           select_dp->T[i]=5;
       }
     }
     
      if(sqlca.sqlcode != 0)
      {
        printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
        ProcDBerror();
         /*ERROR*/
         return -1;
      }
        for(;;)
        {
           
           EXEC SQL WHENEVER SQLERROR DO ProcDBerror();
         
           EXEC SQL AT :gbDb_name FETCH CC USING DESCRIPTOR select_dp;
             if(sqlca.sqlcode ==0 )
             {
                  for(i=0;i<select_dp->F;i++)
                     {
                            printf("entry=[%s]\n".select_dp->V[i]);
                         
                     }
                 
          }
          else if( sqlca.sqlcode==1403 )
          {
                break;
          }
          else
          {
             return -1;
          }
         
       }/* for(;;)end*/
      /*free 释放空间*/
     for(i=0;i<MAX_ITEMS;i++)
     {
       free(select_dp->I[i]);
       free(select_dp->V[i]);
     }
     sqlclu(select_dp);
     EXEC SQL AT :gbDb_name CLOSE CC;
     EXEC SQL  AT :gbDb_name COMMIT WORK RELEASE;
   
   }/*end else*/
     
     
     /*sprintf(path,"iconv -c -f UTF-8 -t shift_jis %s >%s",csvfilepath,id);*/
     /*system(path);*/
     return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter