pro*c一个游标嵌套问题,无法解决,望大家帮忙

baosihan 2006-09-15 10:28:06
machine_id load_item
1 1
2 2
3 3
4 4
5

我想通过游标嵌套遍历删除(machine_id,load_item)中最近执行的指令
即分别删除(1,1),(1,2),(1,3)......(5,3),(5,4)共20个表中最近执行的指令

我写的代码如下:
void sql()
{
EXEC SQL BEGIN DECLARE SECTION;
int a;
int b;
EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE bssp_machine_cursor CURSOR FOR SELECT MACHINE_ID FROM bssp_machine;
EXEC SQL OPEN bssp_machine_cursor;
EXEC SQL WHENEVER NOT FOUND DO break;

EXEC SQL DECLARE bssp_batch_load_config_cursor CURSOR FOR SELECT LOAD_ITEM FROM bssp_batch_load_config;
EXEC SQL OPEN bssp_batch_load_config_cursor;
EXEC SQL WHENEVER NOT FOUND DO break;


for(;;)
{
EXEC SQL FETCH bssp_machine_cursor INTO :a;

for(;;)
{
EXEC SQL FETCH bssp_batch_load_config_cursor INTO :b;
printf("a的值:%d,b的值:%d\n",a,b);
EXEC SQL DELETE FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b and LAST_DONE_DATE=(SELECT max(LAST_DONE_DATE) FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b);

if(sqlca.sqlcode==0)
cout<<"删除成功!"<<endl;
else
{
cout<<"删除失败!"<<endl;
EXEC SQL ROLLBACK;
cout<<"删除失败!"<<endl;
EXEC SQL CLOSE bssp_batch_load_config_cursor;
cout<<"删除失败!"<<endl;
}

}
}
EXEC SQL CLOSE bssp_batch_load_config_cursor;
EXEC SQL CLOSE bssp_machine_cursor;
}

可是执行的结果却是
a的值:1,b的值:1 删除成功!
a的值:2,b的值:2 删除成功!
a的值:3,b的值:3 删除成功!
a的值:4,b的值:4 删除成功!
只删了4个表的指令,没有完成遍历
不知道如何修改,所以来请教大家下
...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wiler 2006-09-15
  • 打赏
  • 举报
回复
回到第一条好象只有重新打开游标了,:)
你按楼上的这个方法就可以了
Eric_1999 2006-09-15
  • 打赏
  • 举报
回复
明白,漏了一句
楼主试试,希望听到你的好消息。~~~~~
for(;;)
{
EXEC SQL FETCH bssp_machine_cursor INTO :a;
EXEC SQL DECLARE bssp_batch_load_config_cursor CURSOR FOR SELECT LOAD_ITEM FROM bssp_batch_load_config;//漏了这个。
EXEC SQL OPEN bssp_batch_load_config_cursor;

for(;;)
{
EXEC SQL FETCH bssp_batch_load_config_cursor INTO :b;
EXEC SQL WHENEVER NOT FOUND DO break;
printf("a的值:%d,b的值:%d\n",a,b);
EXEC SQL DELETE FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b and LAST_DONE_DATE=(SELECT max(LAST_DONE_DATE) FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b);

if(sqlca.sqlcode==0)
cout<<"删除成功!"<<endl;
else
{
cout<<"删除失败!"<<endl;
EXEC SQL ROLLBACK;
cout<<"删除失败!"<<endl;
EXEC SQL CLOSE bssp_batch_load_config_cursor;
cout<<"删除失败!"<<endl;
}

}
EXEC SQL CLOSE bssp_batch_load_config_cursor;
}
baosihan 2006-09-15
  • 打赏
  • 举报
回复
谢谢eric,我修改后程序如下:
for(;;)
{
EXEC SQL FETCH bssp_machine_cursor INTO :a;
EXEC SQL OPEN bssp_batch_load_config_cursor;

for(;;)
{
EXEC SQL FETCH bssp_batch_load_config_cursor INTO :b;
EXEC SQL WHENEVER NOT FOUND DO break;
printf("a的值:%d,b的值:%d\n",a,b);
EXEC SQL DELETE FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b and LAST_DONE_DATE=(SELECT max(LAST_DONE_DATE) FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b);

if(sqlca.sqlcode==0)
cout<<"删除成功!"<<endl;
else
{
cout<<"删除失败!"<<endl;
EXEC SQL ROLLBACK;
cout<<"删除失败!"<<endl;
EXEC SQL CLOSE bssp_batch_load_config_cursor;
cout<<"删除失败!"<<endl;
}

}
EXEC SQL CLOSE bssp_batch_load_config_cursor;
}

结果为:a的值:1,b的值:1
删除成功!
a的值:1,b的值:2
删除成功!
a的值:1,b的值:3
删除成功!
a的值:1,b的值:4
删除成功!
a的值:2,b的值:1
删除成功!
a的值:3,b的值:1
删除成功!
a的值:4,b的值:1
删除成功!
a的值:5,b的值:1
删除成功!
baosihan 2006-09-15
  • 打赏
  • 举报
回复
谢谢wiler,确实是第二游标没有返回到第一条

能否详细说明下该如何令其返回到第一条,
Eric_1999 2006-09-15
  • 打赏
  • 举报
回复
应该这样,//后面加上相应的语句就可以了。
for(;1;)//不停循环
{
EXEC SQL FETCH bssp_machine_cursor INTO :a;
//重新打开load_item游标
for(;1;)//不停循环
{
EXEC SQL FETCH bssp_batch_load_config_cursor INTO :b;
when EXIT WHEN bssp_batch_load_config_cursor%NOTFOUND;;//表示游标load_item数据取完了,我不知道proc怎么写。

printf("a的值:%d,b的值:%d\n",a,b);
EXEC SQL DELETE FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b and LAST_DONE_DATE=(SELECT max(LAST_DONE_DATE) FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b);

if(sqlca.sqlcode==0)
cout<<"删除成功!"<<endl;
else
{
cout<<"删除失败!"<<endl;
EXEC SQL ROLLBACK;
cout<<"删除失败!"<<endl;
EXEC SQL CLOSE bssp_batch_load_config_cursor;
cout<<"删除失败!"<<endl;
}
//关闭load_item游标
}
}
baosihan 2006-09-15
  • 打赏
  • 举报
回复
按照Eric_1999的方法修改
结果为:
a的值:1,b的值:1
删除成功!
a的值:1,b的值:2
删除成功!
a的值:1,b的值:3
删除成功!
a的值:1,b的值:4
删除成功!
a的值:2,b的值:4
删除成功!
a的值:3,b的值:4
删除成功!
a的值:4,b的值:4
删除成功!
a的值:5,b的值:4
删除成功!

wiler 2006-09-15
  • 打赏
  • 举报
回复
#define SQLNOTFOUND 1403

然后在循环中加上这个语句
if(sqlca.sqlcode == SQLNOTFOUND )
break;

另外第二游标读到最后一条后需要重新打开或者让游标指针回到第一条
Eric_1999 2006-09-15
  • 打赏
  • 举报
回复
很明显是你循环有问题。for之运行了一次,没运行完。
for(;1;)//不停循环
{
EXEC SQL FETCH bssp_machine_cursor INTO :a;
when EXIT WHEN bssp_machine_cursor%NOTFOUND;//表示游标数据取完了,我不知道proc怎么写。
for(;1;)//不停循环
{
EXEC SQL FETCH bssp_batch_load_config_cursor INTO :b;
when EXIT WHEN bssp_batch_load_config_cursor%NOTFOUND;;//表示游标数据取完了,我不知道proc怎么写。

printf("a的值:%d,b的值:%d\n",a,b);
EXEC SQL DELETE FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b and LAST_DONE_DATE=(SELECT max(LAST_DONE_DATE) FROM bssp_batch_load_log WHERE MACHINE_ID=:a and LOAD_ITEM =:b);

if(sqlca.sqlcode==0)
cout<<"删除成功!"<<endl;
else
{
cout<<"删除失败!"<<endl;
EXEC SQL ROLLBACK;
cout<<"删除失败!"<<endl;
EXEC SQL CLOSE bssp_batch_load_config_cursor;
cout<<"删除失败!"<<endl;
}

}
}

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧