oracle 分页存储过程

oracle 分页存储过程

--建立一个包,用户创建一个游标类型
  create or replace package pkg_query as
    type cur_query is ref cursor;
  end pkg_query;
  --创建存储过程
  create OR REPLACE PROCEDURE prc_query
         (p_tableName        in  varchar2,   --表名
          p_strwhere         in  varchar2,   --查询条件 --*
          p_orderColumn      in  varchar2,   --排序的列 --*
          p_orderStyle       in  varchar2,   --排序方式 --*
          p_curPage          in out Number,  --当前页
          p_pageSize         in out Number,  --每页显示记录条数
          p_totalRecords     out Number,     --总记录数 --*
          p_totalPages       out Number,     --总页数
          v_cur              out pkg_query.cur_query)   --返回的结果集
  IS
     v_sql VARchar2(1000) := '';      --sql语句
     v_startRecord Number(4);         --开始显示的记录条数
     v_endRecord Number(4);           --结束显示的记录条数
  BEGIN
     --记录中总记录条数
     v_sql := 'select TO_NUMBER(count(*)) FROM ' || p_tableName || ' where 1=1';
     IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
         v_sql := v_sql || p_strwhere;
     END IF;
     execute IMMEDIATE v_sql INTO p_totalRecords;
  
     --验证页面记录大小
     IF p_pageSize < 0 THEN
         p_pageSize := 0;
     END IF;
  
     --根据页大小计算总页数
     IF MOD(p_totalRecords,p_pageSize) = 0 THEN
         p_totalPages := p_totalRecords / p_pageSize;
     ELSE
         p_totalPages := p_totalRecords / p_pageSize + 1;
     END IF;
  
     --验证页号
     IF p_curPage < 1 THEN
         p_curPage := 1;
     END IF;
     IF p_curPage > p_totalPages THEN
         p_curPage := p_totalPages;
     END IF;
  
     --实现分页查询
     v_startRecord := (p_curPage - 1) * p_pageSize + 1;
     v_endRecord := p_curPage * p_pageSize;
     v_sql := 'select * FROM (select A.*, rownum r FROM ' ||
              '(select * FROM ’ || p_tableName;
     IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
         v_sql := v_sql ||' where 1=1' || p_strwhere;
     END IF;
     IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
         v_sql := v_sql ||' ORDER BY ' || p_orderColumn ||'' || p_orderStyle;
     END IF;
     v_sql := v_sql || ') A where rownum <= ' || v_endRecord ||') B where r >=

              || v_startRecord;
     DBMS_OUTPUT.put_line(v_sql);
     OPEN v_cur FOR v_sql;
  END prc_query;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值