Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como chamar uma função Oracle com um cursor de referência como parâmetro de saída do c #?


Você com certeza pode. Existem algumas armadilhas para se ter cuidado, mas aqui está um caso de teste
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. Descobri que as funções gostam de ter oReturnValue como O PRIMEIRO paramina a coleção
  2. BindByName é por padrão FALSE, então o padrão é BIND BY POSITION

Caso contrário, é bastante simples:
  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));  
    }

  } ...

Agora, para mais exemplos, vá para o diretório Oracle Home e veja @ the Ref cursor samples in ODP.NET

por exemplo:%oracle client home%\odp.net\samples\4\RefCursor

hth