Oracle
 sql >> Database >  >> RDS >> Oracle

Come chiamare una funzione Oracle con un cursore Ref come parametro Out da C#?

Certo che puoi. Ci sono alcuni problemi di cui diffidare, ma ecco un test case

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. Ho scoperto che a funzioni piace avere il valore ReturnValue come IL PRIMO paramin la raccolta
  2. BindByName è per impostazione predefinita FALSE, quindi per impostazione predefinita è BIND BY POSITION

Altrimenti è abbastanza semplice:

  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));  
    }

  } ...

Ora per altri esempi vai alla tua directory Home di Oracle e guarda @ gli esempi del cursore Ref in ODP.NET

ad esempio:%home client Oracle%\odp.net\samples\4\RefCursor

hth