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