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: 超出最大打开游标

ORA-01000: 超出最大打开游标 - java 代码失败

jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数

Doctrine + Oracle = 超出最大打开游标 (ORA-01000)

使用 Oracle 的 Spring Boot 应用程序 - ORA-01000:超出最大打开游标 - 负载测试期间发生错误

java.sql.SQLException: ORA-01000: 超出打开游标的最大数