oracle游标分页

来源:互联网 发布:phpcms v9 小程序源码 编辑:程序博客网 时间:2024/06/05 16:33

1、先建一个包声明一个游标类型

  1. create or replace package pkg_dividepage as  
  2.   type cur_page is ref cursor;   
  3. end pkg_dividepage;  

2、然后创建存储过程 如下:

  1. create or replace procedure proc_dividepage(p_tableName    varchar2, --表名   
  2.                                             p_pageIndex    number, --当前页码   
  3.                                             p_pageSize     number, --每页记录数   
  4.                                             p_pageCount    out number, --总页数   
  5.                                             p_totalCount   out number, --总记录数   
  6.                                             v_cursor       out pkg_dividepage.cur_page, --返回的结果集   
  7.                                             p_where        varchar2, --查询条件   
  8.                                             p_order_key    varchar2, --排序关键字(asc desc)   
  9.                                             p_order_column varchar2 --排序字段   
  10.                                             ) as  
  11.   
  12.   v_pageIndex number;   
  13.   v_pageSize  number;   
  14.   v_startCurs number;   
  15.   v_endCurs   number;   
  16.   v_sql       varchar2(2000);   
  17.   --输出参数可以对其进行运算操作,所以声明为out的参数在此不用定义变量来操作   
  18.   
  19. begin  
  20.   
  21.   v_sql := 'select count(*) from ' || p_tableName; -- ||'where 1=1';   
  22.   
  23.   if p_where is not null or p_where <> '' then  
  24.     v_sql := v_sql || ' where ' || p_where;   
  25.   end if;   
  26.   execute immediate v_sql   
  27.     into p_totalCount; --查询总记录数   
  28.   
  29.   p_pageCount := ceil(p_totalCount / p_pageSize); --计算总页数   
  30.   
  31.   v_pageSize := p_pageSize;   
  32.   
  33.   if v_pageSize < 0 then  
  34.     v_pageSize := 0;   
  35.   end if;   
  36.   
  37.   v_pageIndex := p_pageIndex;   
  38.   
  39.   if v_pageIndex < 0 then  
  40.     v_pageIndex := 1;   
  41.   end if;   
  42.   
  43.   if v_pageIndex > p_pageCount then  
  44.     v_pageIndex := p_pageCount;   
  45.   end if;   
  46.   
  47.   v_startCurs := (v_pageIndex - 1) * v_pageSize + 1;   
  48.   v_endCurs   := v_pageIndex * v_pageSize;   
  49.   
  50.   v_sql := 'select * from (select rownum num,t.* from (select * from ' ||   
  51.            p_tableName;   
  52.   
  53.   if p_where is not null or p_where <> '' then  
  54.     v_sql := v_sql || ' where ' || p_where;   
  55.   end if;   
  56.   
  57.   if p_order_column is not null or p_order_column <> '' then  
  58.     v_sql := v_sql || ' order by ' || p_order_column || ' ' || p_order_key;   
  59.   end if;   
  60.   
  61.   v_sql := v_sql || ') t where rownum<=' || v_endCurs || ')where num>=' ||   
  62.            v_startCurs;   
  63.                        
  64.   open v_cursor for v_sql;   
  65. dbms_output.put_line(v_sql);   
  66. end proc_dividepage;

3、c#绑定游标

 

            OracleConnection conn = new OracleConnection("YourConnectString");

            OracleCommand cmd = new OracleCommand("testpro", conn);
            cmd.CommandType = CommandType.StoredProcedure;
 
            OracleParameter op = new OracleParameter("c", OracleType.Cursor);
            op.Direction = ParameterDirection.ReturnValue; 
            cmd.Parameters.Add(op);
 
            DataSet ds = new DataSet();
            OracleDataAdapter da = new OracleDataAdapter(cmd);
 
            da.Fill(ds,"test");
 
            this.dataGridView1.DataSource = ds.Tables["test"];
转载:http://xzuse.iteye.com/blog/746318
原创粉丝点击