sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo llamar a una función de Oracle con un Ref Cursor como parámetro de salida desde C#?

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;
  1. He descubierto que a las funciones les gusta tener el valor de retorno como EL PRIMERO paraminar la colección
  2. 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