Using ODP.NET to get a RECORD from PL/SQL function, without touching PL/SQL code
You need anonymous PL/SQL block to convert function result to another representation:
declare vFooRes FOO_PACKAGE.FOO_RECORD; vRes sys_refcursor;begin vFooRes := FOO_PACKAGE.FOO_FUNCTION; open vRes for select vFooRes.BAR, vFooRes.BAZ from dual; --:result := vRes;end;
And execute it instead of calling stored procedure:
cmd.CommandText = "declare\n" + " vFooRes FOO_PACKAGE.FOO_RECORD;\n" + "begin\n" + " vFooRes := FOO_PACKAGE.FOO_FUNCTION;\n" + " open :result for select vFooRes.BAR, vFooRes.BAZ from dual;\n" + "end;";OracleParameter p = cmd.Parameters.Add( "result", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output );cmd.ExecuteNonQuery();
After executing cmd
you get cursor in result
parameter which can be used to fill dataset:
var adapter = new OracleDataAdapter(cmd);var data = new DataSet("FooDataSet");adapter.Fill(data, "result", (OracleRefCursor)(p.Value));