Using ODP.NET to get a RECORD from PL/SQL function, without touching PL/SQL code Using ODP.NET to get a RECORD from PL/SQL function, without touching PL/SQL code oracle oracle

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;

SQLfiddle

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