【问题标题】:Kept getting open cursors exceeded with this code使用此代码保持打开游标超出
【发布时间】:2020-03-27 00:57:31
【问题描述】:

这是我不断收到的错误

SQL 错误:ORA-01000:超出最大打开游标 01000. 00000 - “超出最大打开游标”

这是我一直在处理的代码

DROP TABLE STUDENT; 

CREATE TABLE STUDENT 
(
   Student_ID NUMBER(5) NOT NULL ENABLE 
   ,F_NAME VARCHAR2(30) NOT NULL ENABLE 
   ,L_NAME VARCHAR2(30) NOT NULL ENABLE 
   ,HomePhone_Number NUMBER(10) 
   ,Home_Address     VARCHAR2(35) 
   ,City             VARCHAR2(35) 
   ,State            VARCHAR(2) 
   ,Zip_Code         NUMBER(5) 
   ,Spouse_FName     VARCHAR2(25) 
   ,Spouse_LName     VARCHAR2(25) 
   ,Enrolled_ID      NUMBER(10) 
   ,Academic_Advisor_ID NUMBER(5) 
   ,PRIMARY KEY (Student_ID) ENABLE 
); 

DROP TABLE FACULTY; 

CREATE TABLE FACULTY 
(
   Faculty_ID            NUMBER(5) NOT NULL ENABLE 
   ,F_Name               VARCHAR2(30) NOT NULL ENABLE 
   ,L_Name               VARCHAR2(30) NOT NULL ENABLE 
   ,OfficePhone_Numnber  NUMBER(10) 
   ,Office_Number        NUMBER(10) 
   ,PRIMARY KEY (Faculty_ID) ENABLE 
); 

DROP TABLE ADVISOR; 

CREATE TABLE ADVISOR 
(
   Student_ID  NUMBER(5), 
   Faculty_ID  NUMBER(5), 
   Advisor_TYPE VARCHAR2(20) 
); 

--INSERT VALUES INTO STUDENT 

INSERT INTO STUDENT VALUES 
(1,'Emily','Bronte',9542403843,'742 Evergreen Terrace','Springfield','IL',34567,'Jason','Bourne',1001); 

INSERT INTO STUDENT VALUES 
(2,'Alice','Walker',5481354795,'3584 NW 29th St','Mason','FL',17465,'Michael','Myers',1002); 

INSERT INTO STUDENT VALUES 
(3,'Kurt','Vonnegut',5481354796,'14 Blanchfield','Summer','FL',12444,'Jane','Vonnegut',1003); 

INSERT INTO STUDENT VALUES 
(4,'Isaac','Asimov',5481354743,'6754 N Riva Ridge Loop','Evans Mills','NY',13602,'April','Asimov',1004); 

INSERT INTO STUDENT VALUES 
(5,'Thomas','Elliot',5481354799,'6754 W Riva Ridge Loop','Evans Mills','NY',13602,'Sara','Elliot',1005); 

INSERT INTO STUDENT VALUES 
(6,'Louisa','Alcott',5481357117,'6754 S Riva Ridge Loop','Evans Mills','NY',13602,'Freddy','Alcott',1006); 

--INSERT VALUES INTO FACULTY 

INSERT INTO FACULTY VALUES(500,'Marth','Graham'); 
INSERT INTO FACULTY VALUES(501,'Mikhail','Baryshinokov'); 
INSERT INTO FACULTY VALUES(502,'Jerome', 'Robbins'); 
INSERT INTO FACULTY VALUES(503,'Arthur', 'Mitchell'); 
INSERT INTO FACULTY VALUES(504,'Kir','Jooss'); 

--INSERT VALUES INTO ADVISOR 

INSERT INTO ADVISOR VALUES( 1, 500, 'Academic Advisor'); 
INSERT INTO ADVISOR VALUES( 2, 501, 'Academic Advisor'); 
INSERT INTO ADVISOR VALUES( 3, 502, 'Academic Advisor'); 
INSERT INTO ADVISOR VALUES( 4, 503, 'Academic Advisor'); 
INSERT INTO ADVISOR VALUES( 5, 504, 'Academic Advisor'); 
INSERT INTO ADVISOR VALUES( 1, 502, 'Thesis Advisor'); 
INSERT INTO ADVISOR VALUES( 2, 504, 'Thesis Advisor'); 
INSERT INTO ADVISOR VALUES( 3, 503, 'Thesis Advisor'); 
INSERT INTO ADVISOR VALUES( 4, 501, 'Thesis Advisor'); 
INSERT INTO ADVISOR VALUES( 5, 500, 'Thesis Advisor'); 

COMMIT; 

SET AUTOTRACE ON; 

--QUERY : All students under a specific advisor 

SELECT FACULTY.Faculty_ID,FACULTY.F_Name,FACULTY.L_Name,STUDENT.Student_ID,F_Name,L_Name 
FROM STUDENT,FACULTY,ADVISOR 
WHERE (STUDENT.STUDENT_ID = ADVISOR.STUDENT_ID) AND 
(FACULTY.Faculty_ID = ADVISOR.Faculty_ID) 
ORDER BY FACULTY.Faculty_ID; 

CREATE UNIQUE INDEX index_name 
ON ADVISOR(Student_ID,Faculty_ID); 

SET AUTOTRACE ON; 

--QUERY : All students under a specific advisor 

SELECT FACULTY.Faculty_ID,FACULTY.F_Name,FACULTY.L_Name,STUDENT.Student_ID,F_Name,L_Name 
FROM STUDENT,FACULTY,ADVISOR 
WHERE (STUDENT.Student_ID = ADVISOR.Student_ID) AND 
(FACULTY.Faculty_ID = ADVISOR.Faculty_ID) 
ORDER BY FACULTY.Faculty_ID; 

在 Oracle SQL 开发人员的运行脚本上运行后,这是我得到的错误 错误报告 - SQL 错误:ORA-01000:超出最大打开游标 01000. 00000 - “超出最大打开游标” *原因:
*行动: 无法收集统计数据请不确定用户是否具有正确的访问权限。 统计功能要求授予用户对 v_$sesstat、v_$statname 和 v_$session 的选择权。

【问题讨论】:

  • 你能添加更多关于这个问题的上下文吗?你在什么环境下运行这个? select value from v$parameter where name = 'open_cursors'; 的结果是什么我很惊讶这段代码会抛出最大打开游标错误,因为我希望它只使用大约一个游标。查看此数据字典视图以检查是否有任何意外打开的游标:select * from gv$open_cursor order by sid;
  • 完全正确;这里没有任何可疑之处。您发布的代码的哪一部分引发了错误?
  • 错误开始于命令中的第 1 行 - DROP TABLE STUDENT 错误报告 - SQL 错误:ORA-01000: 最大打开游标超过 01000。00000 - “超过最大打开游标” sqldeveloper
  • @Steve 如果一个简单的 DDL 抛出一个打开的游标错误,这意味着您的数据库出现了严重错误。你可以运行select value from v$parameter where name = 'open_cursors'; - 我想知道是否有人降低了像 1 这样可笑的东西的数量。另外,这是 整个 错误消息,还是有消息堆栈?可能有一个数据库触发器失败,导致每个 DDL 失败。如果你有 DBA,我会让他们参与进来。如果这是您自己管理的测试实例,我会尝试重新启动或只是构建一个新数据库。

标签: sql database oracle


【解决方案1】:

Oracle 默认最多可以容纳 300 个 open_cursors。

一种解决方案是增加 open_cursors 计数限制。 这可以通过下面的sql代码来完成

alter system set open_cursors = 2000 scope=both;

这是之前在此链接提出的问题java.sql.SQLException: - ORA-01000: maximum open cursors exceeded 并且问题的描述要广泛得多。

【讨论】:

  • 这可能避免问题,但它可能无法真正解决它。发布的代码非常简单,它不应该生成接近默认打开游标数量的任何地方。
  • 我是 sql 新手,我一直在使用 oracle sql developer,当点击运行脚本按钮时,我会收到错误消息。我创建的每个表以及 from 和 where 部分都出现此错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多