Die*_*ego 5 c# oracle stored-procedures odp.net
我在Oracle上有一个程序,如果我使用这段代码从SQL Developer调用它,它就可以正常工作:
VARIABLE x REFCURSOR
exec MY_PROCEDURE('par1', 'par2', 'par3', 'par4' ,:x);
PRINT x;
Run Code Online (Sandbox Code Playgroud)
如果我尝试从我的.Net应用程序(使用ODP.NET)调用它,我收到错误:
Oracle.DataAccess.Client.OracleException ORA-08103: object no longer exists
Run Code Online (Sandbox Code Playgroud)
这是我用来调用它的代码:
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())
{ ... }
Run Code Online (Sandbox Code Playgroud)
cmd.ExecuteReader命令实际上"工作",应用程序异常被抛出dr.read但是如果我检查dr对象,在hasRows属性上我可以看到ORA-08103: object no longer exists错误.
有什么不对?一个细节是我有一个类似的程序,遵循几乎相同的逻辑(修复光标)并且工作正常.
返回的游标的查询是否涉及临时表?如果使用ON COMMIT DELETE ROWS选项返回涉及临时表的游标,然后在检索游标数据之前提交事务,则可以在脚中射击.
COMMIT很容易发生,因为默认情况下ODP.NET在自动提交模式下工作.
要解决这个问题,
| 归档时间: |
|
| 查看次数: |
3410 次 |
| 最近记录: |