今天接到同事的电话,说一个项目中的数据库出了问题,日志里记录的是ORA-01001: INVALID CURSOR,而且知道是哪几个存储过程报的错,但奇怪啊,印象中这几个存储过程根本没用游标,怎么会报这个错呢?
第一反应先叫用户把alert日志文件发给我,从中并没发现任何情况,说明数据库本身的状态是好的,问题出在应用本身。安心了一大半,然后就是上网查相关资料,碰到此问题的人虽多,但也没找到是什么原因,但大致知道是因为游标没有释放导致的,至于为什么不释放就不得而知了。我们这么多的项目还是头一次碰到这问题。于是叫用户收集了一点点资料
SELECT * FROM V$OPEN_CURSOR;
居然里面查出来所有用户是是1005条,这个视图里存的好像是session里当前打开的游标,这么多显然是不正常的,为什么呢?为什么,只有天知道了。
SHOW PARAMETER CURSOR;
实在不知道是什么原因了,只好叫用户重启数据库,这也是没办法的办法了,生产系统啊,一时半会查不到原因也只能这么干了。
另外也终于知道为什么会报游标相关的错了,原来是存储过程用了隐性游标,之前理解的游标都是显式的,顺道查了点隐性游标的资料
游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以使用游标来访问结果集中的任意一行数据,提取当前行的数据后,即可对该行数据进行操作。
游标分为显式游标和隐式游标:
–当可执行部分发生一个SQL语句时,PL/SQL建立一个隐式游标,它定义SQL标识符,PL/SQL自动管理这一游标。
–显式游标由程序员显式说明及控制,用于从表中取出多行数据,并将多行数据一行一行单独处理
隐式游标被用于描述执行的SQL命令
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论