ProC血的教训之二!游标使用完关闭之后最好释放!

原创 2013年12月04日 12:12:55

在经历上一个教训并解决问题之后,本以为可以高枕无忧了,结果又遇到一个问题,在多次拔插网线之后,程序运行到fetch cursor的时候就崩掉了,任何信息都没有提示。我确定是上下文的问题,但是怎么也改不好,我的程序没有用到多线程,而且reconnect之前也都关闭数据库连接了,为了确定使用全局上下文,我在每个函数开始的地方加了EXEC SQL CONTEXT USE DEFAULT这句,还是在EXEC SQL处崩溃!又花了我半天的时间,终于找到原因。

在最后时刻,我想,为什么这次出现问题的总是游标?而且总是在fetch的地方?为什么declare 游标没问题,open也没问题?我在fetch游标之前加了一句普通的SQL,发现是没问题的,这更加让我确定是游标的问题。可是开始游标是可以正常执行fetch的啊,我每次都declare-->open-->fetch-->close,对了,程序每次都declare,这不是重复声明吗?为什么之前没有问题,close对应的貌似是open,declare的时候或许是这样的,如果没有这个游标就创建,有的话就使用原来的,难道declare对应的还有一个反操作?我能想到的就是销毁或者就是RELEASE,于是网上一搜,还真有,是我基础不扎实,关键在下面这段话:


关于游标的释放

在一个连接中,若该连接引用记数为1,则关闭该连接也释放游标;如在同一个进程中打开连接,操作数据,关闭连接。

若连接记数大于1,如父进程打开连接,子进程共享该连接进行操作,则连接记数大于1,子进程不能做关闭连接操作。此时要释放一个游标,在关闭游标后,还必须做commit或rollback;此外,还要设置release_cursor选项为yes,设置方法是在proc命令行中增加release_cursor=yes,或在程序中编写:

EXEC ORACLE OPTION(RELEASE_CURSOR=YES);  

否则不能释放,最终会报-1000错:maximum open cursors exceeded。

我有点明白了,declare的游标也是与数据库连接或者上下文绑定的,如果没有释放的话,这个游标还是存在的,那么当程序连接换到另一个时,使用游标却还是在原来的那个连接上,所以可能会导致莫名奇妙的错误。于是我在游标close之后加了

EXEC ORACLE OPTION(RELEASE_CURSOR=YES),经过测试,没有再出现程序崩溃的问题。
因此,在程序可能会使用多个数据库连接的情况,游标使用完最好要释放。

检索和关闭游标+检索游标+关闭游标

检索和关闭游标 1打开游标后,游标对应的select语句也就被执行了,如果想要获取结果集中的数据,就需要检索游标。检索游标 1从结果集中获取单行数据,并保存到定义的变量中 语法fetch cur...
  • zhou920786312
  • zhou920786312
  • 2017年05月23日 15:50
  • 330

PROC--oracle中游标的使用

Oracle中的游标 Oracle使用两种游标: 显式游标和隐式游标.  不管语句返回多少条记录, Oracle为 每条使用的SQL语句隐式地定义一个游标. Oracle 为每个DELETE , ...
  • u012960623
  • u012960623
  • 2014年04月16日 12:06
  • 1959

oracle超出打开游标的最大数的原因和解决方案

处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_open_cursors_exceeded_ ...
  • kai27ks
  • kai27ks
  • 2012年06月05日 10:36
  • 45989

oracle查看当前打开的游标数目和连接数目

oracle查看当前打开的游标数目和连接数目  select count(*) from v$open_cursor;select   count(*)   from   v$session;...
  • xymyeah
  • xymyeah
  • 2007年07月05日 13:59
  • 6964

oracle 跳出循环方法

记录exit和return的用法 1.exit用来跳出循环 Oracle代码: declare V_KBP varchar2(10); begin loop IF V_KBP IS...
  • lqh4188
  • lqh4188
  • 2011年12月11日 17:49
  • 11042

Proc *C/C++入门之游标访问数据库

数据类型转换 Oracle外部数据类型中的string是以零结尾的字符串,类似于varchar2类型! char在数据不满的时候,后面部分会被填充为空格 在SQL语句中的宿主数据类型可以人为的转换为O...
  • lzjsqn
  • lzjsqn
  • 2017年01月11日 19:21
  • 560

游标的使用方法

游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。 1.游...
  • lianjianguo888
  • lianjianguo888
  • 2011年08月25日 10:48
  • 2286

proc游标和异常

游标的使用步骤:        1.  声明游标                     cursor   游标名   is   游标中的执行语句        2.  打开游标 ...
  • free_syj
  • free_syj
  • 2011年10月28日 16:14
  • 706

查询数据库锁和程序未释放的连接

SELECT /*+ rule*/  B.INST_ID,  A.EVENT,  C.SID,  B.SPID,  C.MACHINE,  C.SECONDS_IN_WAIT,  'ki...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2014年05月03日 22:03
  • 3877

错误笔记:写项目时用PreparedStatement向数据库中插入数据报游标不足错误

今天在写一个电信宽带运营支撑系统时,报了一个游标不足的错误,一脸蒙,代码是这样....................
  • yang505581644
  • yang505581644
  • 2017年11月23日 19:44
  • 32
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ProC血的教训之二!游标使用完关闭之后最好释放!
举报原因:
原因补充:

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