写程序的时候,查出来的数据多的时候出现了这样一个问题,怎么优化代码解决这种问题。
System.Data.OracleClient.OracleException-- ORA-01000: 超出打开游标的最大数。
数据少时没有这种问题。

解决方案 »

  1.   

    游标没关,肯定是的,游标每个用户是有上限的,游标的数量由数据库参数文件中的OPEN_CURSORS参数定义.
      

  2.   

    1.检查你的程序,是否有大量游标没有关的情况?
    2.review 你的open_cursors 设置情况,看是否设置合理
      

  3.   

    v$open_cursor查看游标以下2个命令查看相关的配置:
    show parameter process;
    show parameter cursor;
      

  4.   

    一般执行完后一段时间不用就会自动关闭的, 如果超过了数据库规定的最大, 那么就改大点:
    SQL> show parameter cursor;NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    cursor_sharing                       string      EXACT
    cursor_space_for_time                boolean     FALSE
    open_cursors                         integer     300
    session_cached_cursors               integer     20SQL> alter system set open_cursors = 500 scope = both;System altered.SQL> show parameter cursor;NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    cursor_sharing                       string      EXACT
    cursor_space_for_time                boolean     FALSE
    open_cursors                         integer     500
    session_cached_cursors               integer     20
    也可能是由于异常频繁发生, 导致过多的游标打开
             EXCEPTION
               WHEN OTHERS THEN
                   IF ( CUR_C1%ISOPEN = TRUE ) THEN
                             CLOSE CUR_C1;
                         END IF;
      

  5.   

    1、增加OPEN_CURSORS的上线,不过治标不治本。2、程序里使用的时候记得要先关后开!循环里尽量不要有开的语句,循环中写这个最容易出事!万一没有注意就有的玩了!
      

  6.   

    查询当前打开游标的最大数:
     select count(*) from v$open_cursor;
    修改最大数:
       alter        system        set        open_cursors=1000;   
      

  7.   

    open_cursors 是对每个session设置的,不是全局,因此,需要这样查:
    select sid,count(*)  from v$open_cursor group by sid order by 2 desc ;