ORA-01002: 提取乱序
Posted
技术标签:
【中文标题】ORA-01002: 提取乱序【英文标题】:ORA-01002: fetch out of sequence 【发布时间】:2013-04-19 09:42:14 【问题描述】:当我的应用程序部署在仅服务器上时,而不是在我的本地计算机上运行完全相同的可执行文件时,我收到以下 oracle 错误:
堆栈跟踪指向一个带有连接的简单选择语句,我可以在本地通过TOAD 和在问题服务器上通过SQL Plus 成功执行该语句。
stacktrace 的上半部分是:
Oracle.DataAccess.Client.OracleException ORA-01002: fetch out of sequence
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleDataReader.Read()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
at Reconciliation.Models.Legacy.EntityDbEnvironment.OpenEntity(String sql)
at Reconciliation.Models.Legacy.EntityDbEnvironment.Open(String& sql, DataTable& datatable)
**at myProject.Checks.ExecuteSql()**
我只能想象这是一个 oracle 客户端问题,但我应该从哪里解决这个问题?
【问题讨论】:
你有自动提交吗?如果您尝试通过提交获取游标(您不应在游标循环内提交),则会引发此错误。 @VincentMalgrat - 不是我们相信,连接字符串完全一样,但也许可以在 oracle 客户端上设置? 是的,自动提交只能由客户端设置。该错误不是来自 SQL 语句本身,而是来自游标的错误使用(在返回最后一行后获取,对于 FOR UPDATE 游标,在提交后获取,在重新绑定后获取而不重新执行或在回滚后获取)。跨度> 我做了一些研究,发现To disable Autocommit, call SQLSetConnectOption with the SQL_AUTOCOMMIT_OFF qualifier.
但是我在哪里做呢? ODBC 的文档很差。
【参考方案1】:
我也有这个问题。我的应用程序在一台机器上运行良好,而在另一台机器上完全相同的可执行文件正在获取乱序异常。
我的查询很大,需要几分钟才能运行。它由 COM+ 运行。我意识到我的两个环境的组件服务配置略有不同。失败的环境将事务超时设置为 60 秒,而另一个设置为更多。
要解决这个问题,我只需转到组件服务,右键单击我的电脑、属性、选项,然后增加事务超时。
这很有意义,因为当您尝试访问已关闭的游标时会发生 fetch out of sequence 异常。我知道 COM+ 超时关闭了事务,因此关闭了游标,并抛出了那个 Oracle 异常。
【讨论】:
以上是关于ORA-01002: 提取乱序的主要内容,如果未能解决你的问题,请参考以下文章