C#调用Oracle存储过程

Oracle分页存储过程如下:

--注意,在Oracle,存储过程需要放在包下面
create or replace package PKG_split_Page is
TYPE p_cur1 IS REF CURSOR;
PROCEDURE proc_split_page
(
  rowcountPerPage NUMBER,  --每页面记录条数
  indexNowPage NUMBER,       --当前页码
  tabName VARCHAR2,             --分页表名
  totalRows OUT NUMBER,        --总记录数
  totalPages OUT NUMBER,        --总页数
  p_cursor OUT PKG_split_Page.p_cur1     --游标,用于返回结果集

);
end PKG_split_Page;

C#调用存储过程代码如下:

#region 分页代码(返回数据表、总条数、总页数等)
/// <summary>
/// 执行分页 
/// </summary>
/// <param name="tableName">需分页表名(select查询语句)</param>
/// <param name="paeSize">每页记录数</param>
/// <param name="indexNowPage">当前页码</param>
/// <param name="totalRows">引用参数,总记录数</param>
/// <param name="totalPages">引用参数,总页数</param>
/// <returns>分页结果集</returns>
public DataTable Paging(string tableName, int paeSize, int indexNowPage, ref int totalRows, ref int totalPages)
{
    try
    {
        //打开连接
        OpenOracleConnection();
        //定义OracleCommand对象,设置命令类型为存储过程
        OracleCommand pOracleCMD = new OracleCommand("pkg_split_page.proc_split_page", conn);//Oracle里面的(包.存储过程)
        pOracleCMD.CommandType = CommandType.StoredProcedure;//设置执行类型为存储过程
        
        //根据存储过程的参数个数及类型生成参数对象
        OracleParameter p1 = new OracleParameter("rowCountPerPage", OracleType.Number);//rowcountPerPage——每页显示的条数
        OracleParameter p2 = new OracleParameter("indexNowPage", OracleType.Number);//indexNowPage——当前页码
        OracleParameter p3 = new OracleParameter("tabName", OracleType.VarChar);//tabName——表名
        OracleParameter p4 = new OracleParameter("totalRows", OracleType.Number);//totalRows——总记录数(output)
        OracleParameter p5 = new OracleParameter("totalPages", OracleType.Int16);//totalPages——总页数(output)
        OracleParameter p6 = new OracleParameter("p_cursor", OracleType.Cursor);

        //设置参数的输入输出类型,默认为输入
        p1.Direction = ParameterDirection.Input;
        p2.Direction = ParameterDirection.Input;
        p3.Direction = ParameterDirection.Input;
        p4.Direction = ParameterDirection.Output;
        p5.Direction = ParameterDirection.Output;
        p6.Direction = ParameterDirection.Output;

        //对输入参数定义初值,输出参数不必赋值.
        p1.Value = paeSize;
        p2.Value = indexNowPage;
        p3.Value = tableName;

        //按照存储过程参数顺序把参数依次加入到OracleCommand对象参数集合中
        pOracleCMD.Parameters.Add(p1);
        pOracleCMD.Parameters.Add(p2);
        pOracleCMD.Parameters.Add(p3);
        pOracleCMD.Parameters.Add(p4);
        pOracleCMD.Parameters.Add(p5);
        pOracleCMD.Parameters.Add(p6);

        //执行,把分页结果集填入datatable中
        OracleDataAdapter pOracleDataAdapter = new OracleDataAdapter(pOracleCMD);
        DataTable datatable = new DataTable();
        pOracleDataAdapter.Fill(datatable);

        //在执行结束后,从存储过程输出参数中取得相应的值放入引用参数中以供程序调用
        totalRows = int.Parse(p4.Value.ToString());
        totalPages = int.Parse(p5.Value.ToString());

        //关闭连接
        CloseOracleConnection();

        return datatable;
    }
    catch (Exception ex)
    {
        string error = ex.ToString();
        return null;
    }

}
#endregion    

#region 打开连接
/// <summary>
/// 关闭连接
/// </summary>
private void CloseOracleConnection()
{
    if (conn.State == ConnectionState.Open)
    {
        conn.Close();
    }
}
#endregion

#region 关闭连接
/// <summary>
/// 打开连接
/// </summary>
private void OpenOracleConnection()
{
    if (conn.State == ConnectionState.Closed)
    {
        conn.Open();
    }
}
#endregion 


你可能感兴趣的:(oracle,exception,String,C#,存储,output)