sql >> Database >  >> RDS >> Oracle

Hoe een Oracle-functie aanroepen met een Ref Cursor als Out-parameter van C #?

Dat kan je zeker. Er zijn een paar valkuilen waar je op moet letten, maar hier is een testcase

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. Ik heb ontdekt dat functies de ReturnValue graag als DE EERSTE hebben paramin de collectie
  2. BindByName is standaard FALSE, dus het is standaard BIND BY POSITION

Anders is het vrij eenvoudig:

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

  } ...

Ga nu voor meer voorbeelden naar uw Oracle Home-directory en kijk @ de Ref-cursorvoorbeelden in ODP.NET

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

hde




  1. android.database.CursorIndexOutOfBoundsException

  2. Update het configuratiebestand met uw nieuwe database-instellingen

  3. Hoe maak je een Datetime Format in SQLite

  4. Buitenlandse sleutel toevoegen aan bestaande tabel