ODP.NET调用存储需要使用事务
今天发生在用ODP.NET调整一个存储过程时发生了两个奇怪的错误。
- ORA-08103: object no longer exists
- ora-01410: invalid rowid
网上都说是索引块有错误什么的,我索引也重建,表也重建了,但还是不行。
奇怪的是我直接测试存储过程是有结果的。
后来发现是存储过程中使用了临时表,而我在代码中又没有使用事务,当我加上事务后程序就正常了。 正常的代码像下面这样:
using (var conn = SqlHelper.GetConnection() as OracleConnection) { conn.Open(); var trans = conn.BeginTransaction(); var cmd = conn.CreateCommand(); cmd.CommandText = "PKG_LIMIT_RESULT.OVERVIEW_RESULT_LIST"; cmd.CommandType = CommandType.StoredProcedure; var p1 = new OracleParameter("P_DATA_SET", OracleDbType.RefCursor, ParameterDirection.Output); var p2 = new OracleParameter("P_BEG_DATE", OracleDbType.Varchar2, "2012-10-08", ParameterDirection.Input); var p3 = new OracleParameter("P_END_DATE", OracleDbType.Varchar2, "2012-11-17", ParameterDirection.Input); //..... cmd.Parameters.Add(p1); cmd.Parameters.Add(p2); cmd.Parameters.Add(p3); //....... var reader = cmd.ExecuteReader(); while (reader.Read()) { //Console.WriteLine(reader.GetInt32(0)); } reader.Dispose();
trans.Commit();
}