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

Wie gebe ich einen RefCursor von der Oracle-Funktion zurück?

Ich denke, Sie vermissen die sqlCom.ExecuteNonQuery();

auch statt select func_test(7) from dual; auszuführen schalten wir es um, um die Funktion auszuführen, und übergeben den Parameter

  OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);


  // Set the command

  string anonymous_block = "begin " +
                              "  :refcursor1 := func_test(7) ;" +
                              "end;";  
 //fill in your function and variables via the above example
  OracleCommand sqlCom= con.CreateCommand();
  sqlCom.CommandText = anonymous_block;

  // Bind 
  sqlCom.Parameters.Add("refcursor1", OracleDbType.RefCursor);
  sqlCom.Parameters[0].Direction = ParameterDirection.ReturnValue;

  try 
  {
    // Execute command; Have the parameters populated
    sqlCom.ExecuteNonQuery();

    // Create the OracleDataAdapter
    OracleDataAdapter da = new OracleDataAdapter(sqlCom);

    // Populate a DataSet with refcursor1.
    DataSet ds = new DataSet();
    da.Fill(ds, "refcursor1", (OracleRefCursor)(sqlCom.Parameters["refcursor1"].Value));

    // Print out the field count the REF Cursor
    Console.WriteLine("Field count: " + ds.Tables["refcursor1"].Columns.Count);
  }
  catch (Exception e)
  {
    Console.WriteLine("Error: {0}", e.Message);
  }
  finally
  {
    // Dispose OracleCommand object
    cmd.Dispose();

    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();}

dies basiert auf dem Beispiel-ODP, das unter @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj

zu finden ist

Wenn Sie (im Guten wie im Schlechten!) die benutzerdefinierte Parametersammlung für jeden Proc-/Funktionsaufruf vermeiden möchten, können Sie dies umgehen, indem Sie anonyme Blöcke in Ihrem Code verwenden. Ich habe den obigen Code geändert (wiederum ungetestet!), um ihn widerzuspiegeln diese Technik.Hier ist ein netter Blog (von niemand anderem als Mark Williams), der diese Technik zeigt.http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html