日期:2014-05-16  浏览次数:21040 次

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;