Мисля, че ви липсва sqlCom.ExecuteNonQuery();
също, вместо да стартирате select func_test(7) от dual; позволява да го превключите, за да стартирате функцията и да прехвърлите param
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();}
това се основава на примерния ODP, който може да се намери @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj
Ако искате да избегнете (за по-добро или за най-лошото!) персонализираната колекция от параметри за всяко извикване на proc/function, можете да заобиколите това, като използвате анонимни блокове във вашия код, промених (за пореден път неизпробван!) кода по-горе, за да отрази това, за да го отразите. тази техника. Ето един хубав блог (от никой друг освен Марк Уилямс), показващ тази техника.http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html