我平常用的分页存储过程(效率好高)

--创建包
CREATE OR REPLACE PACKAGE my_pagination
as
    type cur_query is ref cursor;  --返回记录指针
    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 cur_query --返回的结果集
    );
end my_pagination;
--创建包体
create OR REPLACE package body my_pagination
 as
 --创建分页存储过程
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 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;
        OPEN v_cur FOR v_sql;
END prc_query;
end my_pagination;
/
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值