风影子
作者风影子·2011-02-27 20:19
数据库管理员·深圳

奇怪的ORA-01001

字数 1850阅读 7428评论 0赞 0

  今天接到同事的电话,说一个项目中的数据库出了问题,日志里记录的是ORA-01001: INVALID CURSOR,而且知道是哪几个存储过程报的错,但奇怪啊,印象中这几个存储过程根本没用游标,怎么会报这个错呢?

    第一反应先叫用户把alert日志文件发给我,从中并没发现任何情况,说明数据库本身的状态是好的,问题出在应用本身。安心了一大半,然后就是上网查相关资料,碰到此问题的人虽多,但也没找到是什么原因,但大致知道是因为游标没有释放导致的,至于为什么不释放就不得而知了。我们这么多的项目还是头一次碰到这问题。于是叫用户收集了一点点资料

SELECT * FROM V$OPEN_CURSOR;

 居然里面查出来所有用户是是1005条,这个视图里存的好像是session里当前打开的游标,这么多显然是不正常的,为什么呢?为什么,只有天知道了。

SHOW PARAMETER CURSOR;

NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ cursor_sharing                       string      EXACT cursor_space_for_time                boolean     FALSE open_cursors                         integer     300 session_cached_cursors               integer     20


实在不知道是什么原因了,只好叫用户重启数据库,这也是没办法的办法了,生产系统啊,一时半会查不到原因也只能这么干了。

另外也终于知道为什么会报游标相关的错了,原来是存储过程用了隐性游标,之前理解的游标都是显式的,顺道查了点隐性游标的资料

游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以使用游标来访问结果集中的任意一行数据,提取当前行的数据后,即可对该行数据进行操作。

游标分为显式游标和隐式游标:

–当可执行部分发生一个SQL语句时,PL/SQL建立一个隐式游标,它定义SQL标识符,PL/SQL自动管理这一游标。

–显式游标由程序员显式说明及控制,用于从表中取出多行数据,并将多行数据一行一行单独处理 

隐式游标被用于描述执行的SQL命令

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广