Seguro que puedes. Hay algunos errores de los que hay que tener cuidado, pero aquí hay un caso de prueba
create or replace function testodpRefCursor(
uniqueId IN NUMBER
,resultItems OUT NOCOPY SYS_REFCURSOR) RETURN NUMBER
IS
BEGIN
OPEN resultItems for select level from dual connect by level < uniqueId ;
return 1;
END testodpRefCursor;
- He descubierto que a las funciones les gusta tener el valor de retorno como EL PRIMERO paraminar la colección
- BindByName es por defecto FALSO, por lo que por defecto es BIND BY POSITION
De lo contrario, es bastante sencillo:
OracleCommand cmd = new OracleCommand("TESTODPREFCURSOR", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
// Bind
OracleParameter oparam = cmd.Parameters.Add("ReturnValue", OracleDbType.Int64);
oparam.Direction = ParameterDirection.ReturnValue ;
OracleParameter oparam0 = cmd.Parameters.Add("uniqueId", OracleDbType.Int64);
oparam0.Value = 5 ;
oparam0.Direction = ParameterDirection.Input;
OracleParameter oparam1 = cmd.Parameters.Add("resultItems", OracleDbType.RefCursor);
oparam1.Direction = ParameterDirection.Output;
// Execute command
OracleDataReader reader;
try
{
reader = cmd.ExecuteReader();
while(reader.Read() ){
Console.WriteLine("level: {0}", reader.GetDecimal(0));
}
} ...
Ahora, para obtener más muestras, vaya a su directorio principal de Oracle y busque en las muestras del cursor Ref en ODP.NET
por ejemplo:%oracle client home%\odp.net\samples\4\RefCursor
hth