在Delphi下面正常使用ADo访问 Oracle(8i)数据库,出现异常,异常内容是ORA-01000: maximum open cursors exceeded,我修改了程序,每次打开ADoQuery,使用完毕后关闭ADoquery,再程序结束的时候关闭ADoConnection,可是仍然经常出现上面大的异常,我再网上查了一下说是同时打开的游标太多导致的,不知道如何避免该错误的发生?

解决方案 »

  1.   

    可能是就要很多cursor,修改数据库参数open_cursors,改大点即可。
      

  2.   

    你要贴出你的访问数据库的SQL语句,有可能语句写的有问题
      

  3.   

    我使用的Oracle的版本为Oracle8i, 如何修改让数据库可以打开的cursors数目大一些?好像initORCL.ora文件里面也没有关于Open_cursor的选项啊,我刚刚重启了机器,然后运行PL/SQL查询一下:
    select * from v$parameter where name='open_cursors' 查询出来的结果是Value=50,这个值是允许打开的最大游标数还是已经打开的游标数啊,照道理应该机器重启了,打开的游标数为0才对啊
      

  4.   

    默认是300,如果有可能300以上用户同时执行更新操作的话就会出现该问题,如果每个用户都是只在更新是用一下游标然后就关闭,那么一定是代码里有某一部分循环打开游标的,请仔细检查代码,我对delphi不太熟,不知道它有没有类似于java里的statement对象的对象,在连接上循环创建打开和关闭游标的对象会造成游标资源耗竭,这也可能导致该问题;
    你可以先把游标数根据系统业务量增大,如果还不行或者本身系统只处于开发/测试阶段没多少业务的话,那就好好检查代码吧
      

  5.   

    initORCL.ora里应该有一条
    *.open_cursors=300
    没有的话加上条试下看(一定要大于300,因为默认的就是300)
      

  6.   

    谢谢各位,我在InitORCL.ora文件里面加上了
    open_cursors=500,然后重启了Oracle服务器,现在程序运行正常。
    但是我实在不明白是在哪里打开了那么的cursor,我的客户端程序只用了一个DbConnection,而且,每次使用完数据集后就及时关闭了,读取数据库内容的代码类似下面的:  SQLText:='SELECT * FROM PointInfo ';
      FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText);
      with FDataDM.ADOQuery do
      begin
        Try
        WHILE NOT EOF do
        begin
          PointObj:=TPointObject.Create;
          PointObj.PointCode:=FieldByName('Code').AsString;            
          FList.Add(PointObj);
          Next;
        end;
        Finally
        FDataDM.ADOQuery.Close;
        end;
      end;其中FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText);是自己定义的一个函数,用来打开数据集,加入了异常处理,不知道以后数据量大的情况下还会不会发生类似的问题。
    这段代码在MSSQL数据库里运行是完全正常的,没有任何问题。