Execute an oracle Function that returns a reference cursor in C#

后端 未结 3 599
不知归路
不知归路 2021-01-17 15:15

I have an oracle package with a procedure that has a in out reference cursor. My understanding is that this is pretty standard.

What I didn\'t like is the fact that

相关标签:
3条回答
  • 2021-01-17 15:56

    I know this is quite an old post, but since it took me so long to figure out all of the minutia involved in getting .NET to "fight nice" with Oracle, I figured I'd put this advice out there for anyone else in this sticky situation.

    I frequently call Oracle stored procedures that return a REF_CURSOR in our environment (.NET 3.5 against Oracle 11g). For a function, you can indeed name the parameter anything you'd like, but then you need to set its System.Data.ParameterDirection = ParameterDirection.ReturnValue then ExecuteNonQuery against the OracleCommand object. At that point the value of that parameter will be the ref_cursor that the Oracle function returned. Just cast the value as an OracleDataReader and loop through the OracleDataReader.

    I'd post the full code, but I wrote the data access layer in VB.NET years ago, and the bulk of the code consuming the data access layer (our corporate intranet) is in C#. I figured mixing languages in a single response would be the larger faux pas.

    0 讨论(0)
  • 2021-01-17 16:05

    I have not tested this with a function, but for my stored procedures. I specify the out parameter for the refCursor.

    command.Parameters.Add(new OracleParameter("refcur_questions", OracleDbType.RefCursor, ParameterDirection.Output));
    

    If you are able to get the function to work with the CommandType.Text. I wonder if you can try adding the parameter above except with the direction as:

    ParameterDirection.ReturnValue
    

    I am using Oracle.DataAccess version 2.111.6.0

    0 讨论(0)
  • 2021-01-17 16:08

    I had to go up and down between the question and answers to figure out the full code that works. So I am giving the full code here that worked for me for others -

    var sql = @"BEGIN :refcursor1 := mypackage.myfunction(:param1) ; end;";
    using(OracleConnection con = new OracleConnection("<connection string>"))
    using(OracleCommand com = new OracleCommand())
    {
         com.Connection = con;
         con.Open();
         com.Parameters.Add(":refcursor1", OracleDbType.RefCursor, ParameterDirection.Output);
         com.Parameters.Add(":param1", "param");
         com.CommandText = sql;
         com.CommandType = CommandType.Text;
         com.ExecuteNonQuery();
         OracleRefCursor curr = (OracleRefCursor)com.Parameters[0].Value;
         using(OracleDataReader dr = curr.GetDataReader())
         {
             if(dr.Read())
             {
                 var value1 = dr.GetString(0);
                 var value2 = dr.GetString(1);
             }
         }
     }
    

    Hope it helps.

    0 讨论(0)
提交回复
热议问题