(03)开发之游标顾头不顾尾

原创 2013年12月03日 21:05:35
    不知有人碰到过这种情况没,程序运行一段时间后,报ORA-01000: 超出打开游标的最大数。
这种情况很大可能是开发在写程序时,对游标误用或没有注意引起。
   如有可能在一个循环中,在打开游标后,并没有即时或没有关闭游标,很容易就出现这种问题了,这时一定要让开发记得,有始要有终 ,游标要记得即时关闭。

 另一种比较小的可能性是资源释放没有问题,确实是数据库的最大游标数太小了.

具体分析下.
  1. 查看游标相关参数 
   --查看库中每个session可打开的最大游标数
    show parameter open_cursors;
    --PL/SQL 游标高速缓存
    --高速缓存可以避免用户再次执行语句时重新进行语法分析。这个值设置得足够高, 可以防止应用程序耗尽打开的游标。
    show parameter session_cached_cursors;
  2.统计库当前库游标使用情况   
-- 输入指定用户名查询,要查全部可输入'%'
 select o.sid, s.osuser, s.machine, count(*) num_curs
  from v$open_cursor o, v$session s
 where o.sid=s.sid
   and o.user_name like '&1'
 group by o.sid, osuser, machine
 order by num_curs desc;
  3. 对怀疑的sid查看其具体的sql情况
   select o.sid,q.sql_text
    from v$open_cursor o, v$sql q
   where q.hash_value =o.hash_value
     and o.sid = 158;
 上面是分步说明,为了省事,下面把它们合成一条语句了.
with cso as
 ( select o.sid, s.osuser, s.machine, count(*) num_curs
   from v$open_cursor o, v$session s
  where o.sid=s.sid
    and o.user_name like '&1'
  group by o.sid, osuser, machine
  )
 select o.sid,q.sql_text
   from v$open_cursor o, v$sql q
  where q.hash_value=o.hash_value and o.sid = (
        select sid from cso where num_curs =
            (select max(num_curs) from cso)
         ) ;

解决方法:
 如确实是数据库的session最大游标数太小了
 --1.加大open_cursors参数
 alter system set open_cursors=1000 scope=both;
    --2.加大标高速缓存数
 alter session set session_cached_cursors=100;
   -- 附上一条sql,可查指定sid的当前游标参数使用情况
  select sid,n.name,s.value used
  from
     sys.v_$statname n,
     sys.v_$sesstat s
   where s.statistic# = n.statistic#
      and n.name in ('opened cursors current', 'session cursor cache count')
    and sid= sid号

 如由程序引起. 由具体sql排查相关程序,找到责任人,小小K他一顿. 嘿嘿.

MAIL:xcl_168@aliyun.com
Blog:http://blog.csdn.net/xcl168
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

oracle开发中的存储过程,游标,if判断经典例子

1.简单输出 create or replace procedure t_xuanze(name in varchar) as tname varchar(10); begin dbms_o...

存储过程,从新的视角看待数据库应用程序开发(游标,变量,结果集)

存储过程,从新的视角看待数据库应用程序开发(游标,变量,结果集) by ColdZoo 2015年03月26日 通常情况下,在操作数据库里数据的时候,我们会选择一种编程语言(Java,C++, e...
  • ColdZoo
  • ColdZoo
  • 2015年03月26日 20:33
  • 488

SQL Server 开发指南--- 事务、异常和游标

SQL Server 事务、异常和游标本文转载至http://www.cnblogs.com/hoojo/archive/2011/07/21/2112559.html事务    在数据库中有时候需要...
  • ohonyes
  • ohonyes
  • 2015年06月01日 00:26
  • 214

Android开发笔记(三十一)SQLite游标及其数据结构

ContentValues ContentValues类似于映射,也是用于存储键值对。区别之处在于ContentValues的键只能是字符串,查看ContentValues的源码,会发现其内部保存键值...
  • aqi00
  • aqi00
  • 2015年12月29日 09:03
  • 1308

黑马程序员_学习日记51_621数据库开发及ADO.Net(游标、动态sql)

一、SqlHelper报异常 “类型初始值引发异常”,说明SqlHelper类中的字段、属性设置错误。   二、游标 (一)使用步骤 --1、定义游标 declare cur_MySt...

Oracle PL/SQL开发基础(第二十六弹:游标变量)

前面介绍游标的时候,可以看到,美定义一个游标,就为其绑定一个查询语句,这种游标称为静态游标。游标变量是另一种类型的游标,在定义时并不绑定到具体的查询,而是可以打开任何类型兼容的查询,灵活性相当大。 ...

mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表

使用游标双层嵌套对总表进行拆分为帖子表和恢复表---------- 注意点: (1)进行拆分的总表表名是不同的,所以创建临时表,把总表的数据先插入临时表 (2)为了避免最外层游标轮询数据结束时,抛出 ...

Oracle PL/SQL开发基础(第二十四弹:游标基本结构)

游标简介 游标只是一个指向查询语句返回结果的指针,因此在游标定义时,将包含一个查询定义。当游标打开后,数据被接收到一块内存区域存储,直到游标关闭。 游标实际上指向的是一块内存区域,这块内存区域位于...

PL/SQL笔记--PLSQL应用开发_游标

1、CURSOR综述 l  cursor是用于提取多行数据集 l  游标的使用   2、申明游标 l  申明语法 declare        CURSER ...

Oralce 开发包 和 游标

--________________________________开发包______________________________________________________ --包...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(03)开发之游标顾头不顾尾
举报原因:
原因补充:

(最多只允许输入30个字)