PROC*C中动态取数据问题 我是用PROC*C编程,现有一个动态的select语句,我是想每次执行此select,并根据select出来的字段个数取出各个字段的相应数据到变量中.这个不懂如何做?用游标的话,这个select的字段个数又不确定,不用FETCH到相应的变量中去,fetch语句也不能动态的执行好象,不知道如何解决,高手指导!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用动态方法四可以实现。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; } 为什么这sql语句执行的时候不走索引?? 拜师 百万数据性能如何优化 windows下连接oracle instance的问题 sql plus中scott.emp如何实现对表操作时用户的参数化,即如何变成类似 name.emp的语句 pl/sql 存储过程中 返回一个记录集,怎么返回,接受的时候怎么接受 求助:在不同用户间imp的问题 WIN2000+oracle群集,创建表空间的问题? 关于Oracle817的客户端直接做安装 oracle如何查看表变更记录。 如何更新oracle表中的分区字段 SQL-02101错误如何解决,急~~~
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;
}