http://www.cnoug.org/viewthread.php?tid=17870

解决方案 »

  1.   

    这是我程序中的一个函数,会经常调用此函数,出问题的地方已经标出,请帮忙看看,谢谢
    EXEC ORACLE OPTION (RELEASE_CURSOR=YES); sprintf((char *)pcSQL.arr,"%s","SELECT nvl(ID,-1) FROM TABLE1 ");
    pcSQL.len = strlen((char *)pcSQL.arr);

    EXEC SQL WHENEVER SQLERROR GOTO NO_FOUND;
    EXEC SQL WHENEVER NOT FOUND GOTO NO_FOUND;

    EXEC SQL PREPARE S FROM :pcSQL;
    EXEC SQL DECLARE t_cur CURSOR FOR S;
    EXEC SQL OPEN t_cur;

    for(;;)
    {
    EXEC SQL FETCH t_cur INTO :lId;//此句占用一个cursor,个数不增加

    EXEC SQL WHENEVER SQLERROR DO sql_msg((char*)"Error When Select number .");
    EXEC SQL SELECT COUNT(*) INTO :number FROM TABLE2 WHERE ID=:lId;

    for(int i=1;i<=number;i++)
    {
    number1=i;
    EXEC SQL SELECT CODE INTO :Code FROM TABLE3 WHERE ID=:lId AND INDEX=:number1;

    //此句占用cursor,而且占用的数量会增加
    EXEC SQL SELECT COUNT(*) INTO :num FROM table4 WHERE CODE=:vcCityCode;
    if(i==1&&num==1) 
    {
    break;
    }
    if(i==1&&num==0)
    {
            continue;
    }
    if(i!=1&&num==0) 
    {
    continue;
    }
    if(i!=1&&num==1)
    {
    EXEC SQL PREPARE V FROM :pcSQL1;
    EXEC SQL DECLARE v_cur CURSOR FOR V;
    EXEC SQL OPEN v_cur;
    for(;;)
    {
    fetch into ***  ;//一些操作
    }
    NO_FOUND1:
    EXEC SQL CLOSE v_cur;
    }
    break;
    }
    }
    NO_FOUND:
    EXEC SQL CLOSE t_cur;
      

  2.   

    在fetch后加上 exit when *****%notfound 试试****表示你的游标感觉你的for(int i=1;i<=number;i++)这句是造成游标增大的原因为什么不用动态游标呢?