ora-01000 - 超出最大打开游标错误
Posted
技术标签:
【中文标题】ora-01000 - 超出最大打开游标错误【英文标题】:Ora-01000 - maximum open cursors exceeded error 【发布时间】:2011-01-06 13:36:53 【问题描述】:我在我的 Delphi/Oracle 应用程序中收到以下错误消息“ora-01000 - 超出最大打开游标”。代码如下:
begin
for i := 0 to 150 do
begin
with myADOQuery do
begin
SQL.Text := 'DELETE FROM SOMETABLE';
ExecSQL; -- from looking at V$OPEN_CURSOR a new cursor is added on each iteration for the session
Close; -- thought this would close the cursor but doesn't
end;
end;
end;
我知道我可以通过简单地增加 OPEN_CURSORS 参数的数量来解决问题,但是,我宁愿找到一个解决方案,在执行查询后关闭游标。有什么想法吗?
德尔福 2006 BDS 甲骨文10g
【问题讨论】:
您究竟使用的是什么版本的 10g?我的意思是,应用了哪些补丁集以及补丁号(如果有)? 另外,有一些表触发器吗? 假设您的真实 SQL 基于i
的当前值是否安全,因此每次迭代的SQL 都不同?
【参考方案1】:
阅读 Oracle 支持文档 ID 76684.1 和 ID 2055810.6。我不使用 ADO,但您可能必须想办法告诉它如何配置 Oracle 不缓存语句。
默认的 max_cursor 值通常太低,通常最好增加它,这会使 Oracle 使用更多的内存,但在实际机器上很少出现问题。
删除整个表 TRUNCATE 可能比 DELETE 更好,除非您必须依赖 DELETE 行为(即触发触发器)。
【讨论】:
感谢您在此问题上的帮助。我将 SQL 更改为 TRUNCATE 表,现在一切正常(即没有游标缓存)。 请注意 TRUNCATE 不能回滚,还有其他事情需要注意 - 请仔细阅读文档。【参考方案2】:检查this link。我不是 Oracle 用户,但似乎有一些游标缓存,正如他们所说“调整 OPEN_CURSORS 的最佳建议是不要调整它。将它设置得足够高,您就不必担心它了。”所以我会说即使关闭命令关闭了游标,它仍然保留在缓存中。还有一些提示,如何检查您的当前情况。
【讨论】:
【参考方案3】:尝试改用TADOCommand
组件。
TADOCommand 最常用于 执行数据定义语言 (DDL) SQL 命令或执行 不返回的存储过程 结果集。
或者直接使用TADOConnection.Execute
函数
【讨论】:
【参考方案4】:如果省略 Close 会发生什么?
【讨论】:
您是否需要进行显式提交? 上面的代码是在一个事务中执行的。我希望它在用户确认发布更改时提交。以上是关于ora-01000 - 超出最大打开游标错误的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01000: 超出最大打开游标 - java 代码失败
jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数
Doctrine + Oracle = 超出最大打开游标 (ORA-01000)
使用 Oracle 的 Spring Boot 应用程序 - ORA-01000:超出最大打开游标 - 负载测试期间发生错误