在Finacle中,有时候用户正面临着#34;资源很忙"由于在后端生成的oracle错误导致的错误为"超出最大打开游标"。并不是说这个错误经常发生,但是我们想采取预防措施,这就是为什么我们试图为Finacle工程师生成警报,即我们自己,以便每当游标的最大数量超过某些数据库对象时,我们就可以获得警报。为此,我们需要知道什么是命令,以了解在给定时间为DB对象打开多少游标。有人可以就此事指导我们。
清除我的概念的另一件事是,Oracle是否使用任何默认游标来查询表?因为,我的猜测是这个错误正在产生,因为这个软件的用户数量增加了,并且有很多会话被选择和更新查询打开了同一个数据库对象,这就是开放游标数量增加的原因。
答案 0 :(得分:2)
我猜你在使用之后不会关闭你的游标,例如,我自定义open_cursor
参数以允许用户只有一个打开的游标(oracle使用3个游标来满足自己的需要) :
SQL> conn / as sysdba
Connected.
SQL> alter system set open_cursors=4 scope=memory
2 /
System altered.
SQL> conn hr/hr
Connected.
SQL> var l_cursor refcursor;
SQL> ed
Wrote file afiedt.buf
1 begin
2 open :l_cursor for select 1 from dual;
3* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> var l_cursor1 refcursor;
SQL> ed
Wrote file afiedt.buf
1 begin
2 open :l_cursor1 for select 1 from dual;
3* end;
SQL> /
begin
*
ERROR at line 1:
ORA-01000: maximum open cursors exceeded
如你所见,我面临同样的错误。让我们关闭l_cursor
光标(打印命令显示光标的内容并关闭它),然后再次打开l_cursor1
:
SQL> print l_cursor
1
----------
1
SQL> ed
Wrote file afiedt.buf
1 begin
2 open :l_cursor1 for select 1 from dual;
3* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> print l_cursor1
1
----------
1
正如您所见,Oracle可以成功打开l_cursor1
游标。
作为问题的快速解决方案,您可以使用命令增加open_cursor
参数(系统可能需要其他资源来保持当前性能):
alter system set open_cursors=800 scope=both
我使用scope=memory
,因为我希望这个演示在重新启动数据库服务器后不会影响我的系统。您必须指定scope = both才能在spfile
中保留此参数。但我想你必须检查你的系统,看看你是否已经打开了不再使用的游标。
您猜测" Oracle是否使用任何默认光标来查询表?"确实如此,Oracle使用游标来查询表,您可以确保:
SQL> var l_cursor refcursor;
SQL> ed
Wrote file afiedt.buf
1 begin
2 open :l_cursor for select 1 from dual;
3* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> select * from employees;
select * from employees
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
SQL> print l_cursor
1
----------
1
SQL> select * from employees;
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
EMAIL PHONE_NUMBER HIRE_DAT JOB_ID SALARY
------------------------- -------------------- -------- ---------- ----------
COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
-------------- ---------- -------------
205 Shelley Higgins
...
要获取所有打开的游标,请检查此answer