当前位置: 代码迷 >> Oracle技术 >> Pro*C中游标嵌套的有关问题
  详细解决方案

Pro*C中游标嵌套的有关问题

热度:445   发布时间:2016-04-24 08:26:49.0
Pro*C中游标嵌套的问题
C/C++ code
EXEC   SQL   DECLARE   cur_001  CURSOR   FOR   SELECT  name   FROM  same_table; EXEC   SQL   OPEN  cur_001; while(1){   EXEC   SQL   FETCH   cur_001  INTO   :a;       if(sqlca.sqlcode  ==  1403   )          break;    else if(sqlca.sqlcode != 0)        return -1;   printf("%s 的成绩单如下:\n-------------------------------\n科目    |   分数\n",a);      /*当cur_001还没有被取完时*/   EXEC   SQL   DECLARE   cur_002  CURSOR   FOR   SELECT  kemu,chengji   FROM  any_talbe where name = :a;    EXEC   SQL   OPEN   cur_002;       while(1)   {       EXEC   SQL   FETCH   cur_001  INTO   :km,cj;        if(sqlca.sqlcode  ==  1403   )              break;        else if(sqlca.sqlcode != 0)           return -1;       printf("%s | %d\n-----------------------------------\n",km,cj);          }}



简单的说就是从一张表遍历所有学生名单,找到一个同学的名字后,去另外一张表建立一个新cursor遍历此新cursor。

但是当第二个cursor执行完之后,fetch第二个同学名字的时候却报:
01002, "fetch out of sequence" 错误。

根本没办法完成设想中的过程。

我想问一下,有没有办法解决这种内游标循环完成,外游标却不能继续的问题。

不要告诉我用其他方式可以解决云云,这是我把问题抽象出来,做的一个最简单的例子,

我只想知道解决这种游标嵌套问题的方法,谢谢。

------解决方案--------------------
你内层也是操作 cur_001 ?
EXEC SQL FETCH cur_001 INTO :km,cj; 

------解决方案--------------------
PROC*C中游标嵌套本身支持

两个问题:
(1) 当sqlca.sqlcode == 1403和sqlca.sqlcode != 0时,都应该关闭游标。这大概是报那个错的原因。
(2) 检查一下proc预编译参数mode是否指定了ansi,印象中如果指定了它,则sqlca.sqlcode == 100才表示记录已经读取完毕。

------解决方案--------------------
探讨

你内层也是操作 cur_001 ?
EXEC SQL FETCH cur_001 INTO :km,cj;
  相关解决方案