ORA-08103程序错误

时间:2012-09-18 12:35:18

标签: c# oracle stored-procedures odp.net

如果我使用此代码从SQL Developer调用它,那么我在Oracle上有一个完美的程序:

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属性上我可以看到{ {1}}错误。

有什么不对? 一个细节是我有一个类似的程序,遵循几乎相同的逻辑(修复光标)并且工作正常。

2 个答案:

答案 0 :(得分:9)

返回游标的查询是否涉及临时表?如果您使用ON COMMIT DELETE ROWS选项返回包含临时表的游标,然后在检索游标数据之前提交事务,则可以自己射击。

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

要修复它,

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

答案 1 :(得分:1)

您还可以为连接创建事务,并在OracleCommand对象中设置事务。

它还会在您检索所有数据之前保持提交。