'How can I retrieve multiple sys_refcursor using dapper and c#?

I want to retrieve multiple sys_refcursors from oracle db using dapper. My PL/SQL code below

procedure GetData2 (p_result out sys_refcursor, p_result2 out sys_refcursor)
 is
 begin
   open p_result for
        select '1' col1, '2' col2 from dual
        union all
        select '11' col1, '22' col2 from dual;
        
   open p_result2 for
        select '3' col1, '4' col2 from dual;
 end;

And my c# code is below

using OracleConnection connection = new OracleConnection();
connection.ConnectionString = "";
connection.Open();
    
    
OracleDynamicParameters parameters = new OracleDynamicParameters();
parameters.Add(name: "p_result", dbType: OracleMappingType.RefCursor, direction: ParameterDirection.Output);
parameters.Add(name: "p_result2", dbType: OracleMappingType.RefCursor, direction: ParameterDirection.Output);
    
var reader = connection.QueryMultiple("TEST_PACKAGE.GetData2", param: parameters, commandType: CommandType.StoredProcedure);
    
IEnumerable<MyClasss> dt = reader.Read<MyClasss>();
    
foreach (var item in dt)
{
    Console.WriteLine(item.col1);
}

This c# code only gives me p_result table result. How can I retrieve two sys_refcursor results using dapper?



Solution 1:[1]

You have to call a method to move to the next result in your data reader. The method is called .NextResult(). Try following code:

using OracleConnection connection = new OracleConnection();
connection.ConnectionString = "";
connection.Open();
    
    
OracleDynamicParameters parameters = new OracleDynamicParameters();
parameters.Add(name: "p_result", dbType: OracleMappingType.RefCursor, direction: ParameterDirection.Output);
parameters.Add(name: "p_result2", dbType: OracleMappingType.RefCursor, direction: ParameterDirection.Output);
    
var reader = connection.QueryMultiple("TEST_PACKAGE.GetData2", param: parameters, commandType: CommandType.StoredProcedure);
    
IEnumerable<MyClasss> dt = reader.Read<MyClasss>();
    
foreach (var item in dt)
{
    Console.WriteLine(item.col1);
}
reader.NextResult();

IEnumerable<MyClasss> dt2 = reader.Read<MyClasss>();
    
foreach (var item in dt2)
{
    Console.WriteLine(item.col1);
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Palle Due