Myslím, že vám chybí sqlCom.ExecuteNonQuery();
také namísto spuštění select func_test(7) z dual; přepněte jej na spuštění funkce a předejte parametr
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();}
toto je založeno na příkladu ODP, který lze nalézt @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj
Pokud se chcete vyhnout (v lepším nebo nejhorším!) vlastní sestavené sbírce parametrů pro každé volání proc/funkce, můžete to obejít použitím anonymních bloků ve vašem kódu, upravil jsem (opět netestováno!) výše uvedený kód, aby odrážel tuto techniku. Zde je pěkný blog (od nikoho jiného než Marka Williamse), který ukazuje tuto techniku.http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html