【问题标题】:How to read different type of out parameters from oracle stored procedure?如何从 oracle 存储过程中读取不同类型的输出参数?
【发布时间】:2015-07-29 14:26:00
【问题描述】:

我有一个带有两个数字输出参数和一个引用光标的 oracle 存储过程。下面是程序的结构

procedure SearchData
(
    p_search in number
    ,p_pages out number
    ,p_pageNumber out number
    ,p_resultSet out sys_refcursor
)

我需要使用 c# 阅读它们。

【问题讨论】:

  • @Senthil 工作正常吗?

标签: c# oracle stored-procedures


【解决方案1】:

首先你应该为 c# 安装 oracle 客户端 例如:我总是使用

using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;

你需要从oracle网站下载它才能在c#中使用它

然后你可以像下面这样调用程序

   OracleCommand cmd = con.CreateCommand(); //con is the oracle connection
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Connection = con;
    cmd.CommandText = "SearchData";

  OracleParameter p_search = new OracleParameter();
  p_search.OracleDbType = OracleDbType.Int64;
  p_search.Direction = ParameterDirection.Input;
  p_search.Value = .....;

  OracleParameter p_pages = new OracleParameter();
  p_pages.OracleDbType = OracleDbType.Int64;
  p_pages.Direction = ParameterDirection.Output;
  p_pages.Size = 1000;

 OracleParameter p_pageNumber = new OracleParameter();
 p_pageNumber.OracleDbType = OracleDbType.Int64;
 p_pageNumber.Direction = ParameterDirection.Output;
 p_pageNumber.Size = 1000;

 OracleParameter p_resultSet = new OracleParameter();
 p_resultSet.OracleDbType = OracleDbType.RefCursor;
 p_resultSet.Direction = ParameterDirection.Output;

cmd.Parameters.Add(p_search);
cmd.Parameters.Add(p_pages);
cmd.Parameters.Add(p_page_number);
cmd.Parameters.Add(p_resultSet);

con.Open();
cmd.ExecuteNonQuery();

执行后可以调用out参数取值..like

string pages = p_pages.Value.ToString()

如果是引用光标,我们需要使用 oracle 阅读器

OracleDataReader rd = ((OracleRefCursor)cmd.Parameters[3].Value).GetDataReader(); 
//3 is for 4rth parameter bcos parameter index start from 0

然后读取 rd 以获取值..

【讨论】:

    【解决方案2】:

    这就是我满足要求的方式

       //sample result entity 
       public class SearchResult
        {
            public int NumberOfPagesAvailable { get; set; }
            public int CurrentPageNumber { get; set; }
            public IEnumerable<ResultItem> ResultItems { get; set; }
    
        }
    
    
            /// <summary>
            /// Method to Create an output parameter
            /// </summary>
            /// <param name="paramName">The Parameter name</param>
            /// <param name="paramType">Type of the parameter</param>
            /// <param name="value">The value to set</param>
            /// <returns></returns>
            public static OracleParameter CreateOutputParameter(string paramName, OracleDbType paramType, object value)
            {
                var outParam = new OracleParameter(paramName, paramType, ParameterDirection.Output)
                {
                    Value = value ?? DBNull.Value
                };
    
                return outParam;
            }
    
    
            //1     create command
    
            //2     created the params as below     
                OracleParameter pages = OracleHelper.CreateOutputParameter("p_pages", OracleDbType.Int64, null);
                OracleParameter pageNumber = OracleHelper.CreateOutputParameter("p_pageNumber", OracleDbType.Int64, null);
                OracleParameter resultSet = OracleHelper.CreateOutputParameter("p_resultSet");
            //3     execute using oralce command
    
            //4     read the param values as below after executing the command
               if (pages.Value != null)
                {
                    result.NumberOfPagesAvailable = Convert.ToInt32(pages.Value.ToString());
                }
    
                if (pageNumber.Value != null)
                {
                    result.CurrentPageNumber = Convert.ToInt32(pageNumber.Value.ToString());
                }
    
                          if (resultSet.Value != null && result.NumberOfPagesAvailable>0 && result.CurrentPageNumber>0)
                {
                    OracleRefCursor refCursor;
                        using (refCursor = (OracleRefCursor)resultSet.Value)
                        {
                            using (OracleDataReader rdr = refCursor.GetDataReader())
                            {
                               //iterate through the loop and read the values from the reader
    //set ResultItems 
                            }
                        }
                }
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2023-03-12
      相关资源
      最近更新 更多