c# - ORA-08103 程序错误

标签 c# oracle stored-procedures odp.net

我在 Oracle 上有一个过程,如果我使用以下代码从 SQL Developer 调用它,它会工作得很好:

VARIABLE x REFCURSOR
exec MY_PROCEDURE('par1', 'par2', 'par3', 'par4' ,:x);
PRINT x;

如果我尝试从我的 .Net 应用程序调用它(使用 ODP.NET),我会收到错误消息:

Oracle.DataAccess.Client.OracleException ORA-08103: object no longer exists

这是我用来调用它的代码:

OracleConnection con = new OracleConnection();
con.ConnectionString = dbConnectionString; //string with the connectio. It is fine because I can connect

OracleCommand cmd = new OracleCommand("MY_PROCEDURE", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;

cmd.Parameters.Add(new OracleParameter("par1", OracleDbType.Varchar2)).Value = var1;
cmd.Parameters.Add(new OracleParameter("par2", OracleDbType.Varchar2)).Value = var2;
cmd.Parameters.Add(new OracleParameter("par3", OracleDbType.Varchar2)).Value = var3;
cmd.Parameters.Add(new OracleParameter("par4", OracleDbType.Varchar2)).Value = var4;

OracleParameter ref_cursor = new OracleParameter();
ref_cursor.OracleDbType = OracleDbType.RefCursor;
ref_cursor.Direction = ParameterDirection.Output;
cmd.Parameters.Add(ref_cursor);

con.Open();

OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{  ...   }

cmd.ExecuteReader 命令实际上“有效”,应用程序异常在 dr.read 上抛出,但如果我检查 dr 对象,在 hasRows 属性我可以看到 ORA-08103: object no longer exists 错误。

有什么问题吗? 一个细节是我有一个类似的过程,它遵循几乎相同的逻辑(返回游标)并且工作正常。

最佳答案

返回游标的查询是否涉及临时表?如果使用 ON COMMIT DELETE ROWS 选项返回涉及临时表的游标,然后在检索到游标数据之前提交事务,则可能搬起石头砸自己的脚。

COMMIT 很容易发生,因为默认情况下 OD​​P.NET 在自动提交模式下工作。

修复它,

  • 关闭自动提交
  • 或使用带有 ON COMMIT PRESERVE ROWS 选项的临时表(而不是 ON COMMIT DELETE ROWS),
  • 或使用常规表格。

关于c# - ORA-08103 程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12477134/

相关文章:

oracle - 使用 Oracle SCN 跟踪修改的行

mysql - 尝试创建一个带有参数并使用 if 语句的存储过程

c# - 派生类型和泛型

c# - 现在 WebServiceHost2Factory 已死,我如何从 WCF 休息服务返回错误文本?

c# - 如何验证自定义 ASP.NET MVC 助手

Oracle 唯一约束和忽略空间的唯一索引

c# - 如何使用 C# 将 jpg 文件转换为位图?

oracle - 为什么我们不能像其他模式对象一样删除引用的类型

sql-server - SSRS 报告呈现的查询计划在哪里

c# - 查询执行速度非常慢,有什么办法可以进一步改进吗?