Oracle
 sql >> Database >  >> RDS >> Oracle

Come restituire un RefCursor dalla funzione Oracle?

Penso che ti manchi sqlCom.ExecuteNonQuery();

inoltre, invece di eseguire select func_test(7) da dual; consente di passare per eseguire la funzione e passare il parametro

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

questo si basa sull'esempio ODP che può essere trovato @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj

Se vuoi evitare (nel bene e nel male!) la raccolta di parametri personalizzata per ogni chiamata proc/funzione, puoi aggirarla utilizzando blocchi anonimi nel tuo codice, ho modificato (ancora una volta non testato!) il codice sopra per riflettere questa tecnica. Ecco un bel blog (di Mark Williams) che mostra questa tecnica. http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html