如何使用c#执行返回多个游标的oracle存储过程

Posted

技术标签:

【中文标题】如何使用c#执行返回多个游标的oracle存储过程【英文标题】:How to execute oracle stored procedure returning multiple cursors using c# 【发布时间】:2014-03-17 10:03:36 【问题描述】:

我正在使用带有 C# 的 OracleClient。 我有一个返回多个游标的存储过程。 我必须将每个游标关联到不同的表。 但是当它试图这样做时,我得到了这个错误。

ORA-24338: statement handle not executed

谁能帮我解决这个问题。

【问题讨论】:

【参考方案1】:

我目前已经实现了这样的代码。所以,让我给你我遵循的步骤。

    在DAC层,我整理了输入参数和输出 存储过程的参数(RefCursors)。

     using (DbCommand objCmd = dbObject.GetSqlStringCommand(queryString))
        
        ...
        objCmd.Parameters.Add("Ref_CursorName1",OracleDbType.RefCursor,ParameterDirection.Output);
        objCmd.Parameters.Add("Ref_CursorName2",OracleDbType.RefCursor,ParameterDirection.Output);
         ...
        connectoinObj.Open();
        objCmd.ExecuteNonQuery();
    

    遍历参数计数。

    for (int i = 0; i < objcmd.Parameters.Count; i++)
         
         if(objcmd.Parameters[i].DbType == DbType.Object)
           
             if(!(OracleRefCursor) objCmd.Parameters[i].Value).IsNull)
                
                  var cursorParam = ((OracleRefCursor) objCmd.Parameters[i].Value).GetDataReader();
               if(cursorParam.HasRows && cursorParam.FieldCount > 0)
                  
                    MapCursors(cursorParam, objcmd.Parameters[i].ParameterName, response); //type of your response object.                          
                  
                
            
          
    

    最后一步是 MapCursors 方法的实现。

    private void MapCursors(OracleDataReader cursorParam, string parameterName, ClassName response)
       
          case "Ref_CursorName1":
               RetriveDataFromRef_CursorName1(cursorParam, response);
               break; 
       
    

    将光标数据映射到对象的数据(响应)。

【讨论】:

【参考方案2】:

OracleClient? System.Data.OracleClient?它已被弃用。不要使用它。

请尝试使用 Oracle 的托管 .NET ODP,可在此处找到(ODAC 12c 及更高版本是 100% 托管代码):http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html

如果这对您没有帮助,请尝试发布更多信息,例如数据库版本、连接器版本等。

【讨论】:

谢谢你的回答,我会用的。

以上是关于如何使用c#执行返回多个游标的oracle存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的存储过程如何返回查询到的多个值?

java中如何获取oracle存储过程返回的多个值。

C# 存储过程 如何返回 tatatable

oracle如何执行存储过程以及如何返回一个table

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

C#显示存储过程返回的游标数据集