Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie rufe ich eine Oracle-Funktion mit einem Ref-Cursor als Out-Parameter von C# auf?

Sie können sicher. Es gibt ein paar Fallstricke, vor denen Sie sich in Acht nehmen sollten, aber hier ist ein 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. Ich habe festgestellt, dass Funktionen gerne den Rückgabewert als DEN ERSTEN haben paraminiere die Sammlung
  2. BindByName ist standardmäßig FALSE, also standardmäßig BIND BY POSITION

Ansonsten ist es ganz einfach:

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

  } ...

Weitere Beispiele finden Sie in Ihrem Oracle-Home-Verzeichnis und sehen Sie sich @ die Ref-Cursor-Beispiele in ODP.NET

an

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

hth