sql >> Databasteknik >  >> RDS >> Oracle

Hur anropar man en Oracle-funktion med en Ref Cursor som Out-parameter från C#?

Det kan du säkert. Det finns några gotchas att vara försiktig med men här är ett testfall

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. Jag har upptäckt att funktioner gillar att ha returvärdet som DEN FÖRSTA paraminera samlingen
  2. BindByName är som standard FALSE, så det är som standard BIND BY POSITION

Annars är det ganska okomplicerat:

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

  } ...

Gå nu till din Oracle-hemkatalog för fler exempel och titta på referensmarkörexemplen i ODP.NET

till exempel:%oracle-klienthem%\odp.net\samples\4\RefCursor

hth




  1. Initial array i funktion för att aggregera flerdimensionell array

  2. Befolkar trädobjekt med rekordgrupp i Oracle-formulär

  3. Exportera en AWS Postgres RDS-tabell till AWS S3

  4. Använder variabel i en LIMIT-sats i MySQL