今天遇到个问题,要定义一个游标从数据库中取数据,然后根据取出来的步骤标志执行相应的操作,每一步执行完后,要把库中的操作步骤更新到下一步,然后循环执行下一步,一开始想的办法是用嵌套循环,但是那样的话来回的定义游标、打开游标、关闭游标,占系统资源,而且本身也不是很好的解决办法,由于初学Pro/C,不晓得有滚动游标这一说,但是个人觉得游标fetch到最后应该有一种机制能把游标fetch的指针移到开头,然后重新从头读取,有了这个思路就上网查,可惜没找到解决办法,可喜的是看到了有个滚动游标这个东西,然后就想拿这个自己试试看能否解决我遇到的问题,呵呵,结果让我很满意,现将我的使用部分代码贴出来分享给大家:
step = 1;
for(int i=0; step <= 3; i++)
{
TZEROA(ic_offline);
if( curEndFlag )
{
i = 0;
curEndFlag = 0;
EXEC SQL FETCH FIRST g_ic_offline_cur INTO :ic_offline;
}
else
{
EXEC SQL FETCH NEXT g_ic_offline_cur INTO :ic_offline;
}
if (SQL_NOTFOUND)
{
curEndFlag = 1;
step++;
continue;
}
else if (!SQL_ISOK)
{
EXEC SQL CLOSE g_ic_offline_cur;
sleep(1);
break;
}
file_stat=ic_offline.fl_State;
TRIM(ic_offline.fs_FileName);
TZERO(tfilename);
strcpy(tfilename,ic_offline.fs_FileName);
strcat(oldname,tfilename);
strcat(newname,tfilename);
switch(file_stat)
{
case 0:
break;
case 1:
lRet=file_process(crudate,tfilename);
if(lRet<0)
{
sleep(10);
break;
}
else
{
COMLOG("文件解析成功");
}
case 2:
lRet=trans_process(crudate,tfilename);
if(lRet<0)
{
COMLOG("trans_process error lRet:[%d]",lRet);
break;
}
case 3:
COMLOG("newname:[%s]oldname:[%s]",newname,oldname);
lRet=rename(oldname,newname);
if(lRet!=0)
{
COMLOG( "rename the file:[%s] to the file:[%s] error", oldname, newname);
break;
}
TZERO(okname);
sprintf(okname, "%s.ok", oldname);
lRet = remove(okname);
if(lRet != 0)
{
COMLOG("remove the ok file[%s] error, errmsg[%s]", okname, strerror(errno));
break;
}
EXEC SQL UPDATE ticoffline
SET fl_State = 0,
fs_Date = :crudate
WHERE fs_FileName = :tfilename;
if(!SQL_ISOK)
{
COMLOG( "update state error ");
DB_Rollback();
break;
}
break;
default:
COMLOG("file_stat err:[%d]",file_stat);
}
}
阅读(1270) | 评论(1) | 转发(0) |