我是用PROC*C编程,现有一个动态的select语句,我是想每次执行此select,并根据select出来的字段个数取出各个字段的相应数据到变量中.这个不懂如何做?用游标的话,这个select的字段个数又不确定,不用FETCH到相应的变量中去,fetch语句也不能动态的执行好象,不知道如何解决,高手指导!!!

解决方案 »

  1.   

    用动态方法四可以实现。
    EXEC SQL AT :db_link_name DECLARE cur_familybasicinfo CURSOR FOR sql_stmt;
    EXEC SQL AT :db_link_name DESCRIBE BIND VARIABLES FOR sql_stmt INTO bind_des;
    EXEC SQL AT :db_link_name OPEN cur_familybasicinfo USING DESCRIPTOR bind_des;
    EXEC SQL AT :db_link_name DESCRIBE SELECT LIST FOR sql_stmt INTo select_des;
    select_des->N = select_des->F;
    int null_ok = 0, prec = 0, scal = 0;
    for(i = 0; i < select_des->F; ++i)
    {
    SQLColumnNullCheck(0, (unsigned short*)&(select_des->T[i]), (unsigned short*)&(select_des->T[i]), &null_ok); switch(select_des->T[i])
    {
    case 2: //NUMBER 类型
    SQLNumberPrecV6(0, (unsigned int*)&(select_des->L[i]), &prec, &scal);
      if (scal > 0)
      select_des->L[i] = sizeof(float);
      else
      select_des->L[i] = sizeof(uint32);
      break;
    }
    if (select_des->T[i] != 2)
    select_des->V[i] = (char*)realloc(select_des->V[i], select_des->L[i] + 1);
    else
    select_des->V[i] = (char*)realloc(select_des->V[i], select_des->L[i]);

    if (select_des->T[i] != 2)
    select_des->T[i] = 1;

    if (select_des->T[i] == 2)
    if(scal > 0)
    select_des->T[i] = 4;
    else
    select_des->T[i] = 3; }
    for(;;)
    {
    EXEC SQL AT :db_link_name FETCH cur_familybasicinfo USING DESCRIPTOR select_des;
    db_ret = sqlca.sqlcode;
    if (db_ret == 1403 || (db_ret < 0 && db_ret != -1405))
    {
    nRetCount = iNum;
    if (db_ret != 1403)
    sql_error(sqlca, oraca);
    for (i = 0; i < select_des->F; ++ i)
    {
    free(select_des->V[i]);
    free(select_des->I[i]);
    } for (i = 0; i < bind_des->F; ++i)
    {
    free(bind_des->V[i]);
    free(bind_des->I[i]);
    } sqlclu(select_des);
    sqlclu(bind_des); EXEC SQL AT :db_link_name CLOSE cur_familybasicinfo;
    return DB_SUCCESS;
    }

    for(i = 0; i < select_des->F; ++i)
    {
    switch(i)
    {
    case 0://表示第一个字段
    {
    sprintf(number, "%d", *(int*)select_des->V[i]);
    pBasicUserInfo[iNum].nID = atoi(number);
    }
    break;
    case 1:://表示第二个字段
    {
    sprintf(cval, "%.*s", (int)select_des->L[i], select_des->V[i]);
    tmpstr = cval;
    tmpstr.TrimRight();
    strcpy(pBasicUserInfo[iNum].szUserName,tmpstr);
    pBasicUserInfo[iNum].szUserName[strlen(pBasicUserInfo[iNum].szUserName)] = '\0';
    }
    break;
    case 2:
    {
    sprintf(cval, "%.*s", (int)select_des->L[i], select_des->V[i]);
    tmpstr = cval;
    tmpstr.TrimRight();
    strcpy(pBasicUserInfo[iNum].szNickName,tmpstr);
    pBasicUserInfo[iNum].szNickName[strlen(pBasicUserInfo[iNum].szNickName)] = '\0';
    }
    break;
    case 3:
    {
    sprintf(number, "%d", *(int*)select_des->V[i]);
    pBasicUserInfo[iNum].nSexy = atoi(number);
    }
    break;
    case 4:
    {
    sprintf(cval, "%.*s", (int)select_des->L[i], select_des->V[i]);
    tmpstr = cval;
    tmpstr.TrimRight();
      strcpy(pBasicUserInfo[iNum].szHeadUrl,tmpstr);
    pBasicUserInfo[iNum].szHeadUrl[strlen(pBasicUserInfo[iNum].szHeadUrl)] = '\0';
    }
    break;
    case 5:
    {
    sprintf(number, "%d", *(int*)select_des->V[i]);
    pBasicUserInfo[iNum].nHeadId = atoi(number);
    }
    break;
    case 6:
    {
    sprintf(cval, "%.*s", (int)select_des->L[i], select_des->V[i]);
    tmpstr = cval;
    tmpstr.TrimRight();
      strcpy(pBasicUserInfo[iNum].szCommentName,tmpstr);
    pBasicUserInfo[iNum].szCommentName[strlen(pBasicUserInfo[iNum].szCommentName)] = '\0';
    }
    break;
    } }
    ++iNum;
    }